Excel VBA - Emailbody aus Outlook auslesen

jerry0110

Erfahrenes Mitglied
Hallo zusammen,

ich möchte gerne von täglichen Emails den Body auslesen.
In dem Body Text ist eine Tabelle die mir Daten liefert.

Diese sieht wie folgt aus:

SenderMassageSPAM MailsOther MsgAdult Spam MailsVirus Mails
test@xyz.de20010253040
info@xyz.de50010205214

Und dann geht das immer so weiter.

Ich möchte diese Tabelle auslesen und dann in eine Tabelle einfügen mit Datum, von wann die Email ist.
So dass ich diese dann auswerten kann.

Kann mir jemand da unter die Arme greifen? Habe leider nichts passendes im Internet gefunden.
 

Yaslaw

n/a
Moderator
Jetzt ist die grosse Frage, in was für einem Format die Tabelle vorliegt.
Kannst du mal ein Beispielmail speichern und zippen und dann hier hochladen?
 

Yaslaw

n/a
Moderator
Die Tabelle kommt im Body-Attribut als Text heraus. Die Zeilen sind mit jeweils 2 Wagenrücklauf+Zeilenumbruch getrennt.

Das kann man ausnutzen und ein RegEx setzen.
Hier mein Test: Regex101 - online regex editor and debugger

Und als Code:
Visual Basic:
Public Sub mailTest()
    Const C_MAPI = "myMailadresse@firma.com"
    Const C_FOLDER = "TEST"
    
    'Das Test-Mail auslesen
    Dim otl As Outlook.Application:     Set otl = New Outlook.Application
    Dim ns As Outlook.Namespace:        Set ns = otl.GetNamespace("MAPI")
    Dim fld As Outlook.MAPIFolder:      Set fld = ns.Folders(C_MAPI).Folders(C_FOLDER)
    Dim mail As Outlook.MailItem:       Set mail = fld.items.GetFirst
    
    'RegExp definieren
    Dim rx As Object:                   Set rx = CreateObject("VBScript.RegExp")
    rx.pattern = "\b([\w.%+-]+@[\w.-]+\.[A-Z]{2,})\b(?: <mailto:[\w.%+-]+@[\w.-]+\.[A-Z]{2,}>)?\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)"
    rx.ignoreCase = True
    rx.Global = True
    
    'Prüfen ob der Body eine Tabelle enthält
    If Not rx.test(mail.body) Then
        MsgBox "Mailbody passt nicht"
        Exit Sub
    End If
    
    'Mit dem RegEx die einzelnen Zeilen auslsen
    Dim match As Object: For Each match In rx.execute(mail.body)
        Dim items As Object: Set items = match.SubMatches
        '//TODO: Anstelle des debug.print diese in eine neie Zeile eines Excelsheets schreiben
        Debug.Print items(0), items(1), items(2), items(3), items(4), items(5)
    Next match
End Sub

Ausgabe:
Code:
xyz@info.de   1557          0             1557          0             0
xyz@info.de   1344          0             1344          0             0
xyz@info.de   135           0             135           0             0
xyz@info.de   25            0             25            0             0
xyz@info.de   8             0             8             0             0
xyz@info.de   4             0             4             0             0
 

jerry0110

Erfahrenes Mitglied
Ich habe den Code jetzt in eine Excel eingebaut und dann oben meine Emailadresse und das Postfach angegeben wo die Mail drin ist. Wenn ich es starte dann kommt direkt in Zeile 6 die Fehlermeldung "Fehler beim Kompilieren: Benutzerdefinierter Typ nicht definiert
 

Yaslaw

n/a
Moderator
Ich dachte, die Mailgeschichte per se hast du drin. Egal. Setze eine Referenz auf
Microsoft Outlook 16.0 Object Library
Wobei die Zahl 16 bei dir auch eine andere sein kann.
 

jerry0110

Erfahrenes Mitglied
Die Tabelle kommt im Body-Attribut als Text heraus. Die Zeilen sind mit jeweils 2 Wagenrücklauf+Zeilenumbruch getrennt.

Das kann man ausnutzen und ein RegEx setzen.
Hier mein Test: Regex101 - online regex editor and debugger

Und als Code:
Visual Basic:
Public Sub mailTest()
    Const C_MAPI = "myMailadresse@firma.com"
    Const C_FOLDER = "TEST"
  
    'Das Test-Mail auslesen
    Dim otl As Outlook.Application:     Set otl = New Outlook.Application
    Dim ns As Outlook.Namespace:        Set ns = otl.GetNamespace("MAPI")
    Dim fld As Outlook.MAPIFolder:      Set fld = ns.Folders(C_MAPI).Folders(C_FOLDER)
    Dim mail As Outlook.MailItem:       Set mail = fld.items.GetFirst

Ich habe jetzt bei Const C_MAPI meine Emailadresse von meinem Postfach reingeschrieben und bei dem Folder den neu angelegten Ordner Test. Leider sagt er immer das er den Ordner nicht findet.

Ich habe dann mal aus ns.Folders(C_MAPI).Folders(C_FOLDER)

ns.GetDefaultFolder(olFolderInbox).Folders("Test") gemacht.
Dann kommt keine Fehlermeldung aber es kommt kein Debug Print. Es wird nichts ausgegeben.
Im Ordner Test ist die Email drin, die ich hier reingepackt habe.
 

Yaslaw

n/a
Moderator
Ich kenne deine Ordnerstruktuir im Outlook nicht. Bei mir sieht sie so aus.
Unter dem Zensurbalken ist der Ordner, den ich im Code C_MAPI genannt habe
Darunter habe ich den TEST. Du musst dih halt bei dir entsprechen durch deine Struktur angeln.
2020-02-05_152244.jpg
 

jerry0110

Erfahrenes Mitglied
Das habe ich jetzt genauso bei mir.

Habe jetzt nach der If Schleife eine Msgbox eingefügt. (MsgBox rx.test(mail.Body))
Die gibt mir "WAHR" aus.

Also müsste er dann ja den Debug.Print ausführen. Macht er aber nicht.

Aber wenn ich eine Msgbox (msgbox items(0)) am Ende ausführe bekomme ich die Daten.
Dann muss ich ja nur noch statt msgbox die Werte in die Tabelle einführen.
 

Neue Beiträge