Automazione dell’e-mail (con richiesta di aiuto)
ULTIM'ORA. Alla richiesta è pervenuta una segnalazione interessante da un bravo Giorgio Villa. La incollo subito qui sotto (e va da sé che sarà bene leggere prima l'appello originario di un tal Filippo Rizzo:
Ho avuto il medesimo problema, non essendo farina del mio sacco, ho utilizzato i suggerimenti di una valida persona http://www.rondebruin.nl/mail/folder1/mail3.htm
in alternativa
http://www.rondebruin.nl/mail/folder1/mail2.htm
http://www.rondebruin.nl/mail/folder1/mail1.htm
L'intervento originario di Filippo Rizzi
Un visitatore, Filippo Rizzi, mi chiede una soluzione a un problema che lo affligge, relativo a un fastidioso messaggio di conferma che inesorabilmente gli appare quando utilizza una sua applicazione Excel VBA di spedizione automatica di messaggi di posta elettronica, precisamente in corrispondenza dell’istruzione di invio (Send). Onestamente ho subito ammesso che la questione esulava dalle mie competenze anzi, peggio, un tempo mi sono dilettato con (semplici) routine del genere ma oggi come oggi non le ricordo. Così al volo ho solo suggerito l’inserimento dell’istruzione Application.DisplayAlerts = False, con un certo scetticismo “a sentimento” che potesse funzionare nella fattispecie (d’altronde anche in altri casi essa delude le aspettative).
In prossimità delle vacanze ho pensato di chiedere all’autore di rivelare all’inclita e al volgo la sua creatura, pubblicandola sul mio blog con la richiesta pubblica di soccorso del genere chi-sa-parli.
L’e-mail del buon Filippo è riportata qui sotto:
filippo.rizzo@telecomitalia.it
Ed ecco la sua replica:
Fornisco volentieri il codice che utilizzo, ma il guaio è che anche con la con la funzione di DisplayAlerts = False la protezione di Windows (prevista dal service pack 3 in poi) mi blocca ed attende una CONFERMA (SI/NO/Annulla) e non c'è verso neanche di attenuare le protezioni do Outlook solo in quel momento.
Dovrebbe essere possibile solo con CDOSYS o via SMTP, ma non riesco.
Quanto alla routine si presenta sufficientemente chiara e ben commentata, perlomeno come ricetta. Pertanto mi limito a precisare che il procedimento utilizza il meccanismo di OLE Automation richiamando cioè Outlook con:
Set App = CreateObject("Outlook.Application")
Un altro mio piccolo ritocco è l’inserimento di un Exit Sub per il caso di assenza di materiale da spedire (l’originale di Filippo prevedeva una If completata dalla corrispettiva End If a monte di End Sub).
Buona lettura e... meditazione.
Private Sub CommandButton2_Click()
Dim FileExtStr As String
Dim FileFormatNum As Long
Dim Sourcewb As Workbook
Dim Destwb As Workbook
Dim TempFilePath As String
Dim TempFileName As String
Dim OutApp As Object
Dim OutMail As Object
Program = ThisWorkbook.Name
Paraco = "Paraco" ' Nome del foglio che contiene i PARAmetri di COntrollo
PathArchivie = _
Workbooks(Program).Worksheets(Paraco).Cells(4, 2)
FormatSave = Application.DefaultSaveFormat
' Carico la lista dei file dal percorso previsto
NomiFiles = ScanDir(PathArchivie & "\", Lista)
NFiles = UBound(Lista)
If NFiles = 0 Then Exit Sub ' Nulla da spedire
With Application
.ScreenUpdating = False
.EnableEvents = False
End With
' Carico Oggetto e corpo della mail dal foglio dei parametri
ESubject = _
Workbooks(Program).Worksheets(Paraco).Cells(2, 12)
Ebody = Workbooks(Program).Worksheets(Paraco).Cells(3, 12)
' qui faccio l'invio dei file che ho trovato
For f = 0 To UBound(Lista)
sendto = "indirzzo@server"
CCTo = "indirzzo@server"
NewFileName = PathArchivie & "\" & Lista(f)
' qui imposto l'applicazione Outlook
Set App = CreateObject("Outlook.Application")
Set Itm = App.CreateItem(0)
With Itm
.subject = ESubject
.To = sendto
.CC = CCTo
.body = Ebody
.Attachments.Add (NewFileName)
Application.DisplayAlerts = False ‘ Purtroppo delude…
.Send
End With
Set App = Nothing
Set Itm = Nothing
Next f
With Application
.ScreenUpdating = True
.EnableEvents = True
End With
End Sub