VBA: Rekursives Speichern von E-Mails

24/01/2010 - 15:32 von Carlos Claussen & Partner | Report spam
Guten Tag,

ich möchte E-Mails dergestalt speichern, dass die Anhànge als eigene
Dateien gespeichert werden. Das ist einfach. Zusàtzlich möchte ich
allerdings einen Dateianhang, der seinerseits eine E-Mail darstellt,
genauso behandeln. Und immer so weiter.

Das Problem liegt beim "und immer so weiter". Da E-Mails ja beliebig
verschachtelt werden können, làuft das wohl auf eine rekursive
Prozedur hinaus, die nach meinem Dafürhalten so aussehen müsste:

Function SaveEMailAttachments(ByRef att As Outlook.Attachment, ByRef
DokNr As Integer, ByVal Level As Byte)
Dim em As Outlook.MailItem, att1 As Outlook.Attachment, tmp As String
tmp = "C:\tmp" & Level & ".msg"
att.SaveAsFile tmp
Set em = att.Application.CreateItemFromTemplate(tmp)
em.SaveAs DokNr + 1 & "-" & em.SenderName & " an " & em.To & "-" &
em.Subject
For Each att1 In em.Attachments
att1.SaveAsFile DokNr + 1 & "-" & att1.Filename
If Right(att.Filename, 4) = ".msg" Then SaveEMailAttachments
att1, DokNr, Level + 1
Next
fs.DeleteFile tmp
End Function

Beim ersten Aufruf geht das auch. Beim zweiten Aufruf heißt es aber:
"Die Datei "C:\tmp1.msg" kann nicht geöffnet werden. Möglicherweise
existiert die Datei nicht, oder Sie besitzen nicht die Berechtigung,
die Datei zu öffnen, oder die Datei ist von einem anderen Programm
geöffnet. Klicken Sie mit der rechten Maustaste auf den Ordner, der
die Datei enthàlt, und klicken Sie dann auf "Eigenschaften", um Ihre
Berechtigungen für den Ordner zu überprüfen."

Ist natürlich Quatsch, die Datei wurde ja gerade erst erstellt. Es
scheint irgendwie mit dem Rekursiven zu tun zu haben.

Kennt jemand eine Lösung? Am besten wàre es natürlich, wenn man das
attachment nicht über .SaveAs und .CreateItemFromTemplate als Objekt
zu fassen kriegt (denn dabei tritt der Fehler auf), sondern "direkt".

Jochen
 

Lesen sie die antworten

#1 Michael Bauer [MVP - Outlook]
25/01/2010 - 09:11 | Warnen spam
Am Sun, 24 Jan 2010 06:32:33 -0800 (PST) schrieb Carlos Claussen & Partner:



Guten Tag,

ich möchte E-Mails dergestalt speichern, dass die Anhànge als eigene
Dateien gespeichert werden. Das ist einfach. Zusàtzlich möchte ich
allerdings einen Dateianhang, der seinerseits eine E-Mail darstellt,
genauso behandeln. Und immer so weiter.

Das Problem liegt beim "und immer so weiter". Da E-Mails ja beliebig
verschachtelt werden können, làuft das wohl auf eine rekursive
Prozedur hinaus, die nach meinem Dafürhalten so aussehen müsste:

Function SaveEMailAttachments(ByRef att As Outlook.Attachment, ByRef
DokNr As Integer, ByVal Level As Byte)
Dim em As Outlook.MailItem, att1 As Outlook.Attachment, tmp As String
tmp = "C:\tmp" & Level & ".msg"
att.SaveAsFile tmp
Set em = att.Application.CreateItemFromTemplate(tmp)
em.SaveAs DokNr + 1 & "-" & em.SenderName & " an " & em.To & "-" &
em.Subject
For Each att1 In em.Attachments
att1.SaveAsFile DokNr + 1 & "-" & att1.Filename
If Right(att.Filename, 4) = ".msg" Then SaveEMailAttachments
att1, DokNr, Level + 1
Next
fs.DeleteFile tmp
End Function

Beim ersten Aufruf geht das auch. Beim zweiten Aufruf heißt es aber:
"Die Datei "C:\tmp1.msg" kann nicht geöffnet werden. Möglicherweise
existiert die Datei nicht, oder Sie besitzen nicht die Berechtigung,
die Datei zu öffnen, oder die Datei ist von einem anderen Programm
geöffnet. Klicken Sie mit der rechten Maustaste auf den Ordner, der
die Datei enthàlt, und klicken Sie dann auf "Eigenschaften", um Ihre
Berechtigungen für den Ordner zu überprüfen."

Ist natürlich Quatsch, die Datei wurde ja gerade erst erstellt. Es
scheint irgendwie mit dem Rekursiven zu tun zu haben.

Kennt jemand eine Lösung? Am besten wàre es natürlich, wenn man das
attachment nicht über .SaveAs und .CreateItemFromTemplate als Objekt
zu fassen kriegt (denn dabei tritt der Fehler auf), sondern "direkt".

Jochen



Hallo,

1) Bist Du beim ersten Aufruf sicher, dass die Anlage immer eine *.msg-Datei
ist? Ansonsten müßte CreateItemFromTemplate fehlschlagen.

2) Bei em.SaveAs fehlt die Dateiendung. Und wenn Du den Betreff nicht
kennst, mußt der Code damit umgehen können, dass für einen Dateinamen
unerlaubte Zeichen drin sind.

Hier ist ein Beispiel, wie der Betreff bereinigt werden kann:
http://www.vboffice.net/sample.html...d=showitem

3) Zu Deiner Frage: In der For-each-Schleife greifst Du auf die falsche
Variable zu, es muss vermutlich heißen:
If Right(att1.Filename, 4) = "*.msg"


Viele Gruesse
Michael Bauer - MVP Outlook
Gemeinsame Kategorien verwalten:
<http://www.vboffice.net/product.html?pub=6>

Ähnliche fragen