So fügen Sie die Standardsignatur in Outlook hinzu

Ich schreibe ein VBA-Skript in Access, das ein paar Dutzend E-Mails erstellt und automatisch füllt. Es war bisher eine reibungslose Programmierung, aber ich bin neu in Outlook. Wie kann ich nach dem Erstellen des Objekts “mailitem” die Standardsignatur zur E-Mail hinzufügen ?

  1. Dies wäre die Standardsignatur, die beim Erstellen einer neuen E-Mail automatisch hinzugefügt wird.

  2. Im Idealfall möchte ich nur ObjMail.GetDefaultSignature , aber ich kann nichts dergleichen finden.

  3. Momentan verwende ich die function unten (an anderer Stelle im Internet) und verweise auf den genauen Pfad und Dateinamen der HTM-Datei. Aber dies wird von mehreren Personen verwendet und sie haben möglicherweise einen anderen Namen für ihre Standard-HTM-Signatur-Datei. Das funktioniert, aber es ist nicht ideal:

     Function GetBoiler(ByVal sFile As String) As String 'Dick Kusleika Dim fso As Object Dim ts As Object Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2) GetBoiler = ts.readall ts.Close End Function 

    ( getboiler(SigString = "C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt") mit getboiler(SigString = "C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt") aufgerufen getboiler(SigString = "C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt") )

Bearbeiten

Dank JP (siehe Kommentare) merke ich, dass die Standard-Signatur zuerst angezeigt wird, aber sie verschwindet, wenn ich HTMLBody verwende, um der E-Mail eine Tabelle hinzuzufügen. Also meine Frage ist jetzt: Wie zeige ich die Standard-Signatur an und zeige trotzdem eine HTML-Tabelle an?

 Sub X() Dim OlApp As Outlook.Application Dim ObjMail As Outlook.MailItem Set OlApp = Outlook.Application Set ObjMail = OlApp.CreateItem(olMailItem) ObjMail.BodyFormat = olFormatHTML ObjMail.Subject = "Subject goes here" ObjMail.Recipients.Add "Email goes here" ObjMail.HTMLBody = ObjMail.Body & "HTML Table goes here" ObjMail.Display End Sub 

Der folgende Code wird eine Outlook-Nachricht erstellen und die automatische Signatur beibehalten

 Dim OApp As Object, OMail As Object, signature As String Set OApp = CreateObject("Outlook.Application") Set OMail = OApp.CreateItem(0) With OMail .Display End With signature = OMail.body With OMail '.To = "someone@somedomain.com" '.Subject = "Type your email subject here" '.Attachments.Add .body = "Add body text here" & vbNewLine & signature '.Send End With Set OMail = Nothing Set OApp = Nothing 

Meine Lösung ist, zuerst eine leere Nachricht anzuzeigen (mit Standard-Signatur!) Und den beabsichtigten strHTMLBody in den vorhandenen HTMLBody .

Wenn, wie PowerUser sagt, die Signatur beim Bearbeiten von HTMLBody gelöscht wird, können Sie den Inhalt von strTemp sofort nach ObjMail.Display in Variable strTemp ObjMail.Display und anschließend ObjMail.Display hinzufügen, aber das sollte nicht notwendig sein.

 Sub X(strTo as string, strSubject as string, strHTMLBody as string) Dim OlApp As Outlook.Application Dim ObjMail As Outlook.MailItem Set OlApp = Outlook.Application Set ObjMail = OlApp.CreateItem(olMailItem) ObjMail.To = strTo ObjMail.Subject = strSubject ObjMail.Display 'You now have the default signature within ObjMail.HTMLBody. 'Add this after adding strHTMLBody ObjMail.HTMLBody = strHTMLBody & ObjMail.HTMLBody 'ObjMail.Send 'send immediately or 'ObjMail.close olSave 'save as draft 'Set OlApp = Nothing End sub 
 Dim OutApp As Object, OutMail As Object, LogFile As String Dim cell As Range, S As String, WMBody As String, lFile As Long S = Environ("appdata") & "\Microsoft\Signatures\" If Dir(S, vbDirectory) <> vbNullString Then S = S & Dir$(S & "*.htm") Else S = "" S = CreateObject("Scripting.FileSystemObject").GetFile(S).OpenAsTextStream(1, -2).ReadAll WMBody = "
