joni2000de
Goto Top

Outlook 2010 Marco Empfängermailadresse(n) auslesen - nicht Anzeigename

Hallo Admins,
ich versuche mittels Outlook-Makro die Empfängeradresse eingehender Mails zu ermitteln. Leider wird mir dort immer nur der Anzeigename dargestellt. Gibt es eine Möglichkeit die nackte Mailadresse zu ermitteln? Meine Versuche bisher waren leider erfolglos. Ich zähle auf euch.
Danke & Gruß
Joni

Content-ID: 290908

Url: https://administrator.de/contentid/290908

Ausgedruckt am: 22.11.2024 um 13:11 Uhr

colinardo
colinardo 14.12.2015 aktualisiert um 21:45:35 Uhr
Goto Top
Hallo Joni,
In einem kompletten Kontext mit dem NewMailEx-Event welches auf alle neue Mails reagiert könnte das so aussehen:
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim m As MailItem, varEntryIDs as Variant, i as Integer, objItem as Object
    varEntryIDs = Split(EntryIDCollection, ",")  
    For i = 0 To UBound(varEntryIDs)
        Set objItem = Application.Session.GetItemFromID(varEntryIDs(i))
        If objItem.Class = olMail Then
            Set m = objItem
            For Each rec In m.Recipients
                MsgBox rec.Address
            Next
        End If
    Next
End Sub
Durchlaufe einfach die Recipients Collection des MailObjects und lass dir die Adressen anzeigen.

Grüße Uwe
joni2000de
joni2000de 15.12.2015 aktualisiert um 22:51:14 Uhr
Goto Top
Hallo Uwe,
dein Code liefert mir das gleiche Ergebnis wie einer von meinen (habe zwischenzeitlich schon mehrere Versuche hinter mir). Ich kriege immer die AD-Daten geliefert.
zB
/O=XXXXXXX/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHFXXXXXXXX)/CN=RECIPIENTS/CN=User7XXXXXX
Muss ich die Empfängeradresse auflösen (wenn ja wie mache ich das am einfachsten?; ist der Eintrag dann auch immer eindeutig auch wenn ein Konto mehrere Mailadressen hat?)? Kann es sein, dass Outlook in Kombination mit Exchange die "nackte Mailadresse" von den Exchange bekannten Empfängern gar nicht enthält?
rec.Address liefert obigen Eintrag
rec liefert den Anzeigename

Edit:
Ich habe eine Mail an eine Alias-Adresse geschickt. Diese wird wie die Hauptadresse aufgelöst. Das ist somit keine Lösung, da ich den Original-Empfänger ermitteln möchte. Im Mail-Header steht die richtige Adresse drin. Mich interessieren auch nicht alle Mail-Empfänger aus dem to, cc oder bcc Feld sondern nur die EINE Mailadresse die diese vorliegende Mail effektiv erhalten hat. Komme ich an diese Mailadresse überhaubt ran?

Falls du noch eine Idee hast, bitte gerne.
Danke für deine Hilfe.
Gruß Joni
colinardo
colinardo 15.12.2015 aktualisiert um 22:51:58 Uhr
Goto Top
Jaaaaa, das es hier um einen Exchange geht ging leider nicht aus deinem Post hervor. Bin leider gerade noch länger unterwegs. Poste dir morgen dann im Laufe des Tages die Lösung für den Exchange.

Grüße Uwe

P.s. so aus dem Kopf heraus solltest du die SMTP-Adresse via PropertyAccessor und der entsprechenden MAPI Eigenschaft abfragen können
For each rec in m.Recipients
    Msgbox rec.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E")  
Next
joni2000de
joni2000de 15.12.2015 aktualisiert um 23:12:13 Uhr
Goto Top
Hallo Uwe,
habe gerade oben noch etwas ergänzt. Dass Exchange hier so einen Unterschied macht, war mir bis gerade leider noch nicht klar. Hätte ich mir aber denken können. Ich zähle auf dich face-smile
Unter tags komme ich sowieso nicht gut zum testen. Nur kein Stress.
Danke & Gruß Joni

Edith:
rec.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E")
Hilft leider auch nicht wirklich. Bei einer "richtigen" Adresse wird diese aufgelöst und angezeigt, bei einer Aliasadresse wird aber die dazugehörige "richtige" Adresse geliefert. => Problem da tlw. Alias-Adressen verwendet werden
Wenn die Mail nur als bcc einlangt wird die Mailadresse gar nicht berücksichtigt sondern die sichtbare Adresse angezeigt => für mich kein Problem, da die Mails nicht in bcc einlagen
Das Thema mit der EINEN Mailadresse aus dem Mailheader bleibt. Die ist diejenige die mich primär interessiert. Mit dieser Methode wären theoretisch Mehrfachtreffer möglich für die es wieder eine Logik braucht.
colinardo
colinardo 15.12.2015 aktualisiert um 22:58:04 Uhr
Goto Top
Über den PropertyAccessor kommst du an alle Eigenschaften der Mail muss nur die passende morgen raussuchen ...s. Beispiel oben.
Wenn du willst kannst dich ja schon mal selbst versuchen mit dem Hinweis face-wink
joni2000de
joni2000de 15.12.2015 um 23:47:10 Uhr
Goto Top
Leider erfolglos face-sad
colinardo
Lösung colinardo 16.12.2015, aktualisiert am 17.12.2015 um 00:47:28 Uhr
Goto Top
Das Problem ist das wenn man z.B. über OWA oder einen Outlook-Client intern eine Mail verschickt löst Exchange den Alias automatisch zur Hauptadresse des Postfachs auf und schreibt diese Hauptadresse auch in den TO: Mailheader, dagegen kannst du nichts machen.

