Mi riferisco ad un articolo "stampa unione" in cui spiegavo come risolvere il problema della stampa unione (Word-Excel) per l’invio di un allegato PDF. Il sistema invia tramite Outlook (che dovrà già essere configurato opportunamente).
Qualcuno mi ha chiesto se è possibile inviare, per ogni singola email effettuata in stampa unione, le medesime email in CC (Carbon Copy, “per conoscenza”). Una seconda domanda riguardava invece la possibilità di inserire, nel testo della email (che nel codice originario si limitava ad un semplice testo ASCII senza formattazione) la firma di default.
Per chi non lo sapesse, Outlook prevede, come tutti i client di posta elettronica, la possibilità di creare una o più firme da inserire, automaticamente o meno, in calce al testo della email.
Analizziamo un problema per volta.
Il primo, molto semplice, consiste nell’aggiungere al codice esistente:
‘imposto l’indirizzo Carbon Copy
item.CC = “This email address is being protected from spambots. You need JavaScript enabled to view it.”;
appena dopo la riga
item.To = EmailAddress
che trovate verso la fine della subroutine.
Ovviamente, nel caso di più indirizzi, è sufficiente inserire tra i doppi apici il set di indirizzi separati da punto e virgola (“This email address is being protected from spambots. You need JavaScript enabled to view it.;This email address is being protected from spambots. You need JavaScript enabled to view it.;This email address is being protected from spambots. You need JavaScript enabled to view it.”).
Quanto al secondo problema, quello della firma, non ho buone notizie per ora. Da ciò che ho letto, il problema principale sta nel fatto che gli oggetti firma NON sono direttamente accessibili da VBA. Questo ci impone di trovare una soluzione “workaround”, una sorta di escamotage. Quello che penso sia il più efficiente consiste in questo stratagemma:
- preparo in Outlook un nuovo messaggio, completo di tutto ciò che è necessario inviare ad esclusione dell’allegato.
- Invece di inviare il messaggio a qualcuno, salvo il messaggio in HTML:
(finestra del nuovo messaggio) File->salva con nome
avendo cura di selezionare, nella combo box “salva come” in basso, il formato HTML. Avrò già deciso DOVE collocare il file, ad esempio in
c:\temp
e assegno come nome del file
htmlmessage
senza aggiungere estensione.
In pratica, a questo punto, avremo un file chiamato htmlmessage.html in c:\temp
Questo file, preziosissimo, contiene tutto il necessario per messaggio, firma ed eventuali elementi grafici. Non resta che importare questo file nel codice VBA assegnandolo ad una variabile stringa che nel mio esempio ho denominato MyHTMLMessage.
Nel codice, ho sostituito il metodo item.body con item.HTMLBody, che supporta, come è facile intuire, il codice HTML
Spero al più presto di realizzare un tutorial ad hoc. Nel frattempo pubblico il codice con le modifiche di cui vi ho parlato sin qui:
Sub Unione_in_pdf()
‘dimensionamento per Body in HTML
Dim strFilename As String: strFilename = “C:\temp\htmlmessage.txt”
Dim MyHTMLMessage As String
Dim iFile As Integer: iFile = FreeFile
‘creo un oggetto outlook
Dim obj As New Outlook.Application
‘oggetto che rappresenta l’email
Dim item As Outlook.MailItem
‘instanzio l’oggetto
Set item = obj.CreateItem(Outlook.OlItemType.olMailItem)
‘Crea un oggetto FileDialog per scegliere la cartella in cui salvare i file
Dim fd As FileDialog
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
‘carica il messaggio HTML
Open strFilename For Input As #iFile
MyHTMLMessage = Input(LOF(iFile), iFile)
Close #iFile
‘inizia procedura
With fd
‘Usa il metodo Show per mostrare la finestra di dialogo e restituire l’azione dell’utente
If .Show = -1 Then
For Each vrtSelectedItem In .SelectedItems
‘vrtSelectedItem è una stringa che contiene l’indirizzo di ogni elemento selezionato.
‘E’ possibile usare qualsiasi funzione di I/O sui file utilizzando questo indirizzo.
selectedpath = vrtSelectedItem
Next vrtSelectedItem
Else
MsgBox (“Nessuna cartella è stata selezionata.”)
Exit Sub
End If
End With
‘Imposta la variabile oggetto a Nothing
Set fd = Nothing
Application.ScreenUpdating = False
MainDoc = ActiveDocument.Name
ChangeFileOpenDirectory selectedpath
For i = 1 To ActiveDocument.MailMerge.DataSource.RecordCount
‘instanzio l’oggetto item per l’email
Set item = obj.CreateItem(Outlook.OlItemType.olMailItem)
With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = i
.LastRecord = i
.ActiveRecord = i
‘Utilizza alcuni campi del file sorgente per impostare il nome del file pdf
‘IMPORTANTE: tali campi vanno personalizzati in base a quelli effettivamente
‘presenti nella sorgente dati
‘—-attenti alle righe seguenti: nel database DEVE essere presente il campo denominato “nome e cognome”—
‘—–ed inoltre un campo denominato “email”——-
docname = “Lettera_” & .DataFields(“nome_e_cognome”).Value & “.pdf”
EmailAddress = .DataFields(“email”).Value
‘ prendiamo il percorso completo del file da allegare
pdfallegato = selectedpath & “\” & docname
‘—-attenti a questa riga: personalizzate a piacimento il messaggio, inteso come corpo del testo——-
‘messaggio = “Gentilissimo ” & .DataFields(“nome_e_cognome”).Value & ” Le inviamo in allegato la certificazione di partecipazione al convegno.”
‘—-attenti a questa riga: qui mettete l’oggetto del vostro messaggio email—–
SoggettoEmail = “Invio certificato di partecipazione al convegno”
End With
.Execute Pause:=False
Application.ScreenUpdating = False
End With
ActiveDocument.ExportAsFixedFormat OutputFileName:=docname, _
ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
BitmapMissingFonts:=True, UseISO19005_1:=False
ActiveWindow.Close SaveChanges:=False
‘invia tramite outlook
‘imposto il destinatario
item.To = EmailAddress
‘imposto l’indirizzo Carbon Copy
item.CC = “This email address is being protected from spambots. You need JavaScript enabled to view it.”;
‘imposto il corpo HTML del messaggio
item.HTMLBody = MyHTMLMessage
‘imposto l’oggetto del messaggio
item.Subject = SoggettoEmail
‘allegato
Set allegato = item.Attachments
allegato.Add pdfallegato
‘invio l’email
item.Send
Set item = Nothing
Next i
Application.ScreenUpdating = True
End Sub