Connessione al database con Visual Basic NET? Lo trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
Inviare le email (Tutorial completo)

Quest'articolo guiderà lungo il percorso che permette di creare un semplicissimo programma per l'invio dei messaggi di posta elettronica. Semplicissimo poichè non si tratta certo di un Eudora o di un Outlook Express... Ci limiteremo infatti ad inviare email di solo testo.
Siccome il lavoro da compiere non è difficile ma abbastanza lungo, cominciamo senza tanti discorsi preliminari.

Bisognerà innanzitutto aprire un nuovo progetto EXE Standard. Verrà creata una form denominata per default Form1.
Come già abbiamo visto per il ricevitore del segnale orario dal server sarà necessario importare il controllo Microsoft Winsock. Per far ciò sarà necessario andare sul menu principale di Visual Basic e selezionare la voce Progetto. Dal menu a discesa che comparirà scegliere a questo punto Componenti. Apparirà dunque una finestra con tutti i controlli o i gruppi di controlli disponibili.
Contrassegnare col segno di spunta la voce Microsoft Winsock Control e premere il tasto "Applica".
Una volta chiusa la finestra, il controllo sarà disponibile sulla sinistra, nella sezione Generale dell'applicazione Visual Basic.
Bisognerà allora semplicemente trascinare il controllo sul piano.
Adesso sarà necessario aggiungere ulteriori controlli per gestire l'applicazione in fase di invio della posta. A questo scopo dovremo aggiungere cinque caselle di testo o TextBox, tre pulsanti o CommandButton e quattro etichette o Label.
Il risultato dovrebbe essere più o meno quello mostrato dalla figura sottostante:


Adesso modifichiamo il titolo dei vari controlli attraverso la proprietà Caption di ognuno di essi. Label1 ad esempio potrebbe essere denominato "Server", Label2 "Da :", Label3 "A :" mentre Label4 potrebbe prendere il nome "Oggetto :".
Per questioni di allineamento, è sempre possibile ridimensionare i controlli Label oppure modificarne la proprietà Alignment. Così come abbiamo fatto per le etichette, cambiamo il titolo ai pulsanti. Chiamiamo Command1 "Nuovo", Command2 "Invia" e Command3 "Chiudi".
Impostiamo per tutte le cinque TextBox presenti sul piano, la proprietà Text a "" (stringa vuota) in modo da non visualizzare alcun testo all'apertura dell'applicazione.
Ecco cosa otterremo:


Adesso occupiamoci del pulsante "Nuovo", col quale annulliamo tutte le impostazioni eventualmente accumulate in precedenza e cancelliamo tutti i dati dalla caselle di testo:

Private Sub Command1_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
End Sub

Adesso possiamo passare al pulsante "Chiudi" col quale termineremo l'applicazione. Non includiamo un pulsante per la chiusura delle comunicazioni tra l'applicazione ed il server in quanto il processo di invio richiede pochissimi secondi (si tratta di messaggi di solo testo): sarebbe quindi un procedimento inutile:

Private Sub Command3_Click()
Unload Me
End Sub

Terminato questo lavoro di preparazione, possiamo concentrarci sul vero e proprio motore dell'applicazione. Prima di tutto è necessario sapere che per poter inviare dei messaggi di posta elettronica, è necessario utilizzare delle istruzioni in una sequenza ben precisa. Proprio per tracciare questa sequenza, verrà utilizzata una variabile m_State, al cui interno verrà immagazzinato lo stato corrente della sessione SMTP. Stato della sessione che non è altro che un'attesa da parte dell'applicazione di una risposta del server all'invio di un comando da parte dell'applicazione stessa. Quindi la quantità di stati dipende dalla quantità di comandi inviati.

Private Enum SMTP_State
MAIL_CONNETI
MAIL_MITTENTE
MAIL_DA
MAIL_A
MAIL_DATA
MAIL_CORPO
MAIL_FINE
End Enum

Aggiungiamo dunque nella sezione delle dichiarazioni generali del codice, la succitata variabile m_State che prenderà il valore di uno degli stati elencati nella struttura SMTP_State appena vista:

Private m_State As SMTP_State

ed ora ci possiamo concentrare sull'evento Click di Command1 cioè del pulsante "Connetti". Innanzitutto diciamo che il controllo Winsock si deve connettere al server indicato dalla casella di testo TextBox1. Per evitare che la presenza di spazi vuoti non permetta a Winsock di connettersi al server, elidiamo tali spazi vuoti sia all'inizio che al termine della stringa contenuta in TextBox1:

Winsock1.Connect Trim$(Text1.Text), 25

dove 25 è il numero della porta alla quale bisognerà connettersi. 25 è la porta di default per le connessioni SMTP.
Infine assegnamo alla variabile m_State lo stato "Connesso":

m_State = MAIL_MITTENTE

Attraverso queste poche linee di codice abbiamo creato una connessione tra la nostra applicazione ed il server. Adesso bisogna pensare al trasferimento dei dati tramite l'evento DataArrival di Microsoft Winsock.
Tale evento ci permette di conoscere le eventuali risposte del server.
Innanzitutto dichiariamo le variabili:

Dim strRispostaServer As String
Dim strCodiceRisposta As String
Dim strDatiDaInviare As String

Come già abbiamo detto nella lezione riguardante l'applicazione che recupera dal server l'ora e la data esatte, i dati scaricati dal server vengono memorizzati nel buffer cioè in un'area di memoria usata specificatamente per conservare temporaneamente i dati da trasferire ad un determinato dispositivo. Attraverso il metodo GetData, tali informazioni vengono prelevate dal buffer e posti in una stringa di testo.
I dati che inizialmente ci interessa scaricare sono quelli relativi al codice della risposta, che ci indica se il precedente comando che abbiamo inviato è stato ricevuto ed accettato dal server. Il codice della risposta è formato ad esempio dai primi tre simboli della stringa che abbiamo in risposta dal server. Prima però recuperiamo la risposta dal buffer:

Winsock1.GetData strRispostaServer

e da essa estrapoliamo il codice di risposta attraverso la funzione Left che prende i primi tre caratteri dalla stringa:

strCodiceRisposta = Left(strRispostaServer, 3)

Se a questo punto i primi tre caratteri sono uguali a 250 o a 220 o a 354, allora il comando che abbiamo inviato al server è stato accettato:

If strCodiceRisposta = "250" Or strCodiceRisposta = "220" Or _
strCodiceRisposta = "354" Then

Adesso che il segnale che abbiamo inviato al server è stato accettato ricontrolliamo lo stato della connessione. Se lo stato precedente era di connessione al server, lo stato passa da MAIL_CONNETTI a MAIL_MITTENTE:

Select Case m_State
Case MAIL_CONNETTI
m_State = MAIL_MITTENTE

quindi possiamo passare al primo procedimento: l'invio del nome del mittente, che consiste nell' immagazzinare i dati da inviare nella variabile DatiDaInviare, togliendo con la funzione Trim$ gli spazi vuoti dalla stringa inclusa in TextBox2:

strDatiDaInviare = Trim$(TextBox2.Text)

dall'indirizzo email recuperiamo il nome che viene prima del simbolo " @ ":

strDatiDaInviare = Left$(strDatiDaInviare, InStr(1, strDatiDaInviare, "@") - 1)

ed infine inviamo i dati del mittente:

Winsock1.SendData "MITTENTE " & strDatiDaInviare & vbCrLf

Se lo stato è MITTENTE, il passo successivo consisterà nel modificarlo in DA:

Case MAIL_MITTENTE
m_State = MAIL_DA

qui la variabile DatiDaInviare non necessita di alcuna modifica (tranne la funzione Trim per eliminare gli spazi vuoti), si invia semplicemente l'indirizzo di posta del mittente:

Winsock1.SendData "DA:" & Trim$(Text2.Text) & vbCrLf

Il passo ancora successivo consiste nell'inviare l'indirizzo email al quale mandare la posta, indirizzo indicato dal contenuto della TextBox3. Se quindi lo stato è MAIL_DA, lo stesso passa a MAIL_A:

Case MAIL_DA
m_State = MAIL_A

e si invia l'indirizzo del destinatario memorizzato temporaneamente nella variabile DatiDaInviare, dopo aver anche qui eliminato gli spazi vuoti:

Winsock1.SendData "A:" & Trim$(Text3.Text) & vbCrLf

Facciamo un altro passo in avanti: se lo stato era MAIL_A lo stato passa a MAIL_DATA ed inviamo il comando "DATA"

Case MAIL_RCPTTO
m_State = MAIL_DATA
Winsock1.SendData "DATA" & vbCrLf

Ancora avanti: inviamo l'oggetto del messaggio, contenuto nella TextBox4, dopo aver cambiato lo stato da MAIL_DATA a MAIL_CORPO:
Case MAIL_DATA
m_State = MAIL_CORPO
Winsock1.SendData "Oggetto:" & Text4.Text & vbLf

Adesso scomponiamo il messaggio in tante linee. Invieremo quindi al server ognuna di queste linee singolarmente. Indichiamo prima con NumeroLinee le linee totali e con Linea una singola linea:

Dim NumeroLinee As Variant
Dim Linea As Variant

adesso dividiamo il messaggio in tante linee:

NumeroLinee = Split(txtMessage, vbCrLf)

e finalmente inviamo ogni singola linea di testo al server:

For Each Linea In NumeroLinee
Winsock1.SendData CStr(Linea) & vbLf
Next

ed infine inviamo il segno punto " . " per indicare al server che l'invio del testo è terminato:

Winsock1.SendData "." & vbCrLf

Ecco adesso l'ultimo passaggio con cui si chiude il procedimento di invio dei dati. Se il testo è stato inviato quindi m_State è MAIL_CORPO, lo stato passa a MAIL_FINE:

Case MAIL_CORPO
m_State = MAIL_FINE

essendo terminato il procedimento chiudiamo la comunicazione col server:

Winsock1.Close

e terminiamo i casi appena visti:

End Select

ritornando a quei tre famosi numeri, se il codice di risposta è diverso dai già citati 250, 220 e 354, chiudiamo la connessione col server, visto che questo non è disponibile a ricevere le nostre richieste e visualizziamo un messaggio di errore col codice relativo:

Else
Winsock1.Close
MsgBox "Errore del protocollo SMTP: " & strServerResponse, _
vbCritical, "Errore SMTP"

e per finire chiudiamo la condizione If introdotta all'inizio (il caso in cui il codice di risposta coincidesse con 250,220 o 354) e terminiamo la sottoprocedura:

End If
End Sub

Nel caso in cui si voglia gestire in modo preciso l'errore bisognerà aggiungere al codice la seguente sottoprocedura:

Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, _
ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, _
ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox "Errore del controllo Winsock numero " & Number & vbCrLf & _
Description, vbExclamation, "Errore Winsock"
End Sub


Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it