Hi All,

" & _ "Last line,

" & S 'Add the Signature to end of HTML Body

Ich dachte nur, ich würde teilen, wie ich das erreiche. Ich bin mir nicht sicher, ob es im Sinne definierender Variablen korrekt ist, aber es ist klein und leicht zu lesen, was ich mag.

Ich füge WMBody an .HTMLBody innerhalb des Objekts Outlook.Application OLE an.

Hoffe es hilft jemandem.

Danke, Wes.

Outlook fügt die Signatur den neuen unmodifizierten Nachrichten hinzu (Sie sollten den MailItem.Display zuvor nicht ändern), wenn Sie MailItem.Display (wodurch die Nachricht auf dem Bildschirm angezeigt wird) oder wenn Sie auf die Eigenschaft MailItem.GetInspector zugreifen Sie müssen nichts mit dem zurückgegebenen Inspector-Objekt tun, aber Outlook füllt den Nachrichtentext mit der Signatur.

Sobald die Signatur hinzugefügt wurde, lesen Sie die HTMLBody Eigenschaft und führen Sie sie mit der HTML-Zeichenfolge zusammen, die Sie HTMLBody . Beachten Sie, dass Sie nicht einfach 2 HTML-Strings verketten können – die Strings müssen zusammengeführt werden. Wenn Sie beispielsweise Ihre Zeichenfolge an den Anfang des HTML-Body einfügen möchten, suchen Sie nach dem Teiltextteil " , suchen Sie dann das nächste Vorkommen von ">" (dies kümmert sich um das -Element mit Attributen) und fügen Sie es ein Ihre HTML-Zeichenfolge danach ">".

Das Outlook-Objektmodell stellt keine Signaturen überhaupt zur Verfügung.

Im Allgemeinen wird der Name der Signatur in den Kontoprofildaten gespeichert, auf die über die erweiterte MAPI-Schnittstelle von IOlkAccountManager zugegriffen werden kann. Da diese Schnittstelle Extended MAPI ist, kann nur mit C ++ oder Delphi darauf zugegriffen werden. Sie können die Benutzeroberfläche und ihre Daten in OutlookSpy anzeigen, wenn Sie auf die Schaltfläche IOlkAccountManager klicken.
Sobald Sie den Signaturnamen haben, können Sie die HTML-Datei aus dem Dateisystem lesen (beachten Sie, dass der Ordnername (Signaturen in Englisch) lokalisiert ist.
Wenn die Signatur Bilder enthält, müssen sie auch der Nachricht als Anlagen hinzugefügt werden, und die -Tags im Signatur- / Nachrichtenhauptteil müssen so angepasst werden, dass sie das src Attribut auf die Anhänge und nicht auf einen Unterordner des Unterverzeichnisses verweisen wo die Bilder gespeichert sind.
Es liegt ebenfalls in Ihrer Verantwortung, die HTML-Stile aus der Signatur-HTML-Datei mit den Formatvorlagen der Nachricht zusammenzuführen.

Wenn die Verwendung von Redemption eine Option ist, können Sie ihr RDOAccount- Objekt verwenden (zugänglich in jeder Sprache, einschließlich VBA). Der Name der neuen Nachrichtensignatur wird in der 0x0016001F Eigenschaft gespeichert, die Antwortsignatur befindet sich in 0x0017001F . Sie können auch den RDOAccount verwenden . ReplySignature und NewSignature Eigenschaften.
Redemption macht auch RDOSignature verfügbar . ApplyTo Methode, die einen pointers auf das RDOMail- Objekt verwendet und die Signatur an der angegebenen Position korrekt einfügt und die Bilder und Stile miteinander verknüpft :

 set Session = CreateObject("Redemption.RDOSession") Session.MAPIOBJECT = Application.Session.MAPIOBJECT set Drafts = Session.GetDefaultFolder(olFolderDrafts) set Msg = Drafts.Items.Add Msg.To = "user@domain.demo" Msg.Subject = "testing signatures" Msg.HTMLBody = "some bold message text" set Account = Session.Accounts.GetOrder(2).Item(1) 'first mail account if Not (Account Is Nothing) Then set Signature = Account.NewMessageSignature if Not (Signature Is Nothing) Then Signature.ApplyTo Msg, false 'apply at the bottom End If End If Msg.Send 

EDIT : MailItem.GetInspector Juli 2017 MailItem.GetInspector in Outlook 2016 die Signatur nicht mehr ein. Nur MailItem.Display funktioniert.

Ich habe dies zu einer Community-Wiki-Antwort gemacht, weil ich es ohne PowerUsers Recherche und die Hilfe in früheren Kommentaren nicht hätte erstellen können.

Ich nahm PowerUser’s Sub X und fügte hinzu

 Debug.Print "n------" 'with different values for n Debug.Print ObjMail.HTMLBody 

nach jeder Aussage. Von diesem habe ich entdeckt, dass die Signatur nicht innerhalb von .HTMLBody bis nach ObjMail.Display und dann nur, wenn ich dem Körper nichts hinzugefügt habe.

Ich ging zurück zu PowerUsers früherer Lösung, die C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt") . PowerUser war damit unzufrieden, weil er seine Lösung wollte arbeite für andere, die unterschiedliche Unterschriften haben würden.

Meine Signatur befindet sich im selben Ordner und ich kann keine Option zum Ändern dieses Ordners finden. Ich habe nur eine Signatur, also habe ich beim Lesen der einzigen HTM-Datei in diesem Ordner meine einzige / Standard-Signatur erhalten.

Ich habe eine HTML-Tabelle erstellt und diese unmittelbar nach dem -Element in die Signatur eingefügt und den html-Body auf das Ergebnis gesetzt. Ich habe die E-Mail an mich selbst geschickt und das Ergebnis war völlig in Ordnung, vorausgesetzt, du magst meine Formatierung, die ich eingeschlossen habe, um zu überprüfen, ob ich das könnte.

Meine modifizierte Unterroutine ist:

 Sub X() Dim OlApp As Outlook.Application Dim ObjMail As Outlook.MailItem Dim BodyHtml As String Dim DirSig As String Dim FileNameHTMSig As String Dim Pos1 As Long Dim Pos2 As Long Dim SigHtm As String DirSig = "C:\Users\" & Environ("username") & _ "\AppData\Roaming\Microsoft\Signatures" FileNameHTMSig = Dir$(DirSig & "\*.htm") ' Code to handle there being no htm signature or there being more than one SigHtm = GetBoiler(DirSig & "\" & FileNameHTMSig) Pos1 = InStr(1, LCase(SigHtm), "") ' Code to handle there being no closing > for the body element BodyHtml = "" & _ "
HTML table

" BodyHtml = Mid(SigHtm, 1, Pos2 + 1) & BodyHtml & Mid(SigHtm, Pos2 + 2) Set OlApp = Outlook.Application Set ObjMail = OlApp.CreateItem(olMailItem) ObjMail.BodyFormat = olFormatHTML ObjMail.Subject = "Subject goes here" ObjMail.Recipients.Add "my email address" ObjMail.Display End Sub

Da sowohl PowerUser als auch ich unsere Signaturen in C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures schlage ich vor, dass dies der Standardspeicherort für jede Outlook-Installation ist. Kann dieser Standard geändert werden? Ich kann nichts finden, was darauf hindeutet. Der obige Code benötigt eindeutig eine gewisse Entwicklung, aber es erreicht PowerUsers Ziel, einen E-Mail-Textkörper zu erstellen, der eine HTML-Tabelle oberhalb einer Signatur enthält.

Ich habe einen Weg gefunden, aber für die meisten mag es zu schlampig sein. Ich habe ein einfaches Db und ich möchte, dass es E-Mails für mich generieren kann, also hier ist die schlechte und schmutzige Lösung, die ich verwendet habe:

Ich fand, dass der Anfang des Textkörpers der einzige Ort ist, an dem ich die ”

” in der HTMLBody einer neuen E-Mail sehe, also habe ich einfach eine Ersetzung vorgenommen und ersetzt

mit

"

" & sBody

wo sBody ist der Body-Inhalt, den ich einfügen möchte. Scheint so weit zu arbeiten.

 .HTMLBody = Replace(oEmail.HTMLBody, "

", "

" & sBody)

Ich habe diesen Ansatz entwickelt, als ich nach einer Nachricht für einen wiederkehrenden Zeitplan suchte. Ich habe festgestellt, dass der Ansatz, bei dem Sie auf die Inspector-Eigenschaft der erstellten Nachricht verweisen, nicht die gewünschte Signatur hinzugefügt hat (ich habe mehr als ein Konto in Outlook mit separaten Signaturen eingerichtet.)

Der folgende Ansatz ist ziemlich flexibel und immer noch einfach.

  Private Sub Add_Signature(ByVal addy as String, ByVal subj as String, ByVal body as String) Dim oMsg As MailItem Set oMsg = Application.CreateItem(olMailItem) oMsg.To = addy oMsg.Subject = subj oMsg.Body = body Dim sig As String ' Mysig is the name you gave your signature in the OL Options dialog sig = ReadSignature("Mysig.htm") oMsg.HTMLBody = Item.Body & "



" & sig ' oMsg.HTMLBody oMsg.Send Set oMsg = Nothing End Sub Private Function ReadSignature(sigName As String) As String Dim oFSO, oTextStream, oSig As Object Dim appDataDir, sig, sigPath, fileName As String appDataDir = Environ("APPDATA") & "\Microsoft\Signatures" sigPath = appDataDir & "\" & sigName Set oFSO = CreateObject("Scripting.FileSystemObject") Set oTextStream = oFSO.OpenTextFile(sigPath) sig = oTextStream.ReadAll ' fix relative references to images, etc. in sig ' by making them absolute paths, OL will find the image fileName = Replace(sigName, ".htm", "") & "_files/" sig = Replace(sig, fileName, appDataDir & "\" & fileName) ReadSignature = sig End Function

Ich brauche 50 Wiederholungen, um einen Kommentar gegen die Signaturoption zu schreiben, die ich am hilfreichsten fand, aber ich hatte ein Problem mit Bildern, die nicht korrekt angezeigt wurden, also musste ich eine Arbeit finden. Das ist meine Lösung:

Mit @Morris Maynards Antwort als Basis https://StackOverflow.com/a/18455148/2337102 musste ich dann folgendes durchgehen:

Anmerkungen:
Sichern Sie Ihre HTM-Datei, bevor Sie sie starten, kopieren und in einen sekundären Ordner einfügen

  1. Sie werden sowohl mit dem SignatureName.htm als auch dem SignatureName_files Folder

  2. Sie benötigen keine HTML Erfahrung, die Dateien werden in einem Bearbeitungsprogramm wie Notepad oder Notepad ++ oder dem angegebenen HTML-Programm geöffnet

  3. Navigieren Sie zum Speicherort Ihrer Signaturdatei (der Standard sollte C:\Users\"username"\AppData\Roaming\Microsoft\Signatures )

  4. Öffnen Sie die SignatureName.htm Datei in einem Text / HTM-Editor (Rechtsklick auf die Datei, “Edit with Program”)

  5. Verwenden Sie Ctrl+F und geben Sie .png ; .jpg oder wenn Sie Ihren Bildtyp nicht kennen, verwenden Sie image001 Sie sehen etwas wie: src="signaturename_files/image001.png"

  6. Sie müssen dies an der gesamten Adresse des C:\Users\YourName\AppData\Roaming\Microsoft\Signatures\SignatureNameFolder_files\image001
    oder
    src="E:\location\Signatures\SignatureNameFolder_files\image001.png"

  7. Speichern Sie Ihre Datei (überschreiben Sie sie, Sie hatten natürlich das Original gesichert)

  8. Kehren Sie zu Outlook zurück und öffnen Sie das neue E-Mail-Objekt, und fügen Sie Ihre Signatur hinzu. Ich erhielt eine Warnung, dass die Dateien geändert wurden, ich klickte OK, ich musste dies zweimal tun, dann einmal im “Signaturen bearbeiten” -Menü.

    Some of the files in this webpage aren't in the expected location. Do you want to download them anyway? If you're sure the Web page is from a trusted source, click Yes."

  9. Führen Sie Ihr Macro Event aus, die Bilder sollten nun angezeigt werden.

Kredit
MrExcel – VBA Code Signatur Fehler: http://bit.ly/1gap9jY

Die meisten anderen Antworten verketten ihren HTML-Text einfach mit der HTML-Signatur. Dies funktioniert jedoch nicht mit Bildern, und es stellt sich heraus, dass es einen “standardmäßigen” Weg gibt, dies zu tun. 1

Microsoft Outlook vor 2007, das mit WordEditor als Editor und Microsoft Outlook 2007 und darüber hinaus konfiguriert ist, verwenden eine leicht reduzierte Version des Word-Editors zum Bearbeiten von E-Mails. Dies bedeutet, dass wir das Microsoft Word-Dokumentobjektmodell verwenden können, um Änderungen an der E-Mail vorzunehmen.

 Set objMsg = Application.CreateItem(olMailItem) objMsg.GetInspector.Display 'Displaying an empty email will populate the default signature Set objSigDoc = objMsg.GetInspector.WordEditor Set objSel = objSigDoc.Windows(1).Selection With objSel .Collapse wdCollapseStart .MoveEnd WdUnits.wdStory, 1 .Copy 'This will copy the signature End With objMsg.HTMLBody = "

OUR HTML STUFF HERE

" With objSel .Move WdUnits.wdStory, 1 'Move to the end of our new message .PasteAndFormat wdFormatOriginalFormatting 'Paste the copied signature End With 'I am not a VB programmer, wrote this originally in another language so if it does not 'compile it is because this is my first VB method :P

Microsoft Outlook 2007-Programmierung (S. Mosher)> Kapitel 17, Arbeiten mit Objektkörpern: Arbeiten mit Outlook-Signaturen

Ich mag die Antwort von Mozzi , habe aber festgestellt, dass die Standardschriftarten nicht benutzerspezifisch sind. Der Text erschien in einer Systemschrift als normaler Text. Der folgende Code behält die Lieblingsschriftarten des Benutzers bei, während es nur ein wenig länger ist. Es basiert auf dem Ansatz von Mozzi , verwendet einen regulären Ausdruck, um den Standardbodytext zu ersetzen, und platziert den ausgewählten Bodytext des Benutzers mit GetInspector.WordEditor dorthin, wo er hingehört. Ich habe festgestellt, dass der Aufruf von GetInspector nicht den HTMLBody als Dimitry streblechenko oben in diesem Thread, zumindest nicht in Office 2010, bevölkern, so dass das Objekt immer noch in meinem Code angezeigt wird. Bitte beachten Sie, dass es wichtig ist, dass das MailItem als ein Objekt erstellt wird, nicht als ein einfaches MailItem – siehe hier für mehr. (Oh, und Entschuldigung für diejenigen mit unterschiedlichem Geschmack, aber ich bevorzuge längere beschreibende Variablennamen, damit ich Routinen finden kann!)

 Public Function GetSignedMailItemAsObject(ByVal ToAddress As String, _ ByVal Subject As String, _ ByVal Body As String, _ SignatureName As String) As Object '================================================================================================================='Creates a new MailItem in HTML format as an Object. 'Body, if provided, replaces all text in the default message. 'A Signature is appended at the end of the message. 'If SignatureName is invalid any existing default signature is left in place. '================================================================================================================= ' REQUIRED REFERENCES ' VBScript regular expressions (5.5) ' Microsoft Scripting Runtime '================================================================================================================= Dim OlM As Object 'Do not define this as Outlook.MailItem. If you do, some things will work and some won't (ie SendUsingAccount) Dim Signature As String Dim Doc As Word.Document Dim Regex As New VBScript_RegExp_55.RegExp '(can also use use Object if VBScript is not Referenced) Set OlM = Application.CreateItem(olMailItem) With OlM .To = ToAddress .Subject = Subject 'SignatureName is the exactname that you gave your signature in the Message>Insert>Signature Dialog Signature = GetSignature(SignatureName) If Signature <> vbNullString Then ' Should really strip the terminal  vbNullString End With ' OlM Set GetSignedMailItemAsObject = OlM End Function Private Function GetSignature(sigName As String) As String Dim oTextStream As Scripting.TextStream Dim oSig As Object Dim appDataDir, Signature, sigPath, fileName As String Dim FileSys As Scripting.FileSystemObject 'Requires Microsoft Scripting Runtime to be available appDataDir = Environ("APPDATA") & "\Microsoft\Signatures" sigPath = appDataDir & "\" & sigName & ".htm" Set FileSys = CreateObject("Scripting.FileSystemObject") Set oTextStream = FileSys.OpenTextFile(sigPath) Signature = oTextStream.ReadAll ' fix relative references to images, etc. in Signature ' by making them absolute paths, OL will find the image fileName = Replace(sigName, ".htm", "") & "_files/" Signature = Replace(Signature, fileName, appDataDir & "\" & fileName) GetSignature = Signature End Function 

Oft wird diese Frage im Zusammenhang mit der RangeToHTML function von Ron de Bruin RangeToHTML , die ein HTML PublishObject aus einer Excel.Range , diese über das FSO extrahiert und den resultierenden HTML-Stream in den HTMLBody der E-Mail HTMLBody . Dadurch wird die Standardsignatur entfernt (die function RangeToHTML verfügt über eine GetBoiler die versucht, die Standardsignatur einzufügen).

Leider ist die schlecht dokumentierte Application.CommandBars Methode nicht in Outlook verfügbar:

 wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting" 

Es wird eine Laufzeit 6158 auslösen:

Bildbeschreibung hier eingeben

Aber wir können immer noch das Word.Document das über die MailItem.GetInspector Methode MailItem.GetInspector werden kann. So können wir die Auswahl aus Excel in den Outlook-E-Mail- MailItem.GetInspector kopieren und einfügen und dabei Ihre Standardsignatur beibehalten (falls vorhanden).

 Dim rng as Range Set rng = Range("A1:F10") 'Modify as needed With OutMail .To = "xxxxx@xxxxx.com" .BCC = "" .Subject = "Subject" .Display Dim wdDoc As Object '## Word.Document Dim wdRange As Object '## Word.Range Set wdDoc = OutMail.GetInspector.WordEditor Set wdRange = wdDoc.Range(0, 0) wdRange.InsertAfter vbCrLf & vbCrLf 'Copy the range in-place rng.Copy wdRange.Paste End With 

Beachten Sie, dass in einigen Fällen die Spaltenbreiten oder in einigen Fällen die Zeilenhöhen nicht perfekt erhalten bleiben, und obwohl auch Formen und andere Objekte im Excel-Bereich kopiert werden, kann dies zu einigen unklaren Ausrichtungsproblemen führen, aber für einfache Tabellen und Excel reicht, es ist sehr gut:

Bildbeschreibung hier eingeben