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 ?
-
ce serait la signature par défaut qui est automatiquement ajoutée lors de la création d'un nouveau courriel.
-
idéalement, je voudrais juste utiliser
ObjMail.GetDefaultSignature
, mais je ne trouve rien de tel. -
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
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
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
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.
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.
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.
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)
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
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
-
vous travaillerez à la fois avec le
SignatureName.htm
et leSignatureName_files Folder
-
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é -
naviguez La Signature de l'emplacement du Fichier (norme devrait être
C:\Users\"username"\AppData\Roaming\Microsoft\Signatures
) -
ouvrir le fichier
SignatureName.htm
dans un éditeur de texte/htm (clic droit sur le fichier," Modifier avec le programme") -
utilisez
Ctrl+F
et inscrivez.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 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"
-
enregistrer votre fichier (l'écraser, vous aviez bien sûr sauvegardé l'original)
-
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."
-
lancez votre Macro événement, les images devraient maintenant être affichées.
crédit
Nrexcel-VBA code signature code échec: http://bit.ly/1gap9jY
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
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
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:
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: