Contatta Lovato Damiano via mail
|  HOME  |  CURRICULUM  |  PROGETTI  |  GUESTBOOK  |          
 
SISTEMA DI INVIO NEWSLETTER UTILIZZANDO ACCESS
Struttura sistema invio newsletter con Access

Ho sempre visto abbastanza di buon occhio i sistemi newsletter che girano su server web tuttavia mi sono cimentato nella creazione di questo sistema che utilizza access per alcuni motivi che ritenevo importanti.

Il sistema di invio mail doveva essere solamente una funzionalità di un progetto più ampio che aveva il compito di gestire una anagrafica; i dati presenti nell' anagrafica non dovevano essere esposti su un server esterno; la velocità e la versatilità con cui era possibile gestire i dati nel database era fondamentale , ed ancora più importante di tutto questo era la possibilità di personalizzare alle specifiche esigenze la struttura del database ed i controlli in fase di imputazione dei dati.

Descriverò qui di seguito solamente come è possibile inviare una newsletter tramite access riportando solamente il codice di maggiore interesse.

Qui a lato è riportato in maniera semplificata il flusso logico del codice utilizzato per l'invio.

Nell' immagine in basso la maschera tramite la quale vengono inviate le mail; come è possibile vedere sono state aggiunte altre funzionalità quali il richiamo di specifiche configurazioni per l'invio; la stima del tempo rimanente al completamento del lavoro; la generazione di un report riportante le problematiche incontrate durante l'invio; la possibilità di creare il corpo del messaggio dalla maschera, importarlo da file oppure da URL.


GUI invio newsletter tramite access


Qui sotto la porzione di codice di maggiore importanza in quanto esegue la creazione dell' oggetto utilizzando la libreria CDO e provvede all' invio della mail. Per l'utilizzo della libreria è necessario in ogni caso selezionarla accedendo dalla finestra dell' editor di Visual Basic al menù 'Strumenti' quindi 'Riferimenti' e spuntando quindi 'Microsoft CDO for Windows 2000 Library'.

Set objMessage = CreateObject("CDO.Message")
' Creare l'oggetto del messaggio
objMessage.Subject = MessaggioOggetto
' Creare il mittente del messaggio
objMessage.From = MessaggioDa
' Creare il destinatario del messaggio
objMessage.To = MessaggioA
' Nel caso in cui sia stato indicato un destinatario in carta carbone lo aggiungiamo
If Not (IsNull(MessaggioCC) Or (MessaggioCC = "")) Then
  objMessage.CC = MessaggioCC
End If
' Nel caso in cui sia stato indicato un destinatario in carta carbone nascosta lo aggiungiamo
If Not (IsNull(MessaggioBCC) Or (MessaggioBCC = "")) Then
  objMessage.BCC = MessaggioBCC
End If
' Crea il corpo del messaggio importandolo da file
objMessage.CreateMHTMLBody FileCorpoMessaggio.Value
' Nel caso in cui si voglia inserire un immagine da rendere embedded
If Not (IsNull(PathImgHead.Value) Or (PathImgHead.Value = "")) Then
  If FileExists(PathImgHead.Value) = True Then
    NomeFile = Mid(PathImgHead.Value, InStrRev(PathImgHead.Value, "\") + 1)
    objMessage.AddRelatedBodyPart PathImgHead.Value, NomeFile, cdoRefTypeId
  End If
End If
' Nel caso in cui si volgia inviare un file in allegato alla mail
If Not (IsNull(MessaggioFileAllegato) Or (MessaggioFileAllegato = "")) Then
  objMessage.AddAttachment MessaggioFileAllegato
End If
' Impostazione della configurazione del server SMTP *************************************************************

' Imposta il metodo di invio del messaggio pickup=1 port =2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
' Nome (DNS) o IP del server attraverso il quale spedire la posta
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = IpServer
' Impostazione del metodo di autenticazione NONE=0, Basic=1, NTLM=2
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
' Impostazione del nome utente per l'autenticazione
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = Utente
' Impostazione della password di autenticazione
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = Password
' Impostazione della porta del server SMTP (di solito è la 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
' Utilizza SSL per la connessione (False o True)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
' Time out concesso per stabilire una connessione valida con il servere SMTP
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
' Aggiorna la configurazione
objMessage.Configuration.Fields.Update
' Tenta di inviare il messaggio
objMessage.Send

Qui sotto la funzione da assegnare al pulsante "Sfoglia" per la scelta del file da allegare alla mail; una volta selezionato il file il codice ne inserisce nome e percorso nella casella di testo "FileAllegato". Il metodo utilizzato dai pulsanti "Sfoglia" per la selezione dell'immagine da rendere embedded e per l'importazione del corpo del messaggio è il medesimo.

Private Sub SfogliaFileAllegato_Click()
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "Seleziona file da allegare"
.Filters.Clear
.Filters.Add "All Files", "*.*"
.Filters.Add "Pdf", "*.pdf"
.Filters.Add "Zip", "*.zip"
.Filters.Add "JPEG", "*.jpg"
.Filters.Add "Bitmap", "*.bmp"
.Filters.Add "Access", "*.mdb"
.Filters.Add "Excel", "*.xls"
.Filters.Add "Word", "*.doc"
.Filters.Add "Testo", "*.txt"
.FilterIndex = 2
.AllowMultiSelect = False
.InitialFileName = CurrentProject.Path
If (.Show <> 0) Then
  FileAllegato.Value = Trim(.SelectedItems.Item(1))
End If
End With
End Sub

Qui sotto il codice inizializza la variabile "FermaInvio" come Boolean; tramite il pulsante di arresto che ne setta il valore a True il ciclo Do Loop viene interrotto.

Dim FermaInvio As Boolean
Private Sub Arresta_Click()
  FermaInvio = True
End Sub
..............
..............
..............
Set RecordsetIndirizzi = CurrentDb.OpenRecordset("SELECT * FROM Indirizzi", dbOpenDynaset)
If RecordsetIndirizzi.RecordCount <> 0 Then
  RecordsetIndirizzi.MoveFirst

  Do Until RecordsetIndirizzi.EOF And (FermaInvio = False)
  ' Verifica se la variabile contenente il comando di arresto è settata su True; se si esci dal ciclo DO-LOOP
  DoEvents
  If FermaInvio = True Then
    Exit Do
  End If
..............
..............
  RecordsetIndirizzi.MoveNext
  Loop


Risulta anche possibile analizzare il bounce con apposito codice in grado di scansionare file con estensione eml ricercando l'indirizzo mail ed il problema connesso al mancato recapito provvedendo a inserire i dati raccolti in una apposita tabella e rinominando le mail già analizzate.