Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Problem mit SentOnBehalfOfName

Problem mit SentOnBehalfOfName
13.10.2021 09:19:55
Martin
Ich verwende in Excel diesen Code, um in einem Postfach die Absender von Mails zu ermitteln:

Sub Auslesen()
' open the inbox
Dim ol As Outlook.Application
Dim ns As Namespace
Set ol = New Outlook.Application
Set ns = ol.GetNamespace("MAPI")
Dim inbox As MAPIFolder
Set inbox = ns.Session.Folders("Name des Postfachs").Folders("Posteingang")
Dim outlook_item As Object
Dim Alias As String
For Each outlook_item In inbox.Items
' only look at emails
If outlook_item.Class = olMail Then
Alias = GetAlias(outlook_item, ns)
lz = Cells(65536, 1).End(xlUp).Row
For i = 2 To lz
If Range("A" & i) = Alias Then
Range("M" & i) = "ja"
If outlook_item.UnRead Then
outlook_item.UnRead = False
End If
End If
Next i
End If
Next outlook_item
End Sub

Function GetAlias(outlook_item As Outlook.MailItem, ns As Outlook.Namespace) As String
On Error GoTo err_handler
Dim email_address As String
Dim Alias as String
email_address = outlook_item.SentOnBehalfOfName
' if it's an Exchange format address
If UCase(outlook_item.SenderEmailType) = "EX" Then
' create a recipient
Dim recip As Outlook.Recipient
Set recip = ns.CreateRecipient(outlook_item.SentOnBehalfOfName)
' extract the Alias
Dim user As Outlook.ExchangeUser
Set user = recip.AddressEntry.GetExchangeUser()
Alias = user.Alias
GetAlias = Alias
Exit Function
Else
MsgBox "Für die private email-Absenderadresse " & email_address & " konnten keine Outlookdaten ermittelt werden."
End If
err_handler: MsgBox "Für " & email_address & " konnte kein Alias ermittelt werden"
End Function
Mit SenderEmailAddress anstelle von SentOnBehalfOfName würde es problemlos funktionieren. Viele Mitarbeiter senden aber über die Stellvertreter-Funktion eine Mail "im Auftrag von" für ihre Kollegen, und nur deren Namen interessieren mich dann.
Nun kriege ich bei SentOnBehalfOfName nur den displayName geliefert, also z.B. "Meier, Max". Wenn es im Adressbuch noch einen weiteren ähnlichen Eintrag gibt wie z.B. "Meier, Max (München)" dann crasht der Code in GetAlias. Wenn ich "Meier, Max" manuell in eine neue Outlook Mail als Empfänger setze, kommt eine Abfrage, ob ich "Meier, Max" oder "Meier, Max (München)" meine. Das ist wahrscheinlich der Grund, warum der Code crasht. Gibt es eine Möglichkeit, beim Setzen des recipients diese Abfrage zu unterdrücken bzw. automatisch den Eintrag auszuwählen, der exakt dem vorgegebenen Namen entspricht?
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem mit SentOnBehalfOfName
15.10.2021 17:34:27
Yal
Hallo Martin,
Du musst dich in das Objekt-Modell von Outlook (Verweis auf "Microsoft Outlook x.x Library") und die Unterschied zwischen dem MailItem.Sender, Objekt vom Typ AddressEntry,
https://docs.microsoft.com/de-de/office/vba/api/outlook.mailitem.sender
https://docs.microsoft.com/de-de/office/vba/api/outlook.addressentry
und den Eigenschaft MailItem.SenOnBehaltOf, was nur einen String ist. Siehe Objektkatalog (F2).
Wenn nicht im Namen von anderen gesendet, haben dann MailItem.Sender.Address und MailItem.SentOnBehalfOf dieselbe Wert.
Wenn im Vertretung, dann hast Du einen String. Daraus kannst Kein nicht eindeutig jemand identifiezieren, es sei denn, Du hast von diese Person eine Mail jemals bekommen, und so der Link zwischen String und Objekt.
Viel Erfolg
VG
Yal
Anzeige
AW: Problem mit SentOnBehalfOfName
16.10.2021 10:38:12
Martin
Vielen Dank für die Erläuterung.
Dann wäre der richtige Weg jetzt:
-Prüfung, ob die Mail "im Auftrag von" gesandt wurde (SentOnBehalfOfName vorhanden)
-wenn ja, prüfen, ob mit dem zurückgegebenen String für SentOnBehalfOfName (=displayName) ein Empfänger und sein Alias gefunden wird
-gefunden: alles ok
-nicht gefunden (=Fehler): über Errorhandler dann den Alias aus SenderEmailAddress ermitteln
-wenn nein (nicht im Auftrag einer anderen Person gesendet): Alias gleich aus SenderEmailAddress ermitteln
Jetzt ist für mich nur die Frage, wie ich ermittle, ob die Mail im Auftrag von jemandem versandt wurde, denn wie Du richtig schreibst, ist SentOnBehalfOfName auch dann vorhanden, wenn das nicht erfolgte. Dann wird wahrscheinlich ein String mit dem displayName des Absenders zurückgegeben?
Ich kann ja nicht Objekt und String vergleichen.
Anzeige
nur ne Idee...
16.10.2021 16:27:46
Oberschlumpf
Hi Martin,
ich hab nur eure Texte gelesen. Ich hab mir weder deine Datei angeschaut, und ich hab mich auch nicht näher mit Outlook-VBA-Objekten befasst.
Du schreibst: "Ich kann ja nicht Objekt und String vergleichen."
Ich weiß aber (Outlook is vllt Ausnahme), jedes Objekt (Label, Textbox, ComboBox, usw) hat die Text-Eigenschaft.
Und wäre dann der Vergleich...

If Outlook.Text = MailItem.SenOnBehaltOf Then
hier dein Code
End If
...zwischen Objekt und String nicht doch möglich?
Wie gesagt, nur ne Idee.
Hilfts?
Ciao
Thorsten
Anzeige
AW: Problem mit SentOnBehalfOfName
19.10.2021 11:49:35
Yal
Hallo Martin,
SentOnBehalfOfName ist immer befüllt. Wenn aber SentOnBehalfOfName = MailItem.Sender.AddressEntry, dann sendet der Sender in seinem eigenen Namen.
Wenn nicht, hast Du vom Vertretenen nur eine Adresse (also string, kein "Objekt") und kann daher keine zusätzliche Information über den Chef/Vertretenen bekommen.
Ich würde alle Mails durchgehen, dabei die Versender als Objekt sammeln (Collection). Dann hast für jeden bekannte Versender den Name, die Adresse und die ID (falls Intern). Key diese Collection muss der Name sein.
Dann gehst Du nochmals über alle Mails und wenn ein "SentOnBehalfOfName MailItem.Sender.AddressEntry", dann in diese Liste mit den Namen die fehlende Information suchen.
VG
Yal
Anzeige
AW: Problem mit SentOnBehalfOfName
20.10.2021 18:33:17
Martin
Ich habe es jetzt so gelöst, dass ich zuerst für SenderEmailAdress mir den Anzeigenamen hole:
Set recip = ns.CreateRecipient(outlook_item.SenderEmailAddress)
recip.Resolve
If recip.Resolved Then
displayName = recip.name
End If
Danach prüfe ich, ob outlook_item.SentOnBehalfOfName displayName ist. Nur wenn das der Fall ist, erzeuge ich dann noch einen recipient für outlook_item.SentOnBehalfOfName und hole mir dann dessen Userdaten. Das crasht bei etlichen Mitarbeitern, wenn der Name nicht eindeutig ist, aber da ich das dann ja nur noch in den wenigen Fällen mache, wo die Mail überhaupt "im Auftrag von" gesandt wurde, sind das dann nur noch wenige Fälle, für die ich mir über einen error handler eine Fehlermeldung ausgeben lasse.

Function GetAliasFromMail(outlook_item As outlook.MailItem, ns As outlook.Namespace) As String
On Error GoTo err_handler
Dim Alias As String
Dim displayName As String
Dim user As outlook.ExchangeUser
Dim recip As outlook.Recipient
' if it's an Exchange format address
If UCase(outlook_item.SenderEmailType) = "EX" Then
'create a recipient
Set recip = ns.CreateRecipient(outlook_item.SenderEmailAddress)
recip.Resolve
If recip.Resolved Then
displayName = recip.name
' extract the Alias
Set user = recip.AddressEntry.GetExchangeUser()
Alias = user.Alias
Else
MsgBox "Alias für " & outlook_item.SenderEmailAddress & " (" & outlook_item.SenderEmailAddress & ") konnte nicht ermittelt werden"
End If
If outlook_item.SentOnBehalfOfName  displayName Then 'Mail wurde im Auftrag gesandt
' create a recipient
Set recip = ns.CreateRecipient(outlook_item.SentOnBehalfOfName)
' extract the Alias
Set user = recip.AddressEntry.GetExchangeUser()
Alias = user.Alias
End If
GetAliasFromMail = Alias
Exit Function
Else
MsgBox "Für die private email-Absenderadresse " & outlook_item.SentOnBehalfOfName & " (" & outlook_item.SenderEmailAddress & ") konnten keine Outlookdaten ermittelt werden."
End If
err_handler:     MsgBox "Für " & outlook_item.SentOnBehalfOfName & " (" & outlook_item.SenderEmailAddress & ") konnte kein Alias ermittelt werden"
End Function

Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Problem mit SentOnBehalfOfName in Excel VBA


Schritt-für-Schritt-Anleitung

Um das Problem mit SentOnBehalfOfName in VBA zu lösen, kannst du den folgenden Code verwenden. Dieser Code hilft dir, die Absender von E-Mails zu ermitteln, die im Auftrag eines anderen gesendet wurden.

Sub Auslesen()
    ' Posteingang öffnen
    Dim ol As Outlook.Application
    Dim ns As Namespace
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    Dim inbox As MAPIFolder
    Set inbox = ns.Session.Folders("Name des Postfachs").Folders("Posteingang")
    Dim outlook_item As Object
    Dim Alias As String
    For Each outlook_item In inbox.Items
        ' Nur E-Mails betrachten
        If outlook_item.Class = olMail Then
            Alias = GetAlias(outlook_item, ns)
            lz = Cells(65536, 1).End(xlUp).Row
            For i = 2 To lz
                If Range("A" & i) = Alias Then
                    Range("M" & i) = "ja"
                    If outlook_item.UnRead Then
                        outlook_item.UnRead = False
                    End If
                End If
            Next i
        End If
    Next outlook_item
End Sub

Function GetAlias(outlook_item As Outlook.MailItem, ns As Outlook.Namespace) As String
    On Error GoTo err_handler
    Dim email_address As String
    Dim Alias As String
    email_address = outlook_item.SentOnBehalfOfName
    ' Wenn es eine Exchange-Adresse ist
    If UCase(outlook_item.SenderEmailType) = "EX" Then
        Dim recip As Outlook.Recipient
        Set recip = ns.CreateRecipient(outlook_item.SentOnBehalfOfName)
        Dim user As Outlook.ExchangeUser
        Set user = recip.AddressEntry.GetExchangeUser()
        Alias = user.Alias
        GetAlias = Alias
        Exit Function
    Else
        MsgBox "Für die private E-Mail-Absenderadresse " & email_address & " konnten keine Outlookdaten ermittelt werden."
    End If
err_handler: 
    MsgBox "Für " & email_address & " konnte kein Alias ermittelt werden"
End Function

Häufige Fehler und Lösungen

  • Fehler: sentonbehalfofname not working

    • Überprüfe, ob du die richtigen Berechtigungen für das Postfach hast. Manchmal kann dies die Lesbarkeit von SentOnBehalfOfName beeinflussen.
  • Fehler: Code crasht bei doppelten Namen

    • Stelle sicher, dass du den Namen eindeutig identifizieren kannst. Du kannst auch die SenderEmailAddress verwenden, um den richtigen Alias zu finden.
  • Fehler: senderemailaddress vba gibt falsche Daten zurück

    • Überprüfe, ob die E-Mail im richtigen Format gesendet wurde. Bei der Verwendung von SenderEmailAddress sollte die Adresse korrekt aufgelöst werden.

Alternative Methoden

Eine alternative Methode wäre, statt SentOnBehalfOfName die Sender-Eigenschaft zu verwenden, um den E-Mail-Absender zu identifizieren. Hier ist ein Beispiel:

If outlook_item.Sender.AddressEntry.Name = outlook_item.SentOnBehalfOfName Then
    ' Mail wurde im Auftrag gesendet
End If

Diese Methode kann helfen, die Verwirrung zu vermeiden, wenn mehrere ähnliche Namen vorhanden sind.


Praktische Beispiele

Angenommen, du möchtest alle E-Mails auflisten, die im Auftrag einer bestimmten Person gesendet wurden. Du könntest den folgenden Code verwenden:

Sub ListSentOnBehalf()
    Dim ol As Outlook.Application
    Dim ns As Namespace
    Set ol = New Outlook.Application
    Set ns = ol.GetNamespace("MAPI")
    Dim inbox As MAPIFolder
    Set inbox = ns.Session.Folders("Name des Postfachs").Folders("Posteingang")
    Dim outlook_item As Object
    Dim count As Integer
    count = 1

    For Each outlook_item In inbox.Items
        If outlook_item.Class = olMail Then
            If outlook_item.SentOnBehalfOfName <> "" Then
                Cells(count, 1).Value = outlook_item.SentOnBehalfOfName
                count = count + 1
            End If
        End If
    Next outlook_item
End Sub

Tipps für Profis

  • Nutze die On Error-Anweisung, um Fehler abzufangen und zu behandeln. Dies verhindert, dass dein Code bei unerwarteten Eingaben abstürzt.
  • Halte den Code modular, indem du Funktionen wie GetAlias und ListSentOnBehalf verwendest. Das macht das Debuggen einfacher.
  • Achte darauf, die Microsoft Outlook x.x Library in den Verweisen deines VBA-Projekts zu aktivieren, um auf die Outlook-Objekte zugreifen zu können.

FAQ: Häufige Fragen

1. Was ist sentonbehalfofname? sentonbehalfofname ist eine Eigenschaft in Outlook VBA, die den Namen des Absenders angibt, im Auftrag dessen eine E-Mail gesendet wurde.

2. Warum funktioniert sentonbehalfofname vba nicht immer? Es kann an Berechtigungen oder an den E-Mail-Einstellungen liegen. Wenn die E-Mail nicht korrekt konfiguriert ist, kann diese Eigenschaft leer oder inkorrekt sein.

3. Wie kann ich die SenderEmailAddress in Excel VBA verwenden? Du kannst SenderEmailAddress verwenden, um die E-Mail-Adresse des Absenders zu erhalten. Achte darauf, dass du dies im richtigen Kontext tust.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige