Una Newsletter in ASP.NET

Siti dinamici con ASP.NET
Impara a creare siti ed applicazioni Web con Microsoft .NET

Scritto da Luca Ruggiero nella sezione Asp.NET

Concesso in esclusiva a MrWebmaster.it - E' vietata la pubblicazione senza espresso consenso del proprietario

Una Newsletter è un sistema adottato da molti siti per inviare notizie ed aggiornamenti via email ad i propri utenti iscritti al servizio, mediante la registrazione del proprio indirizzo di posta elettronica. La prassi vuole che si metta a disposizione un modulo di registrazione (contenuto in un box, in un popup o in una pagina dedicata) in cui l'utente può inserire il proprio indirizzo email e optare per la registrazione o la cancellazione, in caso non voglia più ricevere email di aggiornamenti su quel sito.

In virtù di quanto appena detto, vediamo come è possibile strutturare il modulo: una TextBox per inserire l'indirizzo email, due RadioButton per optare in favore dell'iscrizione o della cancellazione ed un pulsante di invio. I dati verranno memorizzati in un MDB Access che per il nostro esempio chiameremo database.mdb, composto dalla tabella newsletter a sua volta composta dal solo campo email di tipo Testo (lunghezza standard 50).

Utilizzeremo ADO tradizionale per implementare il servizio: si prenda quindi spunto dagli insegnamenti teorici del capitolo 9 della guida ad ASP.NET di questo sito per lavorare con ADO.

Il concetto della registrazione e della cancellazione: verificheremo in primo luogo che l'indirizzo email sia corretto, dopo di che verificheremo che l'utente ha scelto la via dell'iscrizione o della cancellazione; verificheremo in ambo i casi che l'indirizzo email effettivamente esista, e solo in caso positivo effettueremo l'operazione di inserimento o cancellazione del record dal database.

Di seguito il codice commentato del file index.aspx che permette agli utenti di effettuare la registrazione e/o la cancellazione:

<%@ Page Language="VB" ValidateRequest="false" %>
<%@ Assembly Name="ADODB" %>
<%@ Import Namespace="ADODB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
<script runat="server">
    Private Sub Newsletter(sender As Object, e As EventArgs)
        ' Espressione regolare indirizzo email in ASP.NET
        Dim re As New Regex("(?<user>[^@]+)@(?<host>.+)")

        ' Controllo che l'email inserita sia valida
        If re.IsMatch(Email.Text) = False Then
            Messaggio.Text = "Inserisci un indirizzo email corretto"
            Exit Sub
        End If

        ' Dichiaro la connessione ed il recordset
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset

        ' Apro la connessione
        cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" _
        & Server.MapPath("database.mdb"))

        ' Apro il recordset e verifico se l'email inserita esiste o meno
        rs.Open("SELECT email FROM newsletter WHERE email LIKE '" _
        & Email.Text & "'", cn, 1)

        ' Se l'utente decide di iscriversi...
        If I.Checked Then
            If rs.EOF Then
                ' ... se l'email non esiste effettuo la registrazione
                cn.Execute("INSERT INTO newsletter (email) VALUES ('" & Email.Text & "')")
                Messaggio.Text = "Registrazione effettuata con successo"
            Else
                ' ... oppure lancio un messaggio di avviso
                Messaggio.Text = "Sei già iscritto alla Newsletter"
            End If
            rs.Close()
            cn.Close()
            Exit Sub
        End If

        ' Se l'utente decide di cancellarsi...
        If C.Checked Then
            If rs.EOF Then
                ' ... se l'email non esiste lancio un messaggio di avviso
                Messaggio.Text = "Impossibile cancellare un indirizzo inesistente"
            Else
                ' ... oppure effettuo la cancellazione
                cn.Execute("DELETE * FROM newsletter WHERE email LIKE '" & Email.Text & "'")
                Messaggio.Text = "Cancellazione effettuata con successo"
            End If
            rs.Close()
            cn.Close()
            Exit Sub
        End If
    End Sub
</script>
<html>
    <head>
        <title>Una Newsletter in ASP.NET</title>
        <basefont size="2" face="Verdana">
    </head>
<body>

<center>

<h1>NEWSLETTER</h1>

<form id="Modulo" runat="server">
    <asp:TextBox id="Email" runat="server" MaxLength="50" Text="Tua email..." /><br><br>
    <asp:RadioButton id="I" GroupName="Azione" runat="server" Text="Iscriviti" checked="true" />
    <asp:RadioButton id="C" GroupName="Azione" runat="server" Text="Cancellati" /><br><br>
    <asp:Button runat="server" Text="   OK   " OnClick="Newsletter" /><br><br>
    <asp:Label id="Messaggio" runat="server" />
</form>

</center>

</body>
</html>
E' ovvio che l'invio di una Newsletter è una pratica destinata al Webmaster (o Amministratore) del sito e la sezione che permette l'invio in automatico a tutti gli iscritti dev'essere protetta per evitare che chiunque possa adoperarla.

