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 ?
Ce serait la signature par défaut qui est automatiquement ajoutée lors de la création d'un nouvel email.
Idéalement, j'aimerais simplement utiliser ObjMail.GetDefaultSignature
, Mais je ne trouve rien de tel.
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")
)
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
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
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
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.
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.
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
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)
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.
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
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
Vous travaillerez avec le SignatureName.htm
et le SignatureName_files Folder
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é.
Accédez à l'emplacement de votre fichier de signature (la norme doit être C:\Users\"username"\AppData\Roaming\Microsoft\Signatures
)
Ouvrez le SignatureName.htm
fichier dans un éditeur de texte/htm (clic droit sur le fichier, "Éditer avec le programme")
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"
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
ousrc="E:\location\Signatures\SignatureNameFolder_files\image001.png"
Sauvegardez votre fichier (écrasez-le, vous avez bien sûr sauvegardé l'original)
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."
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
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
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:
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: