Scrivere messaggi di posta elettronica in file flat in Outlook con VBA
-
03-07-2019 - |
Domanda
Ho scritto un'app VBA che apre una cartella in Outlook e quindi scorre i messaggi. Devo scrivere i corpi dei messaggi (con qualche modifica) in un singolo file flat. Il mio codice è il seguente ...
Private Sub btnGo_Click()
Dim objOutlook As New Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Dim objInbox As MAPIFolder
Dim objMail As mailItem
Dim count As Integer
Set objNameSpace = objOutlook.GetNamespace("MAPI")
Set objInbox = objNameSpace.GetDefaultFolder(olFolderInbox)
count = 0
For Each objMail In objInbox.Items
lblStatus.Caption = "Count: " + CStr(count)
ProcessMailItem (objMail)
count = count + 1
Next objMail
End If
End Sub
La parte in questione è " ProcessMailItem " ;. Dato che non mi preoccupo eccessivamente delle prestazioni in questa fase, quindi l'inefficiente "apri, aggiungi, chiudi" la metodologia dei file va bene per questo esempio.
So che potrei passare un po 'di tempo a cercare la risposta con Google, ma ho controllato prima qui e non c'erano buone risposte per questo. Essendo un fan di Stackoverflow, spero che metterlo qui aiuti i futuri sviluppatori a cercare risposte. Grazie per la tua pazienza.
Soluzione
Puoi cavartela scrivendo su un file senza usare alcun oggetto, semplicemente usando gli strumenti di file VBA integrati:
Open "C:\file.txt" for append as 1
Print #1, SomeStringVar
Close #1
Altri suggerimenti
Se non ti dispiace riaprire il file di output ogni volta che aggiungi del testo, allora dovrebbe funzionare.
Private Sub ProcessMailItem(objMail As MailItem)
Dim fso As New FileSystemObject
Dim ts As TextStream
Set ts = fso.OpenTextFile("C:\Outputfile.txt", ForAppending, True)
ts.Write(objMail.Body)
ts.Close()
Set ts = Nothing
Set fso = Nothing
End Sub
Dovrai anche aggiungere un riferimento alla libreria Microsoft Scripting Runtime. Questo contiene FileSystemObject.
Devi anche occuparti del popup di sicurezza "cercando di accedere agli indirizzi email" che è trattato in Outlook "quot Object Model Guard"; Problemi di sicurezza per gli sviluppatori
Public Sub ProcessMailItem(objMail As MailItem)
Dim FSO As New FileSystemObject
Dim ts As TextStream
Dim loc As String
Dim subject As String
Dim strID As String
' per http://www.outlookcode.com/article.aspx?ID=52
Dim olNS As Outlook.NameSpace
Dim oMail As Outlook.MailItem
strID = MyMail.EntryID
Set olNS = Application.GetNamespace("MAPI")
Set oMail = olNS.GetItemFromID(strID)
subject = oMail.subject
Set ts = FSO.OpenTextFile("C:\Documents and Settings\tempuser\My Documents\EMAILS\" + subject, ForAppending, True)
ts.Write (oMail.Body)
ts.Close
Set ts = Nothing
Set FSO = Nothing
Set oMail = Nothing
Set olNS = Nothing
End Sub