Как добавить подпись по умолчанию в Outlook - PullRequest
43 голосов
/ 25 января 2012

Я пишу сценарий VBA в Access, который создает и автоматически заполняет несколько десятков писем.Пока это было гладкое кодирование, но я новичок в Outlook.После создания объекта mailitem, как добавить подпись по умолчанию к электронному письму ?

  1. Это будет подпись по умолчанию, которая автоматически добавляется при создании нового письма.

  2. В идеале я хотел бы просто использовать ObjMail.GetDefaultSignature, но ничего подобного не могу найти.

  3. В настоящее времяЯ использую функцию ниже (найдено в другом месте в Интернете) и ссылаюсь на точный путь и имя файла htm.Но это будет использоваться несколькими людьми, и они могут иметь другое имя для своего файла подписи htm по умолчанию.Так что это работает, но не идеально:

    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
    

    (Вызывается с getboiler(SigString = "C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"))

Редактировать

Благодаря JP (см. Комментарии), Я понимаю, что сначала появляется подпись по умолчанию, но она исчезает, когда я использую HTMLBody для добавления таблицы в электронное письмо.Итак, я думаю, что мой вопрос сейчас: Как я могу отобразить подпись по умолчанию и по-прежнему отображать 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 ]

47 голосов
/ 01 марта 2013

Код ниже создаст сообщение Outlook и сохранит автоматическую подпись

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
14 голосов
/ 20 октября 2012

Мое решение состоит в том, чтобы сначала отобразить пустое сообщение (с подписью по умолчанию!) И вставить предполагаемое strHTMLBody в существующее HTMLBody.

Если, как и состояния PowerUser,подпись стирается при редактировании HTMLBody. Возможно, вы захотите сохранить содержимое ObjMail.HTMLBody в переменную strTemp сразу после ObjMail.Display и добавить strTemp после этого, но в этом нет необходимости.

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
7 голосов
/ 16 декабря 2013
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

Просто подумал, что поделюсь, как мне этого добиться.Не слишком уверен, что это правильно в смысле определения переменных, но это маленький и легкий для чтения, что мне нравится.

Я присоединяю WMBody к .HTMLBody в объекте Outlook.Application OLE.

Надеюсь, это кому-нибудь поможет.

Спасибо, Уэс.

6 голосов
/ 04 сентября 2015

Outlook добавляет подпись к новым неизмененным сообщениям (вы не должны изменять тело до этого) при вызове MailItem.Display (что приводит к отображению сообщения на экране) или при доступе к свойству MailItem.GetInspector- вам не нужно ничего делать с возвращенным объектом Inspector, но Outlook заполнит тело сообщения подписью.

После добавления подписи прочитайте свойство HTMLBody и объедините его со строкой HTML.что вы пытаетесь установить.Обратите внимание, что вы не можете просто объединить 2 строки HTML - строки должны быть объединены.Например, если вы хотите вставить вашу строку в верхней части тела HTML, найдите подстроку "<body", затем найдите следующее вхождение «>» (это касается элемента <body> с атрибутами), затем вставьтеHTML-строка после этого ">".

Объектная модель Outlook вообще не предоставляет подписи.