Wenn du die tatsächlichen Adressen aus dem TO: Mailheader brauchst hier eine Methode zum Extrahieren der Mailadressen aus dem Transportheader
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim m As MailItem, varEntryIDs As Variant, i As Integer, objItem As Object, regex As Object, headers As String
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True: regex.Global = True: regex.MultiLine = True
    regex.Pattern = "^To:(.*)"  

    varEntryIDs = Split(EntryIDCollection, ",")  
    For i = 0 To UBound(varEntryIDs)
        Set objItem = Application.Session.GetItemFromID(varEntryIDs(i))
        If objItem.Class = olMail Then
            Set m = objItem
            headers = m.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")  
            Set to_matches = regex.Execute(headers)
            If to_matches.Count > 0 Then
                regex.Pattern = "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}"  
                Set to_mails = regex.Execute(to_matches(0).submatches(0))
                If to_mails.Count > 0 Then
                    For Each mail In to_mails
                        MsgBox mail
                    Next
                End If
            End If
        End If
    Next
End Sub
Grüße Uwe
joni2000de
joni2000de 17.12.2015 um 00:47:07 Uhr
Goto Top
Hallo Uwe,
zuerst nochmal danke.
Das richtige Schema hatte ich gefunden (0x007D001E) nur konnte ich nichts damit anfangen.
Der Code liefert zwar immer noch nicht genau das was ich mir gewünscht habe, aber damit kann ich arbeiten. Ich habe mir regex angesehen. Ist noch etwas verwirrend so auf die Schnelle, scheint aber ganz hilfreich zu sein. Ich habe es aber dann doch ohne umgesetzt (werde es mir aber dann noch in Ruhe ansehen).
Dein
 regex.Pattern = "^To:(.*)"  
ist nicht optimal, da bei mehreren Mailadressen, sprich wenn im Header ein Zeilenumbruch vorhanden ist, nur die Adressen der 1. Zeile berücksichtigt werden.

Ich habe das bei mir jetzt so gelöst, dadurch habe ich auch die cc-Adressen gleich mit dabei.
sMailHeader = oMsg.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")  
iVonTMP = InStr(1, LCase(sMailHeader), "to: ")  
iBisTMP = InStr(1, LCase(sMailHeader), "subject: ")  
sMailHeader = Mid(sMailHeader, iVonTMP, iBisTMP - iVonTMP)
sMailHeader = Replace(sMailHeader, Chr(13), "")  
sMailHeader = Replace(sMailHeader, Chr(10), "")  
sMailHeader = Replace(sMailHeader, " ", "")  
sMailHeader = Replace(LCase(sMailHeader), "cc:", ",")  
sMailEmpfängerS = Split(sMailHeader, ",")  

For Each sMailEmpfänger In sMailEmpfängerS
	iVonTMP = InStr(1, LCase(sMailEmpfänger), "<") + 1  
	iBisTMP = InStr(1, LCase(sMailEmpfänger), ">")  
	sMailEmpfänger = Mid(sMailEmpfänger, iVonTMP, iBisTMP - iVonTMP)
	Debug.Print sMailEmpfänger
Next


Das hat bei meinen Test immer geklappt. Jetzt muss ich halt im Code prüfen, welche der Mailadressen die "meine" ist.
Bin wieder etwas gescheiter dank deiner Hilfe.
Schöne Grüße
Joni
colinardo
colinardo 17.12.2015 aktualisiert um 10:14:49 Uhr
Goto Top
Zitat von @joni2000de:
Dein
 regex.Pattern = "^To:(.*)"  
ist nicht optimal, da bei mehreren Mailadressen, sprich wenn im Header ein Zeilenumbruch vorhanden ist, nur die Adressen der 1. Zeile berücksichtigt werden.
Schön das du meinen Test bestanden hast face-smile Mach ich ab und zu ob die Leute sich mit dem Code auch beschäftigen, der Pattern müsste natürlich so lauten:
^To:([\s\S]*)^Subject
Jetzt muss ich halt im Code prüfen, welche der Mailadressen die "meine" ist.
Kannst du ja schnell mit einem Dictionary-Object machen.

Als denn...
Grüße Uwe
joni2000de
joni2000de 18.12.2015 um 11:11:41 Uhr
Goto Top
So so, da habe ich ja nochmal Glück gehalbt. Die Prüfung ist auch schon erledigt. Läuft soweit alles.
Ich habe mich noch mit meinem Internetprovider (ist ein richtiger Guru) unterhalten. Das Thema mit der eindeutigen Mailadresse lässt sich nicht lösen, da jeder Mailserver (im Speziellen Exchange) hier unterschiedlich reagiert. Die besten sind noch die Linux-Server. Da scheint dann unsere Lösung eh die einzige zu sein.
Nochmal danke.
Gru8 Joni