La soluzione consigliata è quella di creare una vera e propria area riservata, sia in stile ASP tradizionale che con i mezzi messi a disposizione da Microsoft e/o dalla piattaforma .NET; per il nostro esempio utilizzeremo un sistema che non amo particolarmente, tuttavia abbastanza sicuro. Il file newsletter.aspx è oggetto della prossima discussione.

Al caricamento di pagina apparirà solo una TextBox che chiede una password statica, nel senso che è impostata stesso dallo sviluppatore ed utile a restituire una condizione vera; nel nostro esempio la password è demo.

Una volta verificatasi la condizione, ovvero il riconoscimento da parte dello script di un utente autorizzato, verrà mostrato il modulo di invio che richiede i campi Oggetto e Corpo; una volta inviati i dati verranno estratti dal database tutti gli indirizzi email degli iscritti e formattati nel campo Bcc (copia carbone con destinatari invisibili) dello script che invia la mail.

Di seguito il codice commentato:
<%@ Page Language="VB" ValidateRequest="false" %>
<%@ Assembly Name="ADODB" %>
<%@ Import Namespace="ADODB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Web.Mail" %>
<script runat="server">
    Private Sub Login(sender As Object, e As EventArgs)
        ' CAMBIA LA PASSWORD!!!
        If Password.Text = "demo" Then NL_Box.Visible = True
    End Sub

    Private Sub Newsletter(sender As Object, e As EventArgs)
        ' Dichiaro la connessione ed il recordset
        Dim cn As New ADODB.Connection
        Dim rs As New ADODB.Recordset

        ' Eseguo un basilare controllo sui campi
        If Oggetto.Text = "" Or Corpo.Text = "" Then
            Messaggio.Text = "I campo Oggetto e Corpo sono obbligatori"
            Exit Sub
        End If

        ' Apro la connessione
        cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" _
        & Server.MapPath("database.mdb"))

        ' Estraggo tutti gli indirizzi email dal database
        rs.Open("SELECT email FROM newsletter", cn, 1)

        Dim destinatari As String

        ' Memorizzo in una variabile le email estratte in precedenza
        While rs.EOF = False
            destinatari += rs("email").Value & ","
            rs.MoveNext()
        End While

        ' Invio la Newsletter
        Dim mail As New MailMessage
            ' Inserisci qui il tuo indirizzo email
            mail.From = "user@account.ext"
            ' Inserisci ANCHE qui il tuo indirizzo email
            mail.To = "user@account.ext"
            mail.Bcc = destinatari
            mail.Subject = Oggetto.Text
            mail.Body = Corpo.Text

            SmtpMail.SmtpServer = "smtp.fastwebnet.it"
            SmtpMail.Send(mail)

            Messaggio.Text = "Newsletter inviata con successo"

        rs.Close()
        cn.Close()
    End Sub
</script>
<html>
    <head>
        <title>Una Newsletter in ASP.NET</title>
        <basefont size="2" face="Verdana">
    </head>
<body>

<center>

<h1>NEWSLETTER</h1>

<form id="Modulo" runat="server">
    <center>
        <asp:TextBox id="Password" runat="server" TextMode="Password" />
        <asp:Button runat="server" Text="Login" OnClick="Login" /><br><br>
    </center>
    <table width="500" align="center" id="NL_Box" runat="Server" Visible="false">
        <tr>
            <td>
                <hr>
                Oggetto<br>
                <asp:TextBox id="Oggetto" runat="server" Width="100%" /><br>
                Corpo<br>
                <asp:TextBox id="Corpo" runat="server" Width="100%" Height="150px" TextMode="MultiLine" />
                <p align="right"><asp:Button runat="server" Text="Invia" OnClick="Newsletter" /></p>
                <p align="center"><asp:Label id="Messaggio" runat="server" /></p>
            </td>
        </tr>
    </table>
</form>

</center>

</body>
</html>
Da notare la riga di codice (HTML) che inizializza la tabella che contiene il modulo
<table width="500" align="center" id="NL_Box" runat="Server" Visible="false">
a cui viene assegnato un ID, la si dichiara come oggetto server e si imposta nascosta; la tabella sarà resa visibile all'atto del riconoscimento dell'utente autorizzato mediante immissione della password.

I più cliccati della sezione Asp.NET

:: Guida base ad Asp.NET (57.290)

:: I Validation Controls di Asp.NET (29.531)

:: Utilizzo delle QueryString con Asp.NET e C Sharp (23.719)

:: Visualizzare i record di un database Access con Asp.NET (21.261)

:: Un Guestbook in ASP.NET, Access e ADO (18.818)

:: Inviare email con Asp.NET: il Namespace System.Web.Mail (18.165)

:: Gestione delle News in ASP.NET (13.467)

:: Inserire dati in un database Access con Asp.NET (11.854)

:: Upload di file in Asp.NET e Javascript (11.530)

:: Risolvere un indirizzo IP ed individuare nome macchina e dominio in Asp.NET (10.106)

IN EVIDENZA
DOWNLOAD