В общем примечании имя подписи сохраняется в данных профиля учетной записи, доступных через IOlkAccountManager Расширенный интерфейс MAPI.Поскольку этот интерфейс является расширенным MAPI, доступ к нему возможен только с использованием C ++ или Delphi.Вы можете увидеть интерфейс и его данные в OutlookSpy , если нажмете кнопку IOlkAccountManager.
Получив имя подписи, вы сможете прочитать файл HTML из файловой системы (имейте в виду, чтоимя папки (подписи на английском языке) локализовано.
Также имейте в виду, что если подпись содержит изображения, они также должны быть добавлены в сообщение в виде вложений, а теги <img> в теле подписи / сообщения должны быть скорректированы так, чтобы указыватьатрибут src для вложений, а не подпапки папки Signatures, в которой хранятся изображения.
Вы также будете обязаны объединить стили HTML из файла HTML подписи со стилями самого сообщения.

Если вы используете опцию Redemption , вы можете использовать ее объект RDOAccount (доступный на любом языке, включая VBA). Новое имя подписи сообщения хранится в 0x0016001F свойство, подпись ответа находится в 0x0017001F. Вы также можете использовать RDOAccount . ReplySignature и NewSignature properties.
Redemption также предоставляет метод RDOSignature . ApplyTo, который берет указатель на объект RDOMail и вставляет подпись в указанное место, корректно объединяя изображения и стили:

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

РЕДАКТИРОВАТЬ : по состоянию на июль 2017 года, MailItem.GetInspector в Outlook 2016 больше не вставляет подпись.Только MailItem.Display делает.

6 голосов
/ 27 августа 2013

Я построил этот подход, ища, как отправить сообщение по регулярному расписанию.Я обнаружил, что подход, при котором вы ссылаетесь на свойство Inspector созданного сообщения, не добавляет нужную мне подпись (в Outlook настроено несколько учетных записей с отдельными подписями.)

Подход, приведенный ниже, довольно гибкийи все еще просто.

    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
4 голосов
/ 20 февраля 2013

Я нашел способ, но он может быть слишком небрежным для большинства.У меня есть простой Db, и я хочу, чтобы он мог генерировать для меня электронные письма, поэтому вот грязное и грязное решение, которое я использовал:

Я обнаружил, что начало основного текста - единственное место, где ясм. "<div class=WordSection1>" в HTMLBody нового письма, поэтому я просто сделал простую замену, заменив

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

на

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

где sBody - содержимое тела, которое я хочу вставить.Кажется, работает до сих пор.

.HTMLBody = Replace(oEmail.HTMLBody, "<div class=WordSection1><p class=MsoNormal><o:p>", "<div class=WordSection1><p class=MsoNormal><o:p>" & sBody)
4 голосов
/ 28 января 2012

Я сделал этот ответ вики-сообщества, потому что я не смог бы создать его без исследований PowerUser и помощи в предыдущих комментариях.

Я взял PowerUser's Sub X и добавил

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

после каждого утверждения. Из этого я обнаружил, что подпись находится не в пределах .HTMLBody до тех пор, пока не наступит ObjMail.Display, и только в том случае, если я ничего не добавил в тело.

Я вернулся к более раннему решению PowerUser, которое использовало C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"). PowerUser был недоволен этим, потому что хотел, чтобы его решение работало для тех, у кого другие подписи.

Моя подпись находится в той же папке, и я не могу найти никакой опции, чтобы изменить эту папку. У меня только одна подпись, поэтому, прочитав единственный HTM-файл в этой папке, я получил свою подпись only / default.

Я создал HTML-таблицу и вставил ее в подпись, следующую сразу за элементом , и установил в html-теле результат. Я отправил электронное письмо самому себе, и результат был вполне приемлемым, если вам понравилось мое форматирование, которое я включил, чтобы проверить, что я могу.

Моя измененная подпрограмма:

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

Поскольку и PowerUser, и я нашли наши подписи в C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures, я полагаю, что это стандартное расположение для любой установки Outlook. Можно ли изменить это значение по умолчанию? Я не могу найти что-либо, чтобы предположить, что это может. Приведенный выше код явно нуждается в некоторой разработке, но он действительно достигает цели PowerUser по созданию тела электронной почты, содержащего таблицу HTML над подписью.

3 голосов
/ 21 октября 2016

Большинство других ответов просто объединяют свое тело HTML с подписью HTML.Однако это не работает с изображениями, и оказывается, что есть более «стандартный» способ сделать это. 1

Microsoft Outlook до 2007 года, который настроен с WordEditor в качестве егоредактор и Microsoft Outlook 2007 и более поздние версии используют слегка урезанную версию редактора Word для редактирования электронных писем.Это означает, что мы можем использовать объектную модель документа Microsoft Word для внесения изменений в электронную почту.

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 (С. Мошер)> Глава 17, Работа с телами элементов: Работа сПодписи Outlook

3 голосов
/ 13 февраля 2014

Мне нужно 50 повторений, чтобы оставить комментарий к опции подписи, которая мне показалась наиболее полезной, однако у меня была проблема с неправильным отображением изображений, поэтому мне пришлось искать обходной путь. Это мое решение:

Используя ответ @Morris Maynard в качестве основы https://stackoverflow.com/a/18455148/2337102 Затем мне пришлось пройти через следующее:

Примечания:
Перед запуском создайте резервную копию файла .htm, скопируйте и вставьте в дополнительную папку

  1. Вы будете работать как с SignatureName.htm, так и с SignatureName_files Folder

  2. Вам не нужно HTML опыта, файлы будут открываться в программе редактирования, такой как Notepad или Notepad ++ или в указанной вами HTML-программе

  3. Перейдите к местоположению файла подписи (стандартное значение должно быть C:\Users\"username"\AppData\Roaming\Microsoft\Signatures)

  4. Откройте файл SignatureName.htm в текстовом редакторе / редакторе htm (щелкните файл правой кнопкой мыши, «Редактировать с помощью программы»)

  5. Используйте Ctrl+F и введите .png; .jpg или, если вы не знаете тип изображения, используйте image001 Вы увидите что-то вроде: src="signaturename_files/image001.png"

  6. Вам нужно изменить это на полный адрес местоположения изображения C:\Users\YourName\AppData\Roaming\Microsoft\Signatures\SignatureNameFolder_files\image001
    или
    src="E:\location\Signatures\SignatureNameFolder_files\image001.png"

  7. Сохраните файл (перезапишите его, вы, конечно, сделали резервную копию оригинала)

  8. Вернитесь в Outlook и откройте новый почтовый элемент, добавьте свою подпись. Я получил предупреждение о том, что файлы были изменены, я нажал кнопку «ОК», мне нужно было сделать это дважды, затем один раз в «Меню редактирования подписей».

    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. Запустите событие Macro, теперь должны появиться изображения.

Credit
MrExcel - Ошибка кода подписи кода VBA: http://bit.ly/1gap9jY

2 голосов
/ 21 июня 2016

Мне нравится Mozzi , но я обнаружил, что в нем не сохранены шрифты по умолчанию, специфичные для пользователя.Весь текст отображается системным шрифтом как обычный текст.Приведенный ниже код сохраняет любимые шрифты пользователя, делая его немного длиннее.Он основан на подходе Mozzi , использует регулярное выражение для замены основного текста по умолчанию и размещает выбранный пользователем основной текст, где он принадлежит, с помощью GetInspector.WordEditor.Я обнаружил, что вызов GetInspector не заполнил HTMLbody, как dimitry streblechenko говорит выше в этой теме, по крайней мере, не в Office 2010, поэтому объект все еще отображается в моем коде,Попутно обратите внимание, что важно, чтобы MailItem создавался как Объект, а не как простой MailItem - см. здесь .(О, извините за разные вкусы, но я предпочитаю более длинные описательные имена переменных, чтобы я мог найти процедуры!)

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
...