Подтвердить что ты не робот

Как добавить подпись по умолчанию в Outlook

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

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

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

  • В настоящее время я использую функцию ниже (найденную в другом месте в Интернете) и ссылаясь на точный путь и имя файла 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
4b9b3361

Ответ 1

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

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

Ответ 2

Мое решение состоит в том, чтобы сначала отобразить сообщение empty (с сигнатурой по умолчанию!) и вставить предполагаемый 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

Ответ 3

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.

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

Спасибо, Wes.

Ответ 4

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

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

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

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

Если использовать Redemption, вы можете использовать его RDOAccount (доступно на любом языке, включая VBA). Новое имя сигнатуры подписки сохраняется в свойстве 0x0016001F, подпись ответа находится в 0x0017001F. Вы также можете использовать свойства RDOAccount. ReplySignature и NewSignature.
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 =   "[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

EDIT: по состоянию на июль 2017 года MailItem.GetInspector в Outlook 2016 больше не вставляет подпись. Только MailItem.Display делает.

Ответ 5

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

Я взял PowerUser 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 файл в этой папке, я получил свою единственную/стандартную подпись.

Я создал таблицу HTML и ввел ее в подпись сразу же после <body> и установите тело 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-таблицу над сигнатурой.

Ответ 6

Я понял способ, но он может быть слишком неаккуратным для большинства. У меня простой 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)

Ответ 7

Я построил этот подход, ища, как отправить сообщение в повторяющийся график. Я нашел подход, в котором вы ссылаетесь на свойство 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

Ответ 8

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

Использование @Morris Maynard в качестве базы fooobar.com/questions/154992/... Затем мне пришлось пройти через следующее:

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

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

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

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

  • Откройте файл SignatureName.htm в редакторе text/htm (щелкните правой кнопкой мыши по файлу "Редактировать с помощью программы" )

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

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

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

  • Вернитесь в 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."

  • Запустите макрос, изображения должны теперь отображаться.

Кредит
Ошибка кода подписи кода кода Execcel - VBA: http://bit.ly/1gap9jY

Ответ 9

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

Microsoft Outlook pre-2007, который настроен с помощью WordEditor в качестве своего редактора, и Microsoft Outlook 2007 и далее, использует слегка сокращенную версию Word Editor для редактирования электронных писем. Это означает, что мы можем использовать объектную модель документа 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

Ответ 10

Мне нравится Mozzi, но обнаружил, что он не сохранил шрифты по умолчанию, которые являются специфичными для пользователя. Текст появился в системном шрифте как обычный текст. Приведенный ниже код сохраняет пользовательские любимые шрифты, делая это только немного дольше. Он основан на подходе Mozzi, использует регулярное выражение для замены текстового текста по умолчанию и помещает выбранный пользователем текст Body, где он принадлежит, используя GetInspector.WordEditor. Я обнаружил, что вызов GetInspector сделал не заполнение HTML-кода как 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

Ответ 11

Часто этот вопрос задается в контексте функции Ron de Bruin RangeToHTML, которая создает HTML PublishObject из Excel.Range, извлекает это через FSO и вставляет полученный поток HTML в адрес электронной почты HTMLBody. При этом удаляется подпись по умолчанию (функция RangeToHTML имеет вспомогательную функцию GetBoiler, которая пытается вставить подпись по умолчанию).

К сожалению, плохо документированный метод Application.CommandBars недоступен через Outlook:

wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting"

Это приведет к увеличению времени выполнения 6158:

введите описание изображения здесь

Но мы все еще можем использовать Word.Document, доступный с помощью метода MailItem.GetInspector, мы можем сделать что-то подобное, чтобы скопировать и вставить выделение из Excel в тело электронной почты Outlook, сохраняя вашу подпись по умолчанию (если есть один).

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

Обратите внимание, что в некоторых случаях это может не полностью сохранить ширину столбцов или в некоторых случаях высоту строки, и, хотя она также скопирует фигуры и другие объекты в диапазоне Excel, это может также вызвать некоторые проблемы с выравниванием фанки, но для простые таблицы и диапазоны Excel, это очень хорошо:

введите описание изображения здесь