d4shoernchen
Goto Top

Automatisch E-Mail Adresse aus Mail Delivery Error in Textdatei kopieren

Guten Morgen liebe Kollegen,

wir betreiben seit kurzem ein Newslettersystem, nur leider wurden die Adresslisten nicht wirklich gepflegt. Nach unserer ersten Mailingaktion sind nun ca. 500 Mails zurück gekommen. Besteht irgendwie die Möglichkeit die E-Mails zu filtern und in eine Textdatei zu kopieren?

Der Text von der Mail Delivery Error sieht ja immer wie folgt aus:

This message was created automatically by mail delivery software.

A message that you sent could not be delivered to one or more of its
recipients. This is a permanent error. The following address(es) failed:

empfaenger@domain.tld

Nun die Frage an unsere Programmierer hier, kann man ein Macro oder andere Scriptsprachen verwenden die nun daher gehen und die Mails durchsuchen und den Inhalt von Zeile 6 kopieren und in eine Textdatei der Reihe nach einfügen?

Eventuell wenn man vorher alle Mails abspeichert?

Würde ungern nun dabei gehen und mir alle 500 Mails anschauen und die E-Mail Adressen rauskopieren, damit unsere Adressliste auf dem neusten Stand ist. Alternativ könnte ich bei der nächsten Mailingaktion unseren Mailprovider anschreiben, ob er die Daten irgendwie aus den Serverlogfiles ziehen kann.

Gruß
@d4shoerncheN

Content-ID: 213100

Url: https://administrator.de/forum/automatisch-e-mail-adresse-aus-mail-delivery-error-in-textdatei-kopieren-213100.html

Ausgedruckt am: 25.12.2024 um 01:12 Uhr

colinardo
colinardo 01.08.2013 um 11:39:35 Uhr
Goto Top
Hi @d4shoerncheN,
in welchen Programm liegen die Mails vor ? Outlook ?
Mit abspeichern und via VBS und RegEx parsen wäre auch kein Problem.

Grüße Uwe
d4shoerncheN
d4shoerncheN 01.08.2013 um 11:43:14 Uhr
Goto Top
Moin @colinardo,

in welchen Programm liegen die Mails vor ? Outlook ?
Ja. Ich verwende Outlook 2010.

Gruß
@d4shoerncheN
colinardo
colinardo 01.08.2013 um 11:45:45 Uhr
Goto Top
Dann schreib mir mal in welchem Ordner die Mails alle liegen, dann schreib ich Dir ein Script zum extrahieren. face-wink
d4shoerncheN
d4shoerncheN 01.08.2013 um 11:47:07 Uhr
Goto Top
Du bist meine Rettung face-smile

Zitat von @colinardo:
Dann schreib mir mal in welchem Ordner die Mails alle liegen, dann schreib ich Dir ein Script zum extrahieren. face-wink

Die E-Mails laufen im Ordner "No-Reply" auf.

Gruß
colinardo
colinardo 01.08.2013 um 11:52:14 Uhr
Goto Top
Im root des Stores oder ist das ein Unterordner von einem anderen Ordner ?
d4shoerncheN
d4shoerncheN 01.08.2013 um 11:57:53 Uhr
Goto Top
Hallo,

bb37a8dba7e67a66ffa1bcec898778e7
colinardo
colinardo 01.08.2013, aktualisiert am 16.05.2018 um 12:42:02 Uhr
Goto Top
So,
in Outlook mit ALT-F11 den VBA-Editor öffnen und den Code in "ThisOutlookSession" einfügen. Den Pfad zur Ausgabedatei mit den E-Mailadressen kannst du in Zeile 2 noch an deine Bedürfnisse anpassen.
Wenn du mehrere Konten in Outlook hast könnte es sein das du Zeile 8 eventuell noch anpassen musst.
Wenn der Root-Knoten deines Stores z.B. hoernchen heißt, wäre die Zeile 8 so zu ändern:
Set fldr = Application.Session.Stores.Item("hoernchen").GetRootFolder.Folders("No-Reply")
Sub parseMails()
    Const FILEPATH = "D:\emails.txt"  
    
    Set myRegExp = CreateObject("vbscript.regexp")  
    Set objFSO = CreateObject("Scripting.FileSystemObject")  
    Dim fldr As Folder
    Set fldr = Application.Session.Stores.Item("t.gerns@domain.tld").GetRootFolder.Folders("No-Reply")  
    Set objTextFile = objFSO.CreateTextFile(FILEPATH, True)
    myRegExp.IgnoreCase = True
    myRegExp.pattern = "The following address\(es\) failed:\s+(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b)"  
    
    For i = 1 To fldr.Items.Count
        If fldr.Items(i).Class = olMail Then
            strBody = fldr.Items(i).Body
            Set myMatches = myregexp.Execute(strBody)
            If myMatches.Count >= 1 Then
                For Each myMatch In myMatches
                    If myMatch.SubMatches.Count >= 1 Then
                        strEMail = myMatch.SubMatches(0)
                        objTextFile.WriteLine (strEMail)
                    End If
                Next
            End If
        End If
    Next

    objTextFile.Close
    MsgBox "Verarbeitung abgeschlossen !" & vbNewLine & "Die Datei mit den extrahierten E-Mail-Adressen liegt hier: " & FILEPATH  
    Set myRegExp = Nothing
    Set objFSO = Nothing
End Sub

Grüße Uwe
d4shoerncheN
d4shoerncheN 01.08.2013 um 12:32:14 Uhr
Goto Top
Hallo Uwe,

schon mal vielen Dank.

Ich besitze nur ein (Exchange-)Konto. Bei der Scriptausführung erhalte ich folgende Meldung:
d4852cac1868319d9d73d11f77973ffd

Für mich nicht wirklich aussagekräftig. Für dich eventuell schon.

Gruß
colinardo
colinardo 01.08.2013 aktualisiert um 12:40:09 Uhr
Goto Top
sorry mein Fehler habe gedacht der Ordner no-reply wäre ein Unterordner des Posteingangs .. habe es oben korrigiert...jetzt sollte es laufen
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 12:44:11 Uhr
Goto Top
Leider selbe Fehlermeldung.

Habe den Ordner nun mal unterhalb vom Posteingang verschoben und deinen alten Code genutzt. Nun bekomme ich Fehlermeldung "Zugriff verweigert".

Gruß
colinardo
colinardo 01.08.2013 um 12:43:48 Uhr
Goto Top
wie heißt der Store also der Name des Rootknotens ?
d4shoerncheN
d4shoerncheN 01.08.2013 um 12:45:13 Uhr
Goto Top
Die E-Mail Adresse von mir t.gerns@domain.tld
colinardo
colinardo 01.08.2013 um 12:47:53 Uhr
Goto Top
OK habs oben eingetragen, musst die E-MailAdresse noch oben in Zeile 8 ändern
d4shoerncheN
d4shoerncheN 01.08.2013 um 12:50:18 Uhr
Goto Top
Wir nähern uns. Zugriff verweigert verschwand, nachdem ich von C: auf D: gewechselt habe. Nun bekomme ich Laufzeitfehler 13 - Typen unverträglich.
colinardo
colinardo 01.08.2013 aktualisiert um 12:57:20 Uhr
Goto Top
Sind in dem Ordner auch noch andere Typen von Objekten? habe noch eine Änderung dahingehend gemacht. Aber hier läuft es problemlos...
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 13:05:31 Uhr
Goto Top
Irgendwas tut er nun zumindest, momentan "Keine Rückmeldung" - sobald er Ergebnisse liefert, teile ich sie mit.
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 13:05:25 Uhr
Goto Top
Okay, Script selber funktioniert.

Allerdings bekomme ich folgende E-Mail in mehrfacher Ausführung nur zurück:

info@domain.tld

Wahrscheinlich wertet er momentan die E-Mails aus, an wen die Fehlermeldung ging und nicht an welchen Empfänger ursprünglich.

Danke vielmals.
colinardo
colinardo 01.08.2013 aktualisiert um 13:11:08 Uhr
Goto Top
Zitat von @d4shoerncheN:
Wahrscheinlich wertet er momentan die E-Mails aus, an wen die Fehlermeldung ging und nicht an welchen Empfänger
ursprünglich.
nein er wertet die E-Mail an der Stelle aus, so aus wie du es oben geschrieben hattest.
Das Phänomen der mehrfachen Mails kommt durch irgendeinen Cache-Mechanismus von Outlook. Hier hilft es Outlook mal neu zu starten.
Aber Duplikate lassen sich ja einfach via Excel ausfiltern ...

-edit- habe die Scheifenmethode geändert, da bei "Foreach" doppeltes Verarbeiten von Mails vorgekommen ist.
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 13:18:21 Uhr
Goto Top
Hallo,

Aber Duplikate lassen sich ja einfach via Excel ausfiltern ...
das ist richtig. Das Problem besteht nur darin das die Datei nur die E-Mail "info@domain.tld" beinhaltet und keine andere. E-Mail Adresse des Empfängers befindet sich wie oben beschrieben in Zeile 6 des Textes.

Hier mal der Auszug aus der E-Mail
2c39e23e2be8e2ef733b514abc94e725

Mit den Punkten habe ich versucht die, für mich ersichtlichen, Zeilen zu markieren. An Punkt 6 kommt die E-Mail Adresse.

Gruß
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 13:28:47 Uhr
Goto Top
Hallo,

habe das Script oben noch einmal neu reinkopiert, entsprechend geändert, Outlook neugestartet und ausgeführt.
Inhalt der emails.txt
info@domain.tld
info@domain.tld
info@domain.tld
.... gekürzte Fassung
colinardo
colinardo 01.08.2013 um 13:27:28 Uhr
Goto Top
bin noch dabei zu checken, etwas Geduld ...
d4shoerncheN
d4shoerncheN 01.08.2013 um 13:32:12 Uhr
Goto Top
Okay, keine Eile face-smile

Was mich ein wenig irritiert ist, woher hat er die "info@domain.tld" ? Die Fehlermeldungen gehen an ein POP3-Postfach "no-reply@domain.tld". Dieses POP3-Postfach wird vom Exchange (über POPcon Pro) abgeholt und an meine E-Mail Adresse umgeleitet.

Die E-Mail Adresse "info@domain.tld" wird also eigentlich in keinster Weise berührt.

Gruß
colinardo
colinardo 01.08.2013 um 13:38:50 Uhr
Goto Top
Das Problem liegt daran ob die Mails in HTML oder Plaintext verfasst sind , bin noch dabei das auszuloten
colinardo
colinardo 01.08.2013 aktualisiert um 14:23:42 Uhr
Goto Top
OK nun noch mal probieren, ist oben entsprechend angepasst.
--edit-- Seite bitte neu laden hatte noch eine kleine Korrektur drin
d4shoerncheN
d4shoerncheN 01.08.2013 um 14:27:06 Uhr
Goto Top
Besten Dank, es funktioniert.

Worauf muss ich achten, bei anderen Mail delivery failed Meldungen? Einige habe ich die nicht genau so aussehen wie die oben genannte. Diese habe ich vorübergehend in einen anderen Ordner verschoben.

Gruß
colinardo
colinardo 01.08.2013 aktualisiert um 14:39:41 Uhr
Goto Top
solange die Mail PLAIN-TEXT ist und eine Zeile mit
The following address(es) failed:
gefolgt von beliebig vielen Leerzeilen oder Spaces, gefolgt von der E-Mail-Adresse
enthält sollte es diese auch erkennen.
die eigentliche Extrahierung findet in diesem RegEx-Pattern statt:
myRegExp.pattern = "The following address\(es\) failed:\s+(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b)" 
wenn die gewünschte E-Mail-Adresse die erste E-Mail-Adresse ist die in dem Text auftaucht ginge auch folgendes vereinfachte RegEx (dies geht auch bei HTML-Mails):
myRegExp.pattern = "(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b)"
Der Rest vom Text kann dabei beliebig variieren.

Grüße Uwe
d4shoerncheN
d4shoerncheN 01.08.2013 aktualisiert um 14:39:49 Uhr
Goto Top
Hallo,

habe es mit
myRegExp.Pattern = "Fehler bei der Nachrichtenzustellung an folgende Empfänger oder Gruppen:[\s]+(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,3}\b)"

versucht. Die E-Mail ist wie folgt:
Fehler bei der Nachrichtenzustellung an folgende Empfänger oder Gruppen:

empfaenger@domain.tld
Kommunikationsfehler bei der Zustellung der Nachricht. Versuchen Sie, die Nachricht zu einem späteren Zeitpunkt erneut zu senden. Wenden Sie sich an den Helpdesk, falls das Problem weiterhin besteht.

Aber wie in deiner Aussage immer die erste E-Mail die auftaucht. Daher versuche ich es mal mit
myRegExp.pattern = "(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b)"

EDIT
Das funktionierte leider nicht, Datei bleibt leer.
colinardo
colinardo 01.08.2013 aktualisiert um 14:48:48 Uhr
Goto Top
dann ist noch ein mailto: vor der Mailadresse enthalten das du nicht siehst um einen Link zu erzeugen:
myRegExp.pattern = ":?([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}\b)"
d4shoerncheN
d4shoerncheN 01.08.2013 um 14:49:07 Uhr
Goto Top
Leider auch nicht.

Aber gut, dass sind nur ca. 50 Adressen. Die mache ich per Hand, möchte dich nicht noch weiter damit nerven.

Vielen Dank noch einmal.
colinardo
colinardo 01.08.2013 um 14:51:03 Uhr
Goto Top
lade die Seite mal neu, hatte einen kleinen Typo drin
d4shoerncheN
d4shoerncheN 01.08.2013 um 14:52:46 Uhr
Goto Top
Leider immer noch nicht.
colinardo
colinardo 01.08.2013 aktualisiert um 14:59:16 Uhr
Goto Top
### Outlook das schreibt bei manchen E-Mail-Hyperlinks solch ein Konstrukt
HYPERLINK "mailto:infol@test.local"infol@test.local
dann nimm diese allgemeine Variante
myRegExp.pattern = "([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})"
feddich ...
d4shoerncheN
d4shoerncheN 01.08.2013 um 15:01:41 Uhr
Goto Top
Ich trau mich schon gar nicht mehr, aber Datei ist immer noch leer.

Outlook wurde vor jedem Versuch neugestartet.
colinardo
colinardo 01.08.2013 um 15:03:56 Uhr
Goto Top
MUSS aber, dann hast du das Script irgendwie verwurschtelt ...
d4shoerncheN
d4shoerncheN 01.08.2013 um 15:06:17 Uhr
Goto Top
Das stellen wir gleich fest.

Sub parseMails()
    Const FILEPATH = "D:\emails2.txt"  
    
    Set myRegExp = CreateObject("vbscript.regexp")  
    Set objFSO = CreateObject("Scripting.FileSystemObject")  
    Dim fldr As Folder
    Set fldr = Application.Session.Stores.Item("t.gerns@domain.tld").GetRootFolder.Folders("No-Reply")  
    Set objTextFile = objFSO.CreateTextFile(FILEPATH, True)
    myRegExp.IgnoreCase = True
    myRegExp.Pattern = "([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})"  
    
    For i = 1 To fldr.Items.Count
        If fldr.Items(i).Class = olMail Then
            strBody = fldr.Items(i).Body
            Set myMatches = myRegExp.Execute(strBody)
            If myMatches.Count >= 1 Then
                For Each myMatch In myMatches
                    If myMatch.SubMatches.Count >= 1 Then
                        strEMail = myMatch.SubMatches(0)
                        objTextFile.WriteLine (strEMail)
                    End If
                Next
            End If
        End If
    Next

    objTextFile.Close
    MsgBox "Verarbeitung abgeschlossen !" & vbNewLine & "Die Datei mit den extrahierten E-Mail-Adressen liegt hier: " & FILEPATH  
    Set myRegExp = Nothing
    Set objFSO = Nothing
End Sub
colinardo
colinardo 01.08.2013 um 15:16:29 Uhr
Goto Top
Da stimmt eigentlich alles,
wir haben halt nicht die selben Mails zum testen, denn daran muss es liegen, entweder stimmt hier die Objektklasse der Mails nicht (olMail) oder sonst was komisches.
Du kannst testweise mal versuchen Zeile 13 und 24 aus dem Script zu entfernen, wenn es dann läuft haben die Objekte eine andere Klasse.
d4shoerncheN
d4shoerncheN 01.08.2013 um 15:19:00 Uhr
Goto Top
Hallo,

Du kannst testweise mal versuchen Zeile 13 und 24 aus dem Script zu entfernen, wenn es dann läuft haben die Objekte eine andere Klasse.
das war es. Danach lief es einwandfrei.

Vielen Dank face-smile