marco8383
Goto Top

Automatische Anrede mit Name in Outlook beim Antworten auf Mails

Hallo zusammen,
ich bin auf der Suche nach einer Lösung für folgendes Problem. Ich nutze Office 365 und Outlook lokal auf dem PC. Da ich jeden Tag zig Mails beantworten muss, hätte ich gerne, dass wenn ich eine Mail beantworte die Anrede mit Name also z.B.: "Hallo Herr XYZ" automatisch eingefügt wird.

Der vollständige Name und E-Mail Adresse ist in den Kontakten vorhanden. Es muss doch irgendwie möglich sein das zu automatisieren?!

Vielleicht hat mir hier jemand einen Tipp?

MfG

Content-ID: 441363

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

Ausgedruckt am: 21.11.2024 um 15:11 Uhr

emeriks
emeriks 18.04.2019 um 09:35:58 Uhr
Goto Top
Hi,
sowas könnte man sicherlich mit einem CRM erschlagen.

E.
139374
139374 18.04.2019 aktualisiert um 09:40:49 Uhr
Goto Top
Mit nem VBA Skript in Outlook normalerweise auch kein Hexenwerk.

Beim Reply Event der Mail in den Kontakten nach der Mail-Adresse suchen und die Anrede extrahieren, im Body einsetzen, fertig.
Marco8383
Marco8383 18.04.2019 aktualisiert um 09:42:40 Uhr
Goto Top
Bei meinem CRM geht das ohne Probleme... Nur nutze ich für Mails Outlook, da der Mail Client vom CRM nicht so toll ist...

Mit VBA Skripten habe ich mich noch nicht auseinander gesetzt... Gibt es hier vielleicht schon etwas fertiges?
139374
139374 18.04.2019 aktualisiert um 09:59:05 Uhr
Goto Top
Auf Anfrage kann ich dir sowas schreiben, für Lau ist das dann aber nicht.
Penny.Cilin
Penny.Cilin 18.04.2019 um 10:05:41 Uhr
Goto Top
Zitat von @Marco8383:

Bei meinem CRM geht das ohne Probleme... Nur nutze ich für Mails Outlook, da der Mail Client vom CRM nicht so toll ist...

Mit VBA Skripten habe ich mich noch nicht auseinander gesetzt... Gibt es hier vielleicht schon etwas fertiges?
OK, schau mal im Internet mit Hilfe Deiner favorisierten Suchmaschine. Ansonsten sind hier bestimmt Communityteilnehmer, welche dies gegen Bezahlerung erledigen. Eine Antwort diesbezüglich hast Du schon bekommen.

Gruss Penny.
colinardo
Lösung colinardo 18.04.2019, aktualisiert am 12.11.2020 um 15:57:23 Uhr
Goto Top
Servus @Marco8383 ,
hab dir das mal schnell in VBA zusammengescriptet. Wurde hier unter Outlook 2019 getestet, sollte aber auch in älteren Versionen und Office 365 laufen. Der Code supported auch sogenannte InlineResponses bei denen ohne Extra Inspector auf Mails geantwortet wird.

back-to-top1. Folgenden Code im VBA-Editor von Outlook im Abschnitt ThisOutlookSession bzw. DieseOutlookSitzung einfügen
' Exlorers object in current application  
Dim WithEvents allExplorers As Explorers
' collection which will hold all explorers  
Dim ExplorerCollection As New Collection

' when new explorer is created  
Private Sub allExplorers_NewExplorer(ByVal Explorer As Explorer)
    On Error Resume Next
    AddExplorerEvents Explorer
End Sub
' on outlook startup  
Private Sub Application_Startup()
    On Error Resume Next
    AddExplorerEvents ActiveExplorer
    Set allExplorers = Application.Explorers
End Sub

Private Sub AddExplorerEvents(ByVal exp As Explorer)
    ' create event class  
    Dim c As New newExplorerClass
    ' and add Explorer Object to its public variable  
    Set c.actExplorer = exp
    ' add explorer to collection  
    ExplorerCollection.Add c
