Adding default signature, that consists of images, in Outlook using Excel VBA

时光总嘲笑我的痴心妄想 提交于 2020-02-28 06:15:12

问题


I want to add signatures with images. Images here refer to company logo and social networking icons.

This code is written in Excel VBA and the goal is to copy paste the range as a picture in Outlook email.

Dim Rng                     As Range
Dim outlookApp              As Object
Dim outMail                 As Object

Dim wordDoc                 As Word.Document
Dim LastRow                 As Long
Dim CcAddress               As String
Dim ToAddress               As String
Dim i                       As Long
Dim EndRow                  As String

Dim Signature               As String

'// Added Microsoft word reference

Sub Excel_Image_Paste_Testing()

    On Error GoTo Err_Desc

    '\\ Define Endrow
    EndRow = Range("A65000").End(xlUp).Row

    '\\ Range for copy paste as image
    Set Rng = Range("A22:G" & EndRow)
    Rng.Copy

    '\\ Open a new mail item
    Set outlookApp = CreateObject("Outlook.Application")
    Set outMail = outlookApp.CreateItem(0)

    '\\ Display message to capture signature
    outMail.Display

    '\\ This doesnt store images because its defined as string
    'Problem lies here
    Signature = outMail.htmlBody

    '\\ Get its Word editor
    Set wordDoc = outMail.GetInspector.WordEditor
    outMail.Display

    '\\ To paste as picture
    wordDoc.Range.PasteAndFormat wdChartPicture

    '\\ TO and CC Address
    CcAddress = "xyz@gmail.com"
    ToAddress = "abc@gmail.com"

    '\\ Format email
    With outMail
        .htmlBody = .htmlBody & Signature
        .Display
        .To = ToAddress
        .CC = CcAddress
        .BCC = ""
        .Subject = "Email Subject here"
        .readreceiptrequested = True
    End With

    '\\ Reset selections
    Application.CutCopyMode = False
    Range("B1").Select

    Exit Sub
Err_Desc:
    MsgBox Err.Description

End Sub

This file is to be distributed to many people. I wouldn’t know the default .htm signature name.

(“AppData\Roaming\Microsoft\Signatures”)

People may also have many signatures but my goal is to capture their default signature.

Error signature picture after running the code

My signature should be as shown below.


回答1:


In this code we will let the user select the .Htm file from AppData\Roaming\Microsoft\Signatures

The problem is that we cannot directly use the html body of this file because the images are stored in a different folder named as filename_files as shown below.

Also the paths mentioned in the htmlbody are incomplete. See the below images

Here is a quick function that I wrote which will fix the paths in the html body

'~~> Function to fix image paths in Signature .htm Files
Function FixHtmlBody(r As Variant) As String
    Dim FullPath As String, filename As String
    Dim FilenameWithoutExtn As String
    Dim foldername As String
    Dim MyData As String

    '~~> Read the html file as text file in a string variable
    Open r For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1

    '~~> Get File Name from path
    filename = GetFilenameFromPath(r)
    '~~> Get File Name without extension
    FilenameWithoutExtn = Left(filename, (InStrRev(filename, ".", -1, vbTextCompare) - 1))
    '~~> Get the foldername where the images are stored
    foldername = FilenameWithoutExtn & "_files"
    '~~> Full Path of Folder
    FullPath = Left(r, InStrRev(r, "\")) & foldername

    '~~> Replace incomplete path with full Path
    FixHtmlBody = Replace(MyData, foldername, FullPath)
End Function

Here is the complete procedure. I have commented the code. Let me know if you still have any issues.

Sub Sample()
    Dim oOutApp As Object, oOutMail As Object
    Dim strbody As String, FixedHtmlBody As String
    Dim Ret

    '~~> Ask user to select the htm file
    Ret = Application.GetOpenFilename("Html Files (*.htm), *.htm")

    If Ret = False Then Exit Sub

    '~~> Use the function to fix image paths in the htm file
    FixedHtmlBody = FixHtmlBody(Ret)

    Set oOutApp = CreateObject("Outlook.Application")
    Set oOutMail = oOutApp.CreateItem(0)

    strbody = "<H3><B>Dear Blah Blah</B></H3>" & _
              "More Blah Blah<br>" & _
              "<br><br><B>Thank you</B>" & FixedHtmlBody

    On Error Resume Next
    With oOutMail
        .To = "Email@email.com" '<~~ Change as applicable
        .CC = ""
        .BCC = ""
        .Subject = "Example on how to insert image in signature"
        .HTMLBody = .HTMLBody & "<br>" & strbody
        .Display
    End With
    On Error GoTo 0

    Set oOutMail = Nothing
    Set oOutApp = Nothing
End Sub

'~~> Function to fix image paths in Signature .htm Files
Function FixHtmlBody(r As Variant) As String
    Dim FullPath As String, filename As String
    Dim FilenameWithoutExtn As String
    Dim foldername As String
    Dim MyData As String

    '~~> Read the html file as text file in a string variable
    Open r For Binary As #1
    MyData = Space$(LOF(1))
    Get #1, , MyData
    Close #1

    '~~> Get File Name from path
    filename = GetFilenameFromPath(r)
    '~~> Get File Name without extension
    FilenameWithoutExtn = Left(filename, (InStrRev(filename, ".", -1, vbTextCompare) - 1))
    '~~> Get the foldername where the images are stored
    foldername = FilenameWithoutExtn & "_files"

    '~~> Full Path of Folder
    FullPath = Left(r, InStrRev(r, "\")) & foldername

    '~~> To cater for spaces in signature file name
    FullPath = Replace(FullPath, " ", "%20")

    '~~> Replace incomplete path with full Path
    FixHtmlBody = Replace(MyData, foldername, FullPath)
End Function

'~~> Gets File Name from path
Public Function GetFilenameFromPath(ByVal strPath As String) As String
    If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then _
    GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1)
End Function

In Action



来源:https://stackoverflow.com/questions/39654861/adding-default-signature-that-consists-of-images-in-outlook-using-excel-vba

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!