Question

J'écris un script VBA dans l'accès qui crée et populaire automatiquement quelques douzaines de courriels. Jusqu'à présent, cela a été lisse, 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 e-mail.

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

  3. Actuellement, j'utilise la fonction ci-dessous (trouvé autre part sur Internet) et référençant le chemin exact et le nom de fichier du fichier HTM. Mais cela sera utilisé par plusieurs personnes et ils 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") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"))

Éditer

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 une table à l'e-mail. Je suppose donc que ma question est maintenant: comment afficher la signature par défaut et afficher toujours 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
Était-ce utile?

La solution

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

Autres conseils

Ma solution consiste à afficher un vide Message d'abord (avec la signature par défaut!) Et insérez le strHTMLBody dans l'existant HTMLBody.

Si, comme PowerUser les états, la signature est anéantie lors de l'édition de htmlbody, vous pourriez envisager de stocker le contenu de ObjMail.HTMLBody en variable strTemp juste après ObjMail.Display et ajouter 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
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 juste partager comment j'y réaliserais. Je ne sais pas trop si c'est correct dans le sens des variables déterminants, mais il est petit et facile à lire, ce que j'aime.

J'attache wmbody à .htmlbody dans l'objet Outlook.Application ole.

J'espère que cela aide quelqu'un.

Merci, Wes.

Outlook ajoute la signature aux nouveaux messages non modifiés (vous ne devez pas modifier le corps avant cela) lorsque vous appelez MailItem.Display (ce qui provoque l'affichage du message à l'écran) ou lorsque vous accédez au MailItem.GetInspector Propriété - Vous n'avez rien à faire avec l'objet inspecteur retourné, mais Outlook remplira le corps du message avec la signature.

Une fois la signature ajoutée, lisez le HTMLBody propriété et fusionnez-la 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 souhaitez insérer votre chaîne en haut du corps HTML, recherchez le "<body" substrat, puis trouvez l'occurrence suivante de ">" (cela s'occupe du <body> élément avec attributs), puis insérez votre chaîne HTML après cela ">".

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

Sur une note générale, le nom de la signature est stocké dans les données de profil de compte accessibles via le IolkaccountManager Interface MAPI étendue. Étant donné que cette interface est étendue MAPI, elle ne peut être accessible qu'à l'aide de C ++ ou Delphi. Vous pouvez voir l'interface et ses données dans OutlookSpy Si vous cliquez sur le IOlkAccountManager bouton.
Une fois que vous avez le nom de signature, vous pouvez lire le fichier HTML à partir du système de fichiers (gardez à l'esprit que le nom du dossier (signatures en anglais) est localisé.
Gardez également à l'esprit que si la signature contient des images, elles doivent également être ajoutées au message en tant que pièces jointes et <img> Les balises dans le corps de signature / message ajusté pour pointer le point src Attribut aux pièces jointes plutôt qu'à un sous-dossier du dossier Signatures où les images sont stockées.
Il sera également de votre responsabilité de fusionner les styles HTML à partir du fichier HTML de signature avec les styles du message lui-même.

Si vous utilisez Rachat est une option, vous pouvez utiliser son Rdo-compcou objet (accessible dans n'importe quelle langue, y compris VBA). Le nom de signature du nouveau message est stocké dans le 0x0016001F propriété, la signature de réponse est dans 0x0017001F. Vous pouvez également utiliser le Rdo-compcou.ReplySignature et NewSignature Propriétés.
La rédemption expose également Rdosignature.ApplyTo Méthode qui prend un pointeur vers le Radomail objet et insère la signature à l'emplacement 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

ÉDITER: à partir de juillet 2017, MailItem.GetInspector Dans Outlook 2016, n'inserte plus la signature. Seulement MailItem.Display Est-ce que.

J'ai construit cette approche tout en cherchant comment envoyer un message sur un calendrier récurrent. J'ai trouvé l'approche où vous référez la propriété inspecteur du message créé n'a pas ajouté la signature que je voulais (j'ai plus d'un compte configuré dans Outlook, avec des signatures distinctes.)

L'approche ci-dessous est assez flexible et toujours 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

J'en ai fait une réponse wiki communautaire parce que je n'aurais pas pu le créer sans la recherche de PowerSer et l'aide dans les commentaires précédents.

J'ai pris le PowerSer's Sub X et ajouté

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

après chaque déclaration. De là, j'ai découvert que la signature n'est pas à l'intérieur .HTMLBody jusqu'après ObjMail.Display Et puis seulement si je n'ai rien ajouté au corps.

Je suis retourné à la solution antérieure de PowerSer qui a utilisé 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éé une table HTML et l'ai insérée dans la signature immédiatement après leu003Cbody> élément et définissez le corps HTML au résultat. J'ai envoyé l'e-mail à moi-même et le résultat était parfaitement acceptable pour vous fournir comme 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

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

J'ai compris un moyen, mais c'est peut-être trop bâclé pour la plupart. J'ai une base de données simple et je veux qu'elle puisse générer des e-mails pour moi, alors voici la solution Down and Dirty que j'ai utilisée:

J'ai trouvé que le début du texte du corps est le seul endroit où je vois "le"<div class=WordSection1>"Dans le htmlbody d'un nouvel e-mail, donc 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 corporel que je veux insérer. Semble fonctionner jusqu'à présent.

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

J'ai besoin de 50 répétitions pour publier un commentaire contre l'option de signature que j'ai trouvée le plus utile, mais j'ai eu un problème avec des images qui ne se manifestent pas correctement, j'ai donc dû trouver un travail. Ceci 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 ce qui suit:

Remarques:
Sauvegardez votre fichier .htm avant de démarrer, copier et coller dans un dossier secondaire

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

  2. Tu n'as pas besoin HTML Expérience, les fichiers s'ouvriront dans un programme d'édition tel que le bloc-notes ou le bloc-notes ++ ou votre programme HTML spécifié

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

  4. Ouvrir le SignatureName.htm Fichier dans un éditeur texte / HTM (clic droit sur le fichier, "modifier avec le programme")

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

  6. Vous devez changer cela à toute 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. Enregistrez votre fichier (écrasez-le, vous aviez bien sûr sauvegardé l'original)

  8. Revenez à Outlook et ouvrez un nouvel élément de messagerie, ajoutez votre signature. J'ai reçu un avertissement que les fichiers avaient été modifiés, j'ai cliqué sur OK, je devais 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. Exécutez votre événement macro, les images devraient maintenant afficher.

Le crédit
MREXCEL - VBA Code Signature Code défaillance: http://bit.ly/1gap9jy

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 une façon plus "standard" de le faire.1

Microsoft Outlook avant-2007 qui est configuré avec WordEditor comme éditeur et Microsoft Outlook 2007 et au-delà, utilisez une version légèrement coupée de l'éditeur de mots pour modifier les e-mails. Cela signifie que nous pouvons utiliser le modèle d'objet Document Microsoft Word pour apporter des modifications à l'e-mail.

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 Programming (S. Mosher)> Chapitre 17, Travailler avec les corps des articles: Travailler avec les signatures Outlook

j'aime MozziRéponse mais a constaté qu'il ne conservait pas les polices par défaut qui sont spécifiques à 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 la rendant un peu plus longtemps. C'est basé sur MozziL'approche, utilise une expression régulière pour remplacer le texte du corps par défaut et place le texte corporel choisi par l'utilisateur où il appartient en utilisant GetInspector.WordEditor. J'ai trouvé que l'appel à GetInspector a fait ne pas remplir le Htmlbody comme Dimitry Streblechenko Dit ci-dessus dans ce fil, du moins, pas dans Office 2010, donc l'objet est toujours affiché dans mon code. En passant, veuillez noter qu'il est important que le Mailitem soit créé comme un objet, pas comme un Mailitem simple - voir ici pour plus. (Oh, et désolé pour ceux de différents goûts, mais je préfère les noms de variables descriptifs plus longs 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, "$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

Souvent, cette question est posée dans le contexte RangeToHTML fonction, qui crée un HTML PublishObject de un Excel.Range, extrait cela via FSO, et insère le flux résultant HTML dans les e-mails HTMLBody. Ce faisant, cela supprime la signature par défaut (le RangeToHTML La fonction a une fonction d'assistance GetBoiler qui tente d'insérer la signature par défaut).

Malheureusement, le mal documenté Application.CommandBars La méthode n'est pas disponible via Outlook:

wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting"

Il augmentera un runtime 6158:

enter image description here

Mais nous pouvons toujours tirer parti du Word.Document qui est accessible via le MailItem.GetInspector Méthode, nous pouvons faire quelque chose comme ça pour copier et coller la sélection de 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 préserver parfaitement les largeurs de colonne ou dans certains cas les hauteurs de la ligne, et bien qu'elle copie également des formes et d'autres objets dans la gamme Excel, cela peut également entraîner des problèmes d'alignement funky, mais pour les tables simples et Excel Ranges, c'est très bon:

enter image description here

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top