web-dev-qa-db-fra.com

Comment ajouter une signature par défaut dans Outlook

J'écris un script VBA dans Access qui crée et génère automatiquement quelques dizaines de courriels. Jusqu'à présent, le codage a été fluide, mais je suis nouveau dans Outlook. Après avoir créé l'objet mailitem, , comment puis-je ajouter la signature par défaut à l'e-mail ?

  1. Ce serait la signature par défaut qui est automatiquement ajoutée lors de la création d'un nouvel email.

  2. Idéalement, j'aimerais simplement utiliser ObjMail.GetDefaultSignature, Mais je ne trouve rien de tel.

  3. Actuellement, j'utilise la fonction ci-dessous (trouvée ailleurs sur Internet) et fais référence au chemin et au nom de fichier exacts du fichier htm. Mais cela sera utilisé par plusieurs personnes et elles peuvent avoir un nom différent pour leur fichier de signature HTML 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") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"))

Modifier

Grâce à JP (voir les commentaires), je me rends compte que la signature par défaut apparaît au début, mais elle disparaît lorsque j'utilise HTMLBody pour ajouter un tableau à l'e-mail. Donc, je suppose que ma question est la suivante: comment puis-je afficher la signature par défaut tout en affichant un tableau 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
43
PowerUser

Le code ci-dessous va créer un message Outlook et conserver 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 = "[email protected]"
    '.Subject = "Type your email subject here"
    '.Attachments.Add
    .body = "Add body text here" & vbNewLine & signature
    '.Send
    End With
Set OMail = Nothing
Set OApp = Nothing
47
Julia Jones

Ma solution est d’afficher un vide message en premier (avec la signature par défaut!) et insérez le strHTMLBody prévu dans le HTMLBody existant.

Si, comme dans PowerUser, la signature est effacée lors de la modification de HTMLBody, vous pouvez envisager de stocker le contenu de ObjMail.HTMLBody dans la variable strTemp immédiatement après ObjMail.Display et ajoutez strTemp après, 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
Rick van Dam
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 pensais que je partagerais comment je réalise cela. Je ne sais pas trop si c'est correct dans le sens de la définition des variables, mais c'est petit et facile à lire, c'est ce que j'aime.

J'attache WMBody à .HTMLBody dans l'objet Outlook.Application OLE.

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

Merci Wes.

8
Wesley

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 l'affichage du message à l'écran) ou lorsque vous accédez au MailItem.GetInspector property - vous n'avez rien à faire avec l'objet Inspector renvoyé, mais Outlook remplira le corps du message avec la signature.

Une fois la signature ajoutée, lisez la propriété HTMLBody et fusionnez-la avec la chaîne HTML que vous tentez 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 en haut du corps HTML, cherchez le "<body" sous-chaîne, puis recherchez l'occurrence suivante de ">" (ceci prend en charge le <body> élément avec attributs), puis insérez votre chaîne HTML après ">".

Le modèle d'objet Outlook n'expose pas les signatures.

De manière générale, le nom de la signature est stocké dans les données de profil du compte accessibles via l’interface IOlkAccountManager Interface MAPI étendue. Etant donné que cette interface est Extended MAPI, vous ne pouvez y accéder qu'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 (n'oubliez pas que le nom du dossier (Signatures en anglais) est localisé.
N'oubliez pas non plus que si la signature contient des images, elles doivent également être ajoutées au message en tant que pièces jointes et le <img> balises dans le corps de la signature/du message ajustées pour pointer l'attribut src vers les pièces jointes plutôt que sur un sous-dossier du dossier Signatures où les images sont stockées.
Il vous incombera également de fusionner les styles HTML du fichier HTML de signature avec les styles du message lui-même.

Si Rachat est une option, vous pouvez utiliser son objet RDOAccount (accessible dans toutes les langues, y compris VBA). Le nom de la signature du nouveau message est stocké dans le 0x0016001F propriété, la réponse de signature est dans 0x0017001F. Vous pouvez également utiliser les propriétés RDOAccount .ReplySignature et NewSignature.
Redemption expose également RDOSignature .ApplyTo cette méthode prend un pointeur sur l'objet RDOMail et insère la signature à l'emplacement spécifié, en fusionnant correctement le 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 =   "[email protected]"
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

[~ # ~] éditer [~ # ~] : à partir de juillet 2017, MailItem.GetInspector dans Outlook 2016 n'insère plus la signature. Seulement MailItem.Display Est-ce que.

6

J'ai construit cette approche en cherchant comment envoyer un message selon un calendrier récurrent. J'ai trouvé que l'approche dans laquelle vous faites référence à la propriété Inspecteur du message créé n'ajoutait pas la signature que je voulais (j'ai plusieurs comptes configurés dans Outlook, avec des signatures séparées.)

L'approche ci-dessous est assez souple et reste 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
6
Mozzis

J'ai trouvé un moyen, mais c'est peut-être trop bâclé pour la plupart. J'ai un simple Db et je veux qu'il soit capable de générer des emails pour moi, alors voici la solution basse et sale que j'ai utilisée:

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, alors je viens de faire un simple remplacement, en remplaçant

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

avec

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

où sBody est le contenu du corps que je veux insérer. Semble travailler jusqu'à présent.

.HTMLBody = Replace(oEmail.HTMLBody, "<div class=WordSection1><p class=MsoNormal><o:p>", "<div class=WordSection1><p class=MsoNormal><o:p>" & sBody)
4
Eliot K

J'ai fait en sorte que cette réponse soit un wiki de communauté, car je n'aurais pas pu la créer sans les recherches de PowerUser et l'aide fournie dans les commentaires précédents.

J'ai pris _Sub X_ de PowerUser et ajouté

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

après chaque déclaration. À partir de là, j'ai découvert que la signature ne se trouvait pas dans _.HTMLBody_ avant _ObjMail.Display_ et seulement si je n'ai rien ajouté dans le corps.

Je suis retourné à la solution précédente de PowerUser qui utilisait C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"). PowerUser n'était pas satisfait de cela, car il souhaitait que sa solution fonctionne pour d'autres personnes qui auraient des signatures différentes.

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

J'ai créé un tableau HTML et l'ai inséré dans la signature immédiatement après l'élément <body> et ai défini le corps html sur le résultat. J'ai envoyé l'e-mail à moi-même et le résultat était parfaitement acceptable, à condition que vous aimiez ma mise en forme que j'ai incluse 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
_

Depuis que PowerUser et moi-même avons trouvé nos signatures dans C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures, je suggère qu'il s'agit de l'emplacement standard de toute installation Outlook. Ce défaut peut-il être changé? Je ne trouve rien qui puisse suggérer que ce soit possible. Le code ci-dessus a clairement besoin de développement, mais il permet à PowerUser de créer un corps de courrier électronique contenant un tableau HTML au-dessus d’une signature.

4
Tony Dallimore

La plupart des autres réponses concaténent simplement leur corps HTML avec la signature HTML. Cependant, cela ne fonctionne pas avec les images, et il s'avère qu'il existe un moyen plus "standard" de le faire . 1

Microsoft Outlook pré-2007, qui est configuré avec WordEditor en tant qu'éditeur, et Microsoft Outlook 2007 et les versions ultérieures, utilisent une version légèrement réduite de Word Editor pour modifier les courriers électroniques. Cela signifie que nous pouvons utiliser le modèle d'objet de document Microsoft Word pour modifier le courrier électronique.

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

Programmation Microsoft Outlook 2007 (S. Mosher)> Chapitre 17, Utilisation des corps d'élément: Utilisation des signatures Outlook

3
Birdie

J'ai besoin de 50 représentants pour publier un commentaire sur l'option Signature que j'ai trouvée la plus utile, mais un problème avec les images qui ne s'affichent pas correctement m'a été obligée de trouver un moyen de contourner le problème. Ceci est ma solution:

En utilisant la réponse de @Morris Maynard comme base https://stackoverflow.com/a/18455148/2337102 Je devais alors passer par ce qui suit:

Notes:
Sauvegardez votre fichier .htm avant de démarrer, copiez-collez-le dans un dossier secondaire

  1. Vous travaillerez avec le SignatureName.htm et le SignatureName_files Folder

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

  3. Accédez à l'emplacement de votre fichier de signature (la norme doit être C:\Users\"username"\AppData\Roaming\Microsoft\Signatures)

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

  5. Utilisation Ctrl+F et entrez .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 changer cela en l'adresse complète 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. Sauvegardez votre fichier (écrasez-le, vous avez bien sûr sauvegardé l'original)

  8. Revenez à Outlook et ouvrez un nouvel élément de courrier, ajoutez votre signature. J'ai reçu un avertissement indiquant que les fichiers avaient été modifiés. J'ai cliqué sur OK. Je devais le faire deux fois, puis une fois dans le menu "Éditer 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. Exécutez votre événement Macro, les images devraient maintenant être affichées.

Crédit
MrExcel - Echec du code de signature du code VBA: http://bit.ly/1gap9jY

3
MrsAdmin

J'aime bien la réponse de Mozzi mais j'ai constaté qu'elle ne conservait pas les polices par défaut propres à l'utilisateur. Le texte apparaît dans une police système en tant que 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 de Mozzi , utilise une expression régulière pour remplacer le corps du texte par défaut et place le texte du corps choisi par l'utilisateur à l'aide du script GetInspector.WordEditor. J'ai trouvé que l'appel à GetInspector n'était pas peuplé le HTMLbody comme dimitry streblechenko dit ci-dessus dans ce fil, du moins, pas dans Office 2010, l'objet est toujours affiché dans mon code. En passant, veuillez noter qu’il est important que MailItem soit créé en tant qu’objet, et non en tant que simple MailItem - voir ici pour plus d’informations. (Oh, et pardon pour ceux qui ont des goûts différents, mais je préfère des noms de variables descriptifs plus longs pour pouvoir 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, "$1" & 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
2
Neil Dunlop

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, L'extrait via FSO et insère le flux HTML résultant. dans le courrier électronique HTMLBody. Ce faisant, la signature par défaut est supprimée (la fonction RangeToHTML a une fonction d'assistance GetBoiler qui tente d'insérer la signature par défaut).

Malheureusement, la méthode Application.CommandBars Mal documentée n'est pas disponible via Outlook:

wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting"

Il va soulever une durée d'exécution 6158:

enter image description here

Mais nous pouvons toujours utiliser le Word.Document Qui est accessible via la méthode MailItem.GetInspector, Nous pouvons faire quelque chose comme ceci pour copier et coller la sélection d'Excel dans le corps de l'e-mail Outlook, en préservant votre signature par défaut ( Si il y en a un).

Dim rng as Range
Set rng = Range("A1:F10") 'Modify as needed

With OutMail
    .To = "[email protected]"
    .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, la largeur des colonnes ou les hauteurs des lignes ne sont pas parfaitement préservées. Même si les formes et autres objets de la plage Excel sont également copiés, des problèmes d’alignement complexes peuvent également être rencontrés. Les gammes Excel, c'est très bien:

enter image description here

0
David Zemens