Comment ajouter une signature par défaut dans Outlook

je suis en train d'écrire un script VBA dans Access qui crée et automatise quelques dizaines d'emails. Jusqu'à présent, le codage s'est fait en douceur, mais je suis novice en Outlook. Après avoir créé l'objet mailitem, comment ajouter la signature par défaut à l'email ?

  1. ce serait la signature par défaut qui est automatiquement ajoutée lors de la création d'un nouveau courriel.

  2. idéalement, je voudrais juste utiliser ObjMail.GetDefaultSignature , mais je ne trouve rien de tel.

  3. actuellement, j'utilise la fonction ci-dessous (trouvé ailleurs sur internet) et me référant au chemin exact et au nom de fichier du fichier htm. Mais cela sera utilisé par plusieurs personnes et elles peuvent avoir un nom différent pour leur fichier de signature htm par défaut. Donc cela fonctionne, mais ce n'est pas idéal:

    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
    

    (appelé avec getboiler(SigString = "C:Users" & Environ("username") & "AppDataRoamingMicrosoftSignaturesMysig.txt") )

Modifier

merci à JP (voir commentaires), je me rends compte que la signature par défaut apparaît d'abord, mais elle disparaît quand j'utilise HTMLBody pour ajouter une table à l'email. Alors je suppose que ma question est maintenant: comment afficher la signature par défaut et toujours afficher une table html?

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
40
demandé sur PowerUser 2012-01-25 01:03:18

11 réponses

le code ci-dessous créera un message outlook et conservera la signature automatique

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
44
répondu Julia Jones 2013-03-01 15:52:59

ma solution est d'afficher d'abord un message vide (avec la signature par défaut!) et insérer le strHTMLBody dans le HTMLBody existant .

si, comme les états de PowerUser, la signature est effacée lors de l'édition de HTMLBody, vous pourriez envisager de stocker le contenu de ObjMail.HTMLBody dans la variable strTemp immédiatement après ObjMail.Display et ajouter strTemp ensuite, mais cela ne devrait pas être nécessaire.

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
14
répondu Rick van Dam 2012-10-21 00:27:19
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 = "<br>Hi All,<br><br>" & _
         "Last line,<br><br>" & S 'Add the Signature to end of HTML Body

, je voulais vous dire comment j'y suis arrivé. Pas trop sûr si c'est correct dans le sens des variables de définition, mais il est petit et facile à lire ce qui est ce que j'aime.

j'attache une WMBody .HTMLBody au sein de l'objet Outlook.Application OLE.

J'espère que ça aidera quelqu'un.

Merci, Wes.

6
répondu Wesley 2013-12-16 12:48:09

Outlook ajoute la signature aux nouveaux messages non modifiés (vous ne devez pas modifier le corps avant cela) lorsque vous appelez MailItem.Display (qui provoque le message à être affiché sur l'écran) ou lorsque vous accédez à la propriété MailItem.GetInspector - vous n'avez rien à faire avec L'objet Inspector retourné, mais Outlook remplira le corps du message avec la signature.

une fois la signature ajoutée, lire la propriété HTMLBody et la fusionner avec la Chaîne HTML que vous essayez de définir. Notez que vous ne pouvez pas simplement concaténer 2 chaînes HTML - les chaînes doivent être fusionnées. Par exemple: si vous voulez insérer votre chaîne de caractères au haut du corps HTML, cherchez la chaîne de caractères "<body" , puis trouvez la prochaine occurrence de ">" (ceci prend soin de l'élément <body> avec les attributs), puis insérez votre chaîne de caractères HTML après que ">".

Outlook Object Model n'expose pas du tout les signatures.

sur un note générale, le nom de la signature est stocké dans les données de profil de Compte accessibles par le iolkaccountmanager MAPI interface étendue. Comme cette interface est MAPI étendu, il ne peut être accédé en utilisant C++ ou Delphi. Vous pouvez voir l'interface et ses données dans OutlookSpy si vous cliquez sur le bouton IOlkAccountManager .

Une fois que vous avez le nom de la signature, vous pouvez lire le fichier HTML à partir du système de fichiers (keep in notez que le nom du dossier (Signatures en anglais) est localisé.

Gardez également à l'esprit que si la signature contient des images, celles-ci doivent également être ajoutées au message en tant que pièces jointes et les balises <img> dans le corps de la signature/du message ajustées pour pointer l'attribut src vers les pièces jointes plutôt qu'un sous-dossier du dossier des Signatures où les images sont stockées.

Il sera également de votre responsabilité de fusionner les styles HTML à partir de le fichier HTML de signature avec les styles du message lui-même.

si l'utilisation de Redemption est une option, vous pouvez utiliser son RDOAccount objet (accessible dans n'importe quelle langue, y compris VBA). Nouveau nom de signature de message est stocké dans la propriété 0x0016001F , la signature de réponse est dans 0x0017001F . Vous pouvez également utiliser le RDOAccount . ReplySignature et NewSignature .

La rédemption expose également RDOSignature . ApplyTo méthode qui prend un pointeur à l'objet RDOMail et insère la signature à l'endroit spécifié fusionnant correctement les images et les styles:

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 =   "<html><body>some <b>bold</b> message text</body></html>"
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 : à partir de juillet 2017, MailItem.GetInspector dans Outlook 2016 n'insère plus la signature. Seul MailItem.Display le fait.

5
répondu Dmitry Streblechenko 2017-10-13 16:48:44

j'ai fait de ceci une réponse wiki communautaire parce que je n'aurais pas pu le créer sans les recherches de PowerUser et l'aide dans les commentaires précédents.

J'ai pris le Sub X de PowerUser et j'ai ajouté

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

après chaque déclaration. J'ai découvert que la signature n'est pas dans .HTMLBody jusqu'à après ObjMail.Display et seulement si je n'ai rien ajouté au corps.

Je suis retourné chez Poweruser's plus tôt solution qui utilise C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt") . PowerUser n'était pas satisfait de cela parce qu'il voulait que sa solution fonctionne pour d'autres qui auraient des signatures différentes.

Ma signature est dans le même dossier et je ne trouve aucune option pour modifier ce dossier. Je n'ai qu'une seule signature donc en lisant le seul fichier HTM dans ce dossier, j'ai obtenu ma seule signature/par défaut.

j'ai créé un tableau HTML et l'ai inséré dans la signature immédiatement après le élément < body> et définissez le corps html au résultat. Je me suis envoyé l'email à moi-même et le résultat était parfaitement acceptable à condition que vous aimez mon formatage que j'ai inclus pour vérifier que je pouvais.

mon sous-programme modifié est:

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), "<body")

  ' Code to handle there being no body

  Pos2 = InStr(Pos1, LCase(SigHtm), ">")

  ' Code to handle there being no closing > for the body element

   BodyHtml = "<table border=0 width=""100%"" style=""Color: #0000FF""" & _
         " bgColor=#F0F0F0><tr><td align= ""center"">HTML table</td>" & _
         "</tr></table><br>"
  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

puisque PowerUser et moi avons trouvé nos signatures dans C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures je suggère que c'est l'emplacement standard pour toute installation Outlook. Cette valeur par défaut peut-elle être modifiée? Je ne trouve rien qui le suggère. peut. Le code ci-dessus a clairement besoin d'un certain développement, mais il atteint L'objectif de PowerUser de créer un corps de courrier électronique contenant une table HTML au-dessus d'une signature.

3
répondu Tony Dallimore 2012-01-27 21:32:47

j'ai trouvé un moyen, mais il peut être trop bâclée pour la plupart. J'ai une base de données simple et je veux qu'elle soit capable de générer des e-mails pour moi, donc voici la solution basse et sale que j'ai utilisé:

j'ai trouvé que le début du corps du texte est le seul endroit où je vois le " <div class=WordSection1> "dans le HTMLBody d'un nouvel email, donc je viens de faire un simple remplacement, remplaçant

" <div class=WordSection1><p class=MsoNormal><o:p> "

avec

"<div class=WordSection1><p class=MsoNormal><o:p>" & sBody

où le corps est le contenu du corps que je veux insérer. Semble fonctionner pour autant.

.HTMLBody = Replace(oEmail.HTMLBody, "<div class=WordSection1><p class=MsoNormal><o:p>", "<div class=WordSection1><p class=MsoNormal><o:p>" & sBody)
3
répondu Eliot K 2013-02-20 14:54:48

j'ai construit cette approche tout en cherchant comment envoyer un message sur un horaire récurrent. J'ai trouvé l'approche où vous faites référence à la propriété de L'Inspecteur du message créé n'a pas ajouté la signature que je voulais (j'ai plus d'un compte mis en place dans Outlook, avec des signatures séparées.)

l'approche ci-dessous est assez souple et encore simple.

    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 & "<p><BR/><BR/></p>" & 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
3
répondu Mozzis 2013-08-27 00:31:11

j'ai besoin de 50 rep pour poster un commentaire contre L'Option de Signature que j'ai trouvé la plus utile, mais j'ai eu un problème avec les images ne montrant pas correctement donc j'ai dû trouver un travail autour. C'est ma solution:

en utilisant la réponse de @Morris Maynard comme base https://stackoverflow.com/a/18455148/2337102 j'ai ensuite dû passer par le suivant:

Notes:

Sauvegarder vos .htm file avant de commencer, copier & coller dans un dossier secondaire

  1. vous travaillerez à la fois avec le SignatureName.htm et le SignatureName_files Folder

  2. vous n'avez pas besoin de HTML expérience, les fichiers s'ouvriront dans un programme d'édition tel que Notepad ou Notepad++ ou votre programme HTML spécifié

  3. naviguez La Signature de l'emplacement du Fichier (norme devrait être C:\Users\"username"\AppData\Roaming\Microsoft\Signatures )

  4. ouvrir le fichier SignatureName.htm dans un éditeur de texte/htm (clic droit sur le fichier," Modifier avec le programme")

  5. utilisez Ctrl+F et inscrivez .png ; .jpg ou si vous ne connaissez pas votre type d'image, utilisez image001 Vous verrez quelque chose comme: src="signaturename_files/image001.png"

  6. vous devez changement de l'ensemble de l'adresse de l'emplacement de l'image C:\Users\YourName\AppData\Roaming\Microsoft\Signatures\SignatureNameFolder_files\image001

    ou

    src="E:\location\Signatures\SignatureNameFolder_files\image001.png"

  7. enregistrer votre fichier (l'écraser, vous aviez bien sûr sauvegardé l'original)

  8. retourner à Outlook et ouvrir un nouvel article de courrier, ajouter votre signature. J'ai reçu un avertissement que les fichiers avaient été changés, j'ai cliqué ok, j'ai eu besoin de le faire deux fois, puis une fois dans le Menu "Modifier les Signatures".

    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. lancez votre Macro événement, les images devraient maintenant être affichées.

crédit

Nrexcel-VBA code signature code échec: http://bit.ly/1gap9jY

2
répondu MrsAdmin 2017-05-23 11:54:50

la plupart des autres réponses concaténent simplement leur corps HTML avec la signature HTML. Toutefois, cela ne fonctionne pas avec les images, et il s'avère qu'il y est plus "standard" manière de faire. 1

Microsoft Outlook pre-2007 qui est configuré avec WordEditor comme son éditeur, et Microsoft Outlook 2007 et au-delà, utilisez une version légèrement réduite de L'éditeur Word pour éditer les e-mails. Cela signifie que nous pouvons utiliser le document Microsoft Word Le modèle d'objet pour faire des changements à l'email.

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 = "<p>OUR HTML STUFF HERE</p>"
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 de Programmation (S. Mosher)> Chapitre 17, Travailler avec l'Élément de Corps: Travailler avec Outlook Signatures

2
répondu Birdie 2016-10-21 03:37:00

j'aime Mozzi 's réponse, mais trouve qu'il n'a pas de conserver les polices par défaut qui sont propres à l'utilisateur. Le texte est apparu dans une police système comme texte normal. Le code ci-dessous conserve les polices préférées de l'utilisateur, tout en le rendant un peu plus long. Il est basé sur l'approche Mozzi , utilise une expression régulière pour remplacer le corps de texte par défaut et place le corps de texte choisi par l'utilisateur où il appartient en utilisant Getinsector.WordEditor. Je trouvé que l'appel à Getinsector fait pas peupler le HTMLbody comme dimitry streblechenko dit ci-dessus dans ce fil, au moins, pas au Bureau 2010, de sorte que l'objet est toujours affiché dans mon code. En passant, s'il vous plaît noter qu'il est important que le MailItem est créé comme un objet, pas comme un MailItem simple - voir ici pour plus. (Oh, et désolé à ceux des goûts différents, mais je préfère plus descriptif des noms de variables pour que je puisse trouver des routines!)

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 (i.e. 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 </body tag out of signature by removing all characters from the start of the tag
'        but Outlook seems to handle this OK if you don't bother.
        .Display                                'Needed.  Without it, there is no existing HTMLbody available to work with.
        Set Doc = OlM.GetInspector.WordEditor   'Get any existing body with the WordEditor and delete all of it
        Doc.Range(Doc.Content.Start, Doc.Content.End) = vbNullString 'Delete all existing content - we don't want any default signature
        'Preserve all local email formatting by placing any new body text, followed by the Signature, into the empty HTMLbody.
        With Regex
            .IgnoreCase = True                  'Case insensitive
            .Global = False                     'Regex finds only the first match
            .MultiLine = True                   'In case there are stray EndOfLines (there shouldn't be in HTML but Word exports of HTML can be dire)
            .Pattern = "(<body.*)(?=<\/body)"   'Look for the whole HTMLbody but do NOT include the terminal </body tag in the value returned
            OlM.HTMLbody = .Replace(OlM.HTMLbody, "" & Signature)
        End With ' Regex
        Doc.Range(Doc.Content.Start, Doc.Content.Start) = Body 'Place the required Body before the signature (it will get the default style)
        .Close olSave                           'Close the Displayed MailItem (actually Object) and Save it.  If it is left open some later updates may fail.
    End If ' Signature <> 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
1
répondu Neil Dunlop 2017-05-23 12:18:16

cette question est souvent posée dans le contexte de la fonction RangeToHTML de Ron De Bruin, qui crée un HTML PublishObject à partir d'un Excel.Range , extrait que via FSO, et insère le flux HTML résultant dans le courriel HTMLBody . Ce faisant, cela supprime la signature par défaut (la fonction RangeToHTML a une fonction d'aide GetBoiler qui tente d'insérer la signature par défaut).

malheureusement, le peu documenté Application.CommandBars la méthode N'est pas disponible via Outlook:

wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting"

Il va soulever une exécution 6158:

enter image description here

mais nous pouvons toujours tirer parti de la Word.Document qui est accessible via la méthode MailItem.GetInspector , nous pouvons faire quelque chose comme cela pour copier & coller la sélection D'Excel au corps de messagerie Outlook, en préservant votre signature par défaut (s'il y en a une).

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

notez que dans certains cas cela peut ne pas parfaitement préserver les largeurs de colonne ou dans certains cas les hauteurs de ligne, et bien qu'il va également copier des formes et d'autres objets dans la gamme Excel, cela peut également causer des problèmes d'alignement funky, mais pour les tables simples et les gammes Excel, il est très bon:

enter image description here

0
répondu David Zemens 2017-05-18 15:05:02