Sappiamo bene quanto una buona campagna di Email marketing possa risultare efficace nella promozione dei propri servizi o prodotti.
In rete è possibile trovare diversi software che eseguono spedizioni di email verso diversi destinatari. In questo articolo vedremo come poter creare un piccolo software web per email marketing con Asp.Net, ovvero come poter spedire le nostre email pubblicitarie direttamente dal nostro sito senza dover utilizzare software di terze parti.
Ecco come agirà, nel dettaglio, il nostro software web:
-
Recupererà da un database MsAccess gli indirizzi email (questa volta usiamo Access, ma l'esempio può essere commutato per SQLServer)
-
Spedirà 50 messaggi alla volta con pause da 15 minuti ogni spedizione marcando i messaggi già spediti
-
A spedizione ultimata verso tutti gli indirizzi, resetterà le marcature per spedizioni future.
Creiamo il database degli indirizzi email
Prima di iniziare è necessario avere un database dal quale recuperare i nostri indirizzi email.
Il database può essere acquistato tramite aziende che forniscono questo tipo di servizio, oppure può essere il frutto di registrazioni utenti tramite il proprio sito. La cosa importante è che contenga un campo "E-mail" ed un campo "Spedito", come nell'immagine allegata.

Creiamo la pagina che eseguirà la spedizione dei messaggi di posta elettronica
la pagina che eseguirà le procedure essenziali ovvero quelle per la spedizione dei messaggi, dovrà contenere, all'interno del codice HTML, un meta tag "refresh". In questo modi sarà possibile effettuare spedizioni ogni 15 minuti.
Utilizziamo questo trucco in modo da non essere confusi per spam, infatti tutti i gestori di servizi internet impostano dei parametri tempo/numero al di fuori dei quali puoi essere identificato come spam, in parole povere, in un determinato arco temporale (dai 15 minuti a circa 1 ora) puoi spedire solo un certo numero di email (da 50 a 100) se non vuoi diventare uno spammer.
quindi detto questo inseriremo il seguente metatag all'interno del <head> della nostra pagina che chiameremo "defaul.aspx" (che fantasia...)
<meta http-equiv="Refresh" content="900" />
equivalente ad un refresh della pagina ogni 15 minuti
Ora nel code behind della nostra pagine creiamo una funzione che restituisce il valore massimo contenuto all'interno della colonna "ID".
Protected Function MaxValueFields(ByVal ConString As String) As Object
Dim d As Object
Dim con As New OleDbConnection(ConString)
Dim com As New OleDbCommand("SELECT (MAX(id)) FROM Indirizzi WHERE (spedito = false)", con)
Dim da As New OleDbDataAdapter(com)
Dim dt As New DataTable
con.Open()
da.Fill(dt)
con.Close()
If dt.Rows(0).Item(0).ToString = String.Empty Then
d = Nothing
Else
d = dt.Rows(0).Item(0)
End If
Return d
con.Dispose()
com.Dispose()
da.Dispose()
dt.Dispose()
End Function
Questa funzione apparentemente inutile ci servirà all'interno dell'evento PageLoad della pagina, che andremo a vedere subito.
Come già detto la nostra pagina eseguirà operazioni di spedizione messaggi verso 50 indirizzi email ogni 15 minuti. Quindi è necessario inserire il nostro codice all'interno dell'evento PageLoad della pagina stessa.
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
'stringa di connessione al database
Dim conString As String = "Provider=Microsoft.jet.OLEDB.4.0; Data Source=|DataDirectory|database.mdb"
'recupero il valore più alto del campo ID
Dim maxValue As Integer = MaxValueFields(conString)
'stringa per il recupero dei 50 record
Dim selString As String = String.Format("SELECT * FROM Indirizzi WHERE (id BETWEEN {0} AND {1})", maxValue - 50, maxValue)
'stringa per l'aggiornamento dei 50 record confermando la spedizione
Dim updString As String = String.Format("UPDATE Indirizzi SET spedito = true WHERE (id BETWEEN {0} AND {1})", maxValue - 50, maxValue)
If maxValue <= 0 Then Response.Redirect("~/finito.aspx")
'estraggo i 50 indirizzi dal database e li rovescio in un datatable
Dim dt As New DataTable("indirizzi")
Dim con As New OleDbConnection(conString)
Dim da As New OleDbDataAdapter(selString, conString)
da.Fill(dt)
da.Dispose()
'creo la mail da spedire
Dim myMail As New System.Net.Mail.MailMessage()
Dim SMTP As New System.Net.Mail.SmtpClient
SMTP.Host = "smtp.miosmtp.it"
myMail.IsBodyHtml = True
myMail.From = New System.Net.Mail.MailAddress("mioindirizzo@miosito.it")
myMail.Subject = "spedizione mail marketing"
'come corpo è possibile anche caricare in file html esterno
myMail.Body = "messaggio da spedire
questo messaggio è formattato in HTML"
'spedisco la mail saltando eventuali indirizzi scritti
'in maniera non corretta
For Each dr As DataRow In dt.Rows
On Error Resume Next
myMail.To.Clear()
If dr("e-mail").ToString <> "" Then
myMail.To.Add(dr("e-mail").ToString)
End If
SMTP.Send(myMail)
Next
'scrivo lo stato
Response.Write(String.Format("Sto processando i record da {0} a {1}", maxValue - 50, maxValue))
'imposto come spediti i valori dei record già processati
Dim com As New OleDbCommand(updString, con)
con.Open()
com.ExecuteNonQuery()
con.Close()
'faccio un po' di pulizia
myMail.Dispose()
SMTP = Nothing
con.Dispose()
com.Dispose()
dt.Dispose()
End Sub
In questo esempio ho utilizzato del semplice testo HTML come corpo della email, ma possiamo tranquillamente usare codice HTML piu complesso o se vogliamo caricare una vera pagina HTML tramite uno StremReader.
Ad ogni ciclo di spedizione, il nostro software marca gli indirizzi utilizzati come spediti, così quando l'algoritmo si renderà conto che tutti gli indirizzo sono stati sfruttai per la spedizione, reindirizzerà automaticamente ad una pagina di conclusione denominata "finito.aspx" (anche qui una fantasia allarmante...)
Ora creiamo la pagina di conclusione
Questa pagina può non contenere nessun tag HTML, l'importante è che al suo avvio resetti tutte le marcature degli indirizzi presenti all'interno del database. Ecco un esempio del codice da inserire all'interno della pagina "finito.aspx".
Protected Sub Page_Load(sender As Object, e As System.EventArgs)
'riporto il database alla normalità
Dim con As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.jet.OLEDB.4.0; Data Source=|DataDirectory|database.mdb")
Dim com As New System.Data.OleDb.OleDbCommand("UPDATE Indirizzi SET spedito = false", con)
con.Open()
com.ExecuteNonQuery()
con.Close()
con.Dispose()
com.Dispose()
Response.Write("finito")
End Sub
anche questa funzione viene eseguita all'interno dell'evento PageLoad della pagina.
Una volta resettati tutti i marcatori degl'indirizzi, questi potranno essere utilizzati per una nuova spedizione.
Conclusioni
Ovviamente, questa è solo una piccola soluzione fatta in casa per offrire un servizio di email marketing tramite il proprio sito internet. L'esempio completo potete scaricarlo da qui.
Sicuramente è possibile ottenere lo stesso risultato con operazioni diverse, ma valeva la pena scrivere questo articolo, in modo che chiunque possa sfruttare questa capacità di Asp.net.
In rete è possibile trovare software ben più completi capaci di gestire anche gli indirizzi non più esistenti e quantificare le email compromesse o inattive, un esempio e SendBluster