Vba Outlook salvare gli allegati delle email di tipo PEC

Articolo che fornisce una tecnica di come estrapolare gli allegati nei file di tipo PEC.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

L’articolo nasce da una serie di commenti e richieste di un precedente articolo riguardante la possibilità di esportare file pdf di una email di tipo PEC, ossia Posta Elettronica Certificata qui https://www.iprogrammatori.it/articoli/programmazione/art_vba-outlook-salvare-gli-allegati-delle-e_1385.aspx l’articolo.
Come in molti sanno, la PEC è formata da tre file allegati, un file di tipo XML (daticert) un file di tipo p7s, ed infine il messaggio che al suo interno conterrà l’email con allegati.
Utilizzeremo gran parte di codice utilizzato nel precedente articolo, con qualche variante, per l’email di tipo “PEC”.


Stesura del codice

Si apre Outlook e nella voce di menu “Sviluppo” selezionare il pulsante “Visual Basic” se non è presente la scheda “Sviluppo” dobbiamo visualizzarla tramite il menu “Opzioni” situato nel primo menu di sinistra.
Entrati nell’editor di Visual Basic Application (VBA) dobbiamo scrivere l’opzione che obbliga di dichiarare le variabili.
Qui di seguito tale dichiarazione che va inserita in alto sopra ad ogni riga di codice.
VBA

Option Explicit

Scriviamo una funzione, che ottiene un oggetto di tipo “folder” per gestire gli elementi o meglio l’email presenti in una cartella.
Questa funzione, passando come parametro il nome di una cartella di outlook, che può essere Bozze, posta in arrivo, o una nostra creata con nome specifico, restituisce un oggetto di tipo “Folder” con il quale possiamo scorrere tutte le email presenti al suo interno.
Qui di seguito tale funzione.

VBA
Function GetFolderPath(ByVal NomeCartella As String) As Outlook.Folder
Dim oFolder As Outlook.Folder
On Error GoTo Errore
Set oFolder = Application.Session.Folders.Item(1).Folders.Item(NomeCartella)
Set GetFolderPath = oFolder
Exit Function
Errore:
Set GetFolderPath = Nothing
Exit Function
End Function

A questo punto non ci resta che creare la funzione, che verrà richiamata per eseguire l’esportazione del file “Pdf”.
Nella funzione verrà visualizzato a video, due richieste all’utente, la prima il nome della cartella nel quale cercare i file, nella seconda il tipo di file da esportare, ossia se è un file di testo, pdf, o altro.
Nel caso che l’email è una pec, l’allegato che andremo ad esaminare sarà di tipo “Eml” il messaggio in cui al suo interno dovremmo elaborare gli allegati che rispettano il tipo di file indicato.
Individuato tale file, salveremo questo allegato sul disco con estensione “oft” in modo che è un modello “email” da poterlo poi ricaricare come email tramite il metodo “CreateItemFromTemplate” .
Qui di seguito si riporta tale dichiarazione.

VBA
Sub MiaFunzione()
Dim objMail As Outlook.MailItem
Dim objAttachment As Outlook.Attachment
Dim ObjCartella As Folder
On Error GoTo Errore
Dim StrCartella As String
StrCartella = InputBox("Scrivere la cartella dalla quale estrapolare gli allegati dalle email.")
If Trim(StrCartella) = "" Then
MsgBox "Indicare una cartella nella quale trovare gli allegati. ", vbInformation + vbOKOnly, "Allegati"
Exit Sub
End If
Dim StrTipoAllegato As String
StrTipoAllegato = InputBox("Indicare il tipo di file (Esempio per i word doc per i file di testo txt.", "SalvaAllegati", "doc")
If Trim(StrTipoAllegato) = "" Then
MsgBox "Impossibile continuare, indicare il tipo di file. ", vbInformation + vbOKOnly, "Salva Allegati"
Exit Sub
End If
Set ObjCartella = GetFolderPath(StrCartella)
If ObjCartella.Items.Count = 0 Then
MsgBox "Non ci sono email nella cartella indicata. ", vbInformation + vbOKOnly, "Allegati"
Exit Sub
End If
Dim NomeFileDaSalvare As String
Dim Elementi As Object
Dim AllegatoTrovato As Attachment
Dim IConta As Integer
IConta = 1
For Each Elementi In ObjCartella.Items
For Each AllegatoTrovato In Elementi.Attachments
If Right(AllegatoTrovato.FileName, 3) = StrTipoAllegato Then
NomeFileDaSalvare = "D:\" & IConta & AllegatoTrovato.FileName
AllegatoTrovato.SaveAsFile NomeFileDaSalvare
IConta = IConta + 1
ElseIf InStr(1, AllegatoTrovato.FileName, "eml") > 0 Then
NomeFileDaSalvare = "D:\" & IConta & Mid(AllegatoTrovato.FileName, 1, InStr(1, AllegatoTrovato.FileName, ".")) & "oft"
AllegatoTrovato.SaveAsFile NomeFileDaSalvare
Set objMail = Application.CreateItemFromTemplate(NomeFileDaSalvare)
Dim AllegatoPec As Attachment
For Each AllegatoPec In objMail.Attachments
If Right(AllegatoPec.FileName, 3) = StrTipoAllegato Then
NomeFileDaSalvare = "D:\" & IConta & AllegatoPec.FileName
AllegatoPec.SaveAsFile NomeFileDaSalvare
IConta = IConta + 1
End If
Next AllegatoPec
End If
Next AllegatoTrovato
Next Elementi
Set objMail = Nothing
Set objAttachment = Nothing
Exit Sub
Errore:
MsgBox ("Si è verificato il seguente errore: " & Err.Description)
End Sub

Conclusioni

L’articolo ha voluto illustrare una tecnica per gestire gli allegati all’interno di email di tipo PEC, che ad oggi è strutturata in maniera diversa dalle email normali.
Si è visto come alcune classi e metodi messi a disposizioni del linguaggio di programmazione VBA si può ampliare in maniera semplice delle procedure adatte a specifica attività. In questo articolo inoltre abbiamo visto come estendere una precedente tecnica di gestione degli allegati e file email.