Как вставить изображение из листа Excel в тело Gmail через Visual Basic?

Я написал один макрос в excel. Я отправляю почту через Gmail. Я отправляю сообщение, но не могу отправить изображение, потому что не могу вставить изображение в тело сообщения Gmail. Ставлю свой код. Также я получаю изображение из активного листа (Sheet4 в соответствии с моим Excel). Как я могу добавить это изображение в текст моего почтового сообщения?

Sub SendGmail(frommail As String, password As String, tomail As String, subject As String, mesaj As String)
    
    Dim pic As String
    pic = CheckImageName
    
                    If pic <> "" Then
                        Sheet4.Shapes(pic).Copy
                    End If
  
    
    
    
    If frommail <> "" And password <> "" And tomail <> "" And subject <> "" And mesaj <> "" Then
      On Error Resume Next
    
       'creating a CDO object
       Dim Mail As CDO.message
       Set Mail = New CDO.message
     
       'Enable SSL Authentication
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    
       'Make SMTP authentication Enabled=true (1)
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
    
       'Set the SMTP server and port Details
       'Get these details from the Settings Page of your Gmail Account
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = _
       "smtp.gmail.com"
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    
       'Set your credentials of your Gmail Account
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/sendusername") = _
       frommail
       Mail.Configuration.Fields.Item _
       ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = _
        password
        
    
       'Update the configuration fields
       Mail.Configuration.Fields.Update
    
       'Set All Email Properties
       With Mail
          .subject = subject
          .From = frommail
          .To = tomail
          .CC = ""
          .BCC = ""
          .HTMLBody = mesaj
       
       
        
       End With
       'to send the mail
       Mail.Send
     If Err <> 0 Then
        'MsgBox "Mail gönderme basarisiz.Eposta Ayarlari sayfasindan mail adresinizi ve sifrenizi kontrol ediniz!!!"
        Call MessageBoxTimer("HATA", "Mail gönderme basarisiz.Eposta Ayarlari sayfasindan mail adresinizi ve sifrenizi kontrol ediniz!!!")
        Exit Sub
     End If
    End If
    
End Sub

person Sezer Erdogan    schedule 13.01.2021    source источник
comment
Прочтите эти рекомендации: stackoverflow.com/help/minimal-reproducible-example   -  person StureS    schedule 13.01.2021
comment
Конечно, если вы хотите вставить изображение в тело, вы не будете использовать .TextBody, а скорее .HTMLBody?   -  person Dean    schedule 16.01.2021
comment
Да знаю .HTMLBody ставлю только пример. Я хочу узнать, как получить изображение с листа и вставить его в Mail Htmlbody.   -  person Sezer Erdogan    schedule 16.01.2021


Ответы (2)


Я поискал вас в Интернете и нашел два варианта. Оба они требуют, чтобы вы использовали файл в файловой системе, второй вариант не лучше всего поддерживается в почтовых клиентах (в Интернете или в приложениях).

Поэтому сначала вам нужно сохранить изображение, которое у вас есть на вашем листе, в файловой системе, если его еще нет. Решение для этого можно найти здесь: Экспорт изображений из файла Excel в jpg с помощью VBA

Метод 1. Используйте встроенные вложения (стандарты MIME)

Добавьте в свой код (и настройте использование вашего img в html-сообщении):

Const CdoReferenceTypeName = 1
Mail.htmlBody = "<html>Check this out: <img src=""cid:myimage.png"" alt=""inline image test""/></html>"
Mail.MimeFormatted = True
Mail.Message.AddRelatedBodyPart("C:\Users\Username\Desktop\test.png", "myimage.png", CdoReferenceTypeName)
Mail.Fields.Item("urn:schemas:mailheader:Content-ID") = "<myimage.png>"
Mail.Fields.Update

Метод 2: двоичное изображение в кодировке base64 в html

Вам нужно добавить ссылку на Microsoft XML, v6.0 (или v3.0)

' Some data you'll need to build your htmlmessage:
Dim encodedImage As String
Dim htmlBody as String
encodedImage = EncodeFile("C:\Users\Username\Desktop\test.png")

' Example htmlBody, look at the img src !
htmlBody = "<html><head></head><body><p><img src=""data:image/png;base64," & encodedImage & """ alt=""base64 encoded image"" /></p></body></html>"

' Extra helper function to base64 encode binary files
' Thanks to https://stackoverflow.com/a/8134022/3090890
Public Function EncodeFile(strPicPath As String) As String
    Const adTypeBinary = 1          ' Binary file is encoded

    ' Variables for encoding
    Dim objXML
    Dim objDocElem

    ' Variable for reading binary picture
    Dim objStream

    ' Open data stream from picture
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Type = adTypeBinary
    objStream.Open
    objStream.LoadFromFile (strPicPath)

    ' Create XML Document object and root node
    ' that will contain the data
    Set objXML = CreateObject("MSXml2.DOMDocument")
    Set objDocElem = objXML.createElement("Base64Data")
    objDocElem.DataType = "bin.base64"

    ' Set binary value
    objDocElem.nodeTypedValue = objStream.Read()

    ' Get base64 value
    EncodeFile = objDocElem.Text

    ' Clean all
    Set objXML = Nothing
    Set objDocElem = Nothing
    Set objStream = Nothing

End Function

Благодаря этим источникам я мог вам помочь: https://stackoverflow.com/a/8134022/3090890 https://www.webdeveloper.com/d/173569-embed-images-in-cdo-mail-message/4

person Piemol    schedule 16.01.2021

Примечание. base64 изображения не будут работать в GMail - Google удаляет такие данные (исходя из опыта создания моих автоматических писем). Мое решение в аналогичном случае заключалось в том, чтобы загрузить вложения в облачный сервис, такой как AWS S3, а затем добавить ссылку на тело HTML, например

<img src='https://my-email-attachments.s3.us-west-2.amazonaws.com/cats.png'>

Другой способ - сохранить изображение локально в вашей системе (Пример код для сохранения фигуры Excel в файл), обновите свой HTML-шаблон, чтобы он соответствовал стандартам MIME (как показано в Методе 1 пользователя @Piemol).

Решение о том, прикрепить или связать, зависит от потребностей вашего бизнеса, и это совсем другой вопрос.

person Lactose.Int.Robot    schedule 22.01.2021