End Sub
back-to-top2. Dann ein neues Klassenmodul über Einfügen > Klassenmodul erstellen. In der Eigenschaften-Pane der Klasse benennt man die Klasse um in newExplorerClass und stellt sicher das die Klasse unter "Instancing" auf Private gestellt ist.

screenshot
back-to-top3. In die neu erstellte Klasse fügt man nun folgenden Code ein:
' Explorer Object to work on  
Public WithEvents actExplorer As Explorer
' current Message object working on  
Dim WithEvents actMessage As MailItem

' Function to get personal salutation  
Private Function GetPersonalSalutationForMailSender(ByVal mail As MailItem) As String
    Dim strSalutation As String, strLastName As String, strCompanyName As String, strTitle As String, folderContacts As Folder
    
    ' search contact from sender address entry  
    ' if the sender is an Exchange User...  
    If mail.Sender.AddressEntryUserType = olExchangeUserAddressEntry Then
        Dim exUser As ExchangeUser
        ' get exange user obect  
        Set exUser = mail.Sender.GetExchangeUser
        If Not exUser Is Nothing Then
            ' get properties  
            strLastName = exUser.LastName
            strCompanyName = exUser.CompanyName
            ' Get title from LDAP "title" attribute (Deutsch: "Position" , sorry there is no real DisplayName Prefix attribute in AD)  
            strTitle = exUser.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3A17001E")  
        End If
    Else    ' other entry  
        Dim c As ContactItem
        ' try to get contact from local address book  
        Set c = mail.Sender.GetContact
        ' if entry found use properties  
        If Not c Is Nothing Then
            strLastName = c.LastName
            strCompanyName = c.CompanyName
            strTitle = c.Title
        End If
    End If
    
    ' when Lastname ist not empty  
    If strLastName <> "" Then  
        ' different salutations for different titles  
        Select Case strTitle
            Case "Herr"  
                strSalutation = "Sehr geehrter Herr " & strLastName & ","  
            Case "Doktor"  
                strSalutation = "Sehr geehrter Doktor " & strLastName & ","  
            Case "Professor"  
                strSalutation = "Sehr geehrter Professor " & strLastName & ","  
            Case "Firma"  
                strSalutation = "Sehr geehrte Firma " & strCompanyName & ","  
            Case "Frau"  
                strSalutation = "Sehr geehrte Frau " & strLastName & ","  
            Case "Familie"  
                strSalutation = "Sehr geehrte Familie " & strLastName & ","  
            Case Else
                strSalutation = "Sehr geehrte Damen und Herren,"  
        End Select
    ' if Lastname is empty check company  
    ElseIf strCompanyName <> "" Then  
        strSalutation = "Sehr geehrte Firma " & strCompanyName & ","  
    Else ' generic string  
        strSalutation = "Sehr geehrte Damen und Herren,"  
    End If
    ' append additional newline to salutation  
    strSalutation = strSalutation & vbNewLine
    ' set return of function  
    GetPersonalSalutationForMailSender = strSalutation
End Function

' Response is Inline-Response  
Private Sub actExplorer_InlineResponse(ByVal Item As Object)
    Dim strSalutation As String

    ' get personal salutation and set body of inline response  
    With Item
        strSalutation = GetPersonalSalutationForMailSender(actMessage)
        If .BodyFormat = olFormatHTML Then
            .HTMLBody = RewriteHTMLBody(.HTMLBody, strSalutation)
        Else
            .body = strSalutation & vbNewLine & .body
        End If
    End With
End Sub
' keep track of current item  
Private Sub actExplorer_SelectionChange()
    If Not actExplorer Is Nothing Then
        With actExplorer
            If .Selection.Count > 0 Then
                If .Selection(1).Class = olMail Then
                    Set actMessage = .Selection(1)
                End If
            End If
        End With
    End If
End Sub


' if item is replied to  
Private Sub actMessage_Reply(ByVal Response As Object, Cancel As Boolean)
    Dim res As MailItem, strSalutation As String, actInspector As Inspector
    Set actInspector = ActiveInspector
    ' check if there is an active Inspector (if not it's an inline response)  
    If Not actInspector Is Nothing Then
        ' if the item in the activeinspector is not the message replied to it's an inlineresponse, so exit event  
        If actInspector.CurrentItem <> actMessage Then Exit Sub
        ' create response  
        Set res = actMessage.Reply
        With res
            ' get personal salutation from Sender-Contact in address book  
            strSalutation = GetPersonalSalutationForMailSender(actMessage)
            ' determine body format and set body  
            If .BodyFormat = olFormatHTML Then
                .HTMLBody = RewriteHTMLBody(.HTMLBody, strSalutation)
            Else
                .body = strSalutation & vbNewLine & .body
            End If
            ' Cancel original response  
            Cancel = True
            ' show new response object  
            .Display
        End With
    End If
End Sub

' prepend HTML content to body  
Function RewriteHTMLBody(body As String, prepend As String) As String
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True
    regex.Pattern = "(<body[^>]*>)([\s\S]+)"  
    RewriteHTMLBody = regex.Replace(body, ("$1" & prepend & "<br/>$2"))  
    Set regex = Nothing
End Function

back-to-top4. Nun im Trust-Center von Outlook sicherstellen das Makros ausgeführt werden dürfen (Datei>Optionen>TrustCenter>"Einstellungen für das Trustcenter"). Entweder alle, oder besser man signiert den Code im VBA Editor und lässt nur signierten Code zu.

screenshot

Wenn man das Projekt signieren möchte macht man das im VBA Editor unter Extras >Digitale Signatur. Hat man das Projekt signiert kann man im TrustCenter umstellen auf die 2. Option von oben indem man nur signierten Code zulässt. Dazu muss dann einmalig beim Start von Outlook der Signatur vertraut werden.

back-to-top5. Nun muss Outlook zwingend neu gestartet sonst kann der Code nicht laufen, da die Events erst nach einem Neustart von Outlook aktiv werden.

Die Anpassung der Begrüßungen kann in der Funktion GetPersonalSalutationForMailSender der Klasse vorgenommen werden.

Viel Spaß damit, wie immer ohne Gewähr auf Leib und Leben.
Grüße Uwe

p.s. Persönliche Anpassungen gerne gegen Aufwandsentschädigung per PN
Daemmerung
Daemmerung 18.04.2019 um 16:44:54 Uhr
Goto Top
Moin,

ich kann dir Phrase Express empfehlen. Ist sehr umfangreich und für Automatisierungen, in Sachen Mail schreiben, perfekt geeignet.

Viele Grüße
Toni
Marco8383
Marco8383 19.04.2019 um 14:04:13 Uhr
Goto Top
Klappt wunderbar! Vielen Dank dafür!
colinardo
colinardo 19.04.2019 um 15:16:52 Uhr
Goto Top
Immer gerne.

Frohe Feiertage.
jensulu
jensulu 22.09.2019 um 21:09:11 Uhr
Goto Top
Probier mal das hier:
Reply Assistant - Vorlagen, automatische Anrede, Serien-E-Mails und mehr für Outlook

Funktioniert ziemlich gut.

Gruß,
Jens
Seba12345
Seba12345 07.04.2020 um 13:54:34 Uhr
Goto Top
danke für den Aufwand. WO sind die Funktionen bei Outlook dann zum ändern. Finde keine. Danke für eine Antwort. face-smile
colinardo
colinardo 07.04.2020 aktualisiert um 15:19:53 Uhr
Goto Top
Zitat von @Seba12345:
Hallo erst mal, so viel Zeit sollte noch sein!
danke für den Aufwand. WO sind die Funktionen bei Outlook dann zum ändern. Finde keine. Danke für eine Antwort. face-smile
Wie meinen? Die Funktionsweise kann in der Funktion unter Punkt 3 ab Zeile 7 im Code nach belieben angepasst werden (GetPersonalSalutationForMailSender). Beschreibung mal vollständig lesen wäre sinnvoll face-wink.

Gruß @colinardo
Seba12345
Seba12345 07.04.2020 um 15:37:46 Uhr
Goto Top
ich hatte es so verstanden, dass ich die einstellungen in outlook direkt verändere. in der VBA kann ich nicht erkennen wo der zusatz "sehr geehrte Damen und Herren" für Emails die keine antworten sind zu ändern ist. Weißt du was ich meine? also beim öffnen einer neuen email. Vllt kannst mir das helfen?? face-smile
colinardo
colinardo 07.04.2020, aktualisiert am 12.02.2022 um 12:12:23 Uhr
Goto Top
Zitat von @Seba12345:

ich hatte es so verstanden, dass ich die einstellungen in outlook direkt verändere.
Nein, geht nicht, deswegen existiert der Thread hier ja face-confused
in der VBA kann ich nicht erkennen wo der zusatz "sehr geehrte Damen und Herren" für Emails die keine antworten sind zu ändern ist.
Der Code oben ist nur für "Antworten" gedacht, weil es nur dort bereits einen Kontakt gibt.

Wenn man den obigen Code noch für "neue Mails" eine Begrüßung ergänzen möchte nimmt man stattdessen diesen Code für die Klasse unter Punkt 3.

In Zeile 153 kannst du dann deinen String anpassen der für neue Mails gilt.
            .Body = "Sehr geehrte Damen und Herren," & vbNewLine & .Body  


' Explorer Object to work on  
Public WithEvents actExplorer As Explorer
' current Message object working on  
Dim WithEvents actMessage As MailItem
' inspector inspection  
Dim WithEvents myInspectors As Inspectors


' Function to get personal salutation  
Private Function GetPersonalSalutationForMailSender(ByVal mail As MailItem) As String
    Dim strSalutation As String, strLastName As String, strCompanyName As String, strTitle As String, folderContacts As Folder
    
    ' search contact from sender address entry  
    ' if the sender is an Exchange User...  
    If mail.Sender.AddressEntryUserType = olExchangeUserAddressEntry Then
        Dim exUser As ExchangeUser
        ' get exange user obect  
        Set exUser = mail.Sender.GetExchangeUser
        If Not exUser Is Nothing Then
            ' get properties  
            strLastName = exUser.LastName
            strCompanyName = exUser.CompanyName
            ' Get title from LDAP "title" attribute (Deutsch: "Position" , sorry there is no real DisplayName Prefix attribute in AD)  
            strTitle = exUser.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x3A17001E")  
        End If
    Else    ' other entry  
        Dim c As ContactItem
        ' try to get contact from local address book  
        Set c = mail.Sender.GetContact
        ' if entry found use properties  
        If Not c Is Nothing Then
            strLastName = c.LastName
            strCompanyName = c.CompanyName
            strTitle = c.Title
        End If
    End If
    
    ' when Lastname ist not empty  
    If strLastName <> "" Then  
        ' different salutations for different titles  
        Select Case strTitle
            Case "Herr"  
                strSalutation = "Sehr geehrter Herr " & strLastName & ","  
            Case "Doktor"  
                strSalutation = "Sehr geehrter Doktor " & strLastName & ","  
            Case "Professor"  
                strSalutation = "Sehr geehrter Professor " & strLastName & ","  
            Case "Firma"  
                strSalutation = "Sehr geehrte Firma " & strCompanyName & ","  
            Case "Frau"  
                strSalutation = "Sehr geehrte Frau " & strLastName & ","  
            Case "Familie"  
                strSalutation = "Sehr geehrte Familie " & strLastName & ","  
            Case Else
                strSalutation = "Sehr geehrte Damen und Herren,"  
        End Select
    ' if Lastname is empty check company  
    ElseIf strCompanyName <> "" Then  
        strSalutation = "Sehr geehrte Firma " & strCompanyName & ","  
    Else ' generic string  
        strSalutation = "Sehr geehrte Damen und Herren,"  
    End If
    ' append additional newline to salutation  
    strSalutation = strSalutation & vbNewLine
    ' set return of function  
    GetPersonalSalutationForMailSender = strSalutation
End Function

Private Sub actExplorer_Activate()
    With actExplorer
        If .Selection.Count > 0 Then
            If .Selection(1).Class = olMail Then
                Set actMessage = .Selection(1)
            End If
        End If
    End With
End Sub

' Response is Inline-Response  
Private Sub actExplorer_InlineResponse(ByVal Item As Object)
    Dim strSalutation As String
    'get personal salutation and set body of inline response  
    With Item
        strSalutation = GetPersonalSalutationForMailSender(actMessage)
        If .BodyFormat = olFormatHTML Then
            .HTMLBody = RewriteHTMLBody(.HTMLBody, strSalutation)
        Else
            .body = strSalutation & vbNewLine & .body
        End If
    End With
End Sub
' keep track of current item  
Private Sub actExplorer_SelectionChange()
    If Not actExplorer Is Nothing Then
        With actExplorer
            If .Selection.Count > 0 Then
                If .Selection(1).Class = olMail Then
                    Set actMessage = .Selection(1)
                End If
            End If
        End With
    End If
End Sub

' if item is replied to  
Private Sub actMessage_Reply(ByVal Response As Object, Cancel As Boolean)
    Dim res As MailItem, strSalutation As String, actInspector As Inspector
    Set actInspector = ActiveInspector
    ' check if there is an active Inspector (if not it's an inline response)  
    If actInspector Is Nothing Then Exit Sub
    ' if the item in the activeinspector is not the message replied to it's an inlineresponse, so exit event  
    If actInspector.CurrentItem <> actMessage Then Exit Sub
    ' Cancel original response  
    Cancel = True
    ' create response  
    Set res = actMessage.Reply

    With res
        'CreateObject("Scripting.FilesystemObject").OpenTextFile("C:\Users\Uwe\Desktop\htmlbody.txt", 2, True).Write .HTMLBody  
        ' get personal salutation from Sender-Contact in address book  
        strSalutation = GetPersonalSalutationForMailSender(actMessage)
        ' determine body format and set body  
        If .BodyFormat = olFormatHTML Then
            .HTMLBody = RewriteHTMLBody(.HTMLBody, strSalutation)
        Else
            .body = strSalutation & vbNewLine & .body
        End If
        ' show new response object  
        .Display
    End With
End Sub

' prepend HTML content to body  
Function RewriteHTMLBody(body As String, prepend As String) As String
    Set regex = CreateObject("vbscript.regexp")  
    regex.IgnoreCase = True
    regex.Pattern = "(<body[^>]*>)([\s\S]+)"  
    RewriteHTMLBody = regex.Replace(body, ("$1" & prepend & "<br/>$2"))  
    Set regex = Nothing
End Function

' class initializer  
Private Sub Class_Initialize()
    ' set inspectors object  
    Set myInspectors = Application.Inspectors
End Sub

' event is run on creation of new inspectors  
Private Sub myInspectors_NewInspector(ByVal Inspector As Inspector)
    With Inspector.CurrentItem
        ' if it's a new item insert a default salutation in the body  
        If .EntryID = "" And .Subject = "" Then  
            .body = "Sehr geehrte Damen und Herren," & vbNewLine & .body  
        End If
    End With
End Sub
colinardo
colinardo 21.05.2020 aktualisiert um 17:57:47 Uhr
Goto Top
Klappt einwandfrei, Outlook 2010-2019 hier getestet! Du machst also bei der Einrichtung einen Fehler oder befolgst die Anleitung nicht exakt, oder interpretierst die angebotene Funktion des Skriptes nicht richtig, beim TO und bei diversen anderen Usern denen ich das Skript per PN zusätzlich weiter angepasst habe läuft es ja auch, der Fehler muss also bei dir liegen. Prüfe erst mal ob das Startup Makro bei dir überhaupt anläuft (Breakpoints setzen um zu sehen ob sie bei dir überhaupt getriggert werden), wenn nicht brauchst du gar nicht weiter zu machen, dann sind Makros bei dir nicht richtig aktiviert worden. Ebenso sind die Positionen der Skripte entscheidend, diese dürfen nicht in irgendwelchen Modulen abgelegt sein! Also mach es richtig dann klappt es auch 100%. Dem Skript ist es egal ob IMAP oder Exchange or whatever, das spielt bei den Makros hier keine Rolle.
Mehr Support gibt's dazu von meiner Seite nur noch per PN!

Btw. schönen Rest von Himmelfahrt.
Uwe

p.s. freundlich Grüßen oder dich an der Community beteiligen darfst du hier gerne auch, nur mal so nebenbei bei kostenlosem Dauer-Support ...
hans932
hans932 05.01.2022 um 11:21:48 Uhr
Goto Top
Hallo Uwe,

erstmal ganz herzlichen Dank für das tolle Skript! Ich glaube, das es eine tolle Hilfe sein könnte, nur leider bekomme ich es nicht zum laufen.

Gleiches Problem unter Outlook 2016 und Outlook 365:

Bei einer neuen Email erscheint "Sehr geehrte Damen und Herren,", dementsprechend scheint das Skript richtig geladen zu werden.
Wenn ich auf eine Email antworte, erscheint leider gar nichts. Wenn ich am Anfang jeder Prozedzur Haltepunkte setze, und dann auf eine Email antworte, durchläuft er
Private Sub actMessage_Reply(ByVal Response As Object, Cancel As Boolean)
    On Error Resume Next
    Dim res As MailItem, strSalutation As String, actInspector As Inspector
    Set actInspector = ActiveInspector
    ' check if there is an active Inspector (if not it's an inline response)  
    If Not actInspector Is Nothing Then
und dann
    End If
End Sub
der gleichen Prozedur.

Dann wird noch
Private Sub myInspectors_NewInspector(ByVal Inspector As Inspector)
durchlaufen, aber ohne Anrede einzufügen - was richtig ist, da es keine neue Email ist.

Hat jemand ein ähnliches Problem - und eine Lösung? face-smile

Danke für Eure Hilfe... Hans
colinardo
colinardo 12.02.2022 aktualisiert um 12:17:06 Uhr
Goto Top
Servus Hans,
aus Interoperabilitätsgründen mit InLine-Response Antworten (mit aktiviertem Lesebereich) musst du die Mail erst in einem neuen Fenster öffnen und dann auf Antworten klicken. Wenn du also keinen Lesebereich nutzt Doppelklick auf die Nachricht und dann auf Antworten klicken, wenn dass nicht gewollt ist Vorschaufenster aktivieren und die Inline-Response nutzen. Der Reply-Eventablauf ist in Outlook leider nicht sehr einheitlich.

Grüße Uwe
hans932
hans932 29.11.2022 um 15:56:41 Uhr
Goto Top
Hallo Uwe,

nach langem Ausprobieren habe ich es zum Laufen bekommen. Es funktioniert gut, nur leider ist im Exchange Adressbuch keine "Position" hinterlegt. D.h. es kommt immer zu "Sehr geehrte Damen und Herren".

Da ich das Exchange Adressbuch nicht ändern kann, habe ich die Kontake in ein lokales Adressbuch gespeichtert. Und wollte dann ein Feld mit der persönlichen Anrede belegen und diese auslesen.

Um die "Position" des Absenders auf dem lokalen Adressbuch zu suchen, ist doch der folgende Code gedacht:
 Dim c As ContactItem
        ' try to get contact from local address book  
        Set c = mail.Sender.GetContact
        ' if entry found use properties  
        If Not c Is Nothing Then
            strLastName = c.LastName
            strCompanyName = c.CompanyName
            strTitle = c.Title
        End If
Leider bleibt "c" immer auf "Nothing" wenn ich mit Haltepunkt die Prozedur durchlaufe und mit der Maus auf "c" zeige.

Danke für Deine / Eure Hilfe!
Hans