Comment ajouter une signature par défaut dans Outlook
-
13-11-2019 - |
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?
Ce serait la signature par défaut qui est automatiquement ajoutée lors de la création d'un nouvel e-mail.
Idéalement, je voudrais simplement utiliser
ObjMail.GetDefaultSignature
, mais je ne trouve rien de tel.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
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
Vous travaillerez avec les deux
SignatureName.htm
et leSignatureName_files Folder
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éAccéder à l'emplacement de votre fichier de signature (la norme devrait être
C:\Users\"username"\AppData\Roaming\Microsoft\Signatures
)Ouvrir le
SignatureName.htm
Fichier dans un éditeur texte / HTM (clic droit sur le fichier, "modifier avec le programme")Utilisation
Ctrl+F
et entrer.png
;.jpg
ou si vous ne connaissez pas votre type d'image, utilisezimage001
Vous verrez quelque chose comme:src="signaturename_files/image001.png"
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"
Enregistrez votre fichier (écrasez-le, vous aviez bien sûr sauvegardé l'original)
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."
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
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:
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: