Страницы: 1
RSS
Отправка письма с картинкой VBA (outlook)
 
Привет всем,
Нужно сделать возможность отправки картинки в тексте, нашел кучу материала по поводу как их отправлять, отправлять напрямую без вложения, отправлять с вложением, и все это прекрасно работает, но есть одно НО! Это правильно отображается ТОЛЬКО в outlook, в остальных программах \ на сайте почтовика непосредственно, картинки в тексте нет (а на телефоне стоит ее имя вместо отображения, в мазиле на компе "битая картинка", на сайте вообще пустое место) и только в outlook стоит все отлично....
Может кто помочь с этой проблемой, теги прилагаю.
После cid:стоит имя файла 1.jpg (он подгружен в attachemnt)
Pic:<br>   <img src="cid:"   width=width height=height><br><br>
Код
.Attachments.Add TempFilePath & Cells(5, 2).Value, olByValue, 0
где TempFilePath - директория
Cells(5, 2).Value - имя текущего файла.
Так же пробовал вот такие варианты, у всех итог один:
Код
Function IMG(Folder As String, S As String) As String
'IMG = " <br> <img src='cid:" & Folder + S & "'" & " width=width height=height><br><br>"
'IMG = " <br> <img src=""cid:" & Folder + S & """" & " width=width height=height><br><br>"
'IMG = " <br> <img src=""" & Folder + S & """" & " width=width height=height><br><br>"
'IMG = " <br> <img src=""cid:" & Folder + S & """" & "><br><br>"
'IMG = " <br> <img src='cid:" & Folder + S & "'" & "><br><br>"
End Function
Заранее спасибо.
 
а какое отношение ваш вопрос имеет к Excel?
судя по коду (где есть olByValue), этот код запускается не из Excel

да и вообще, где ВЕСЬ код?

Цитата
После cid:стоит имя файла 1.jpg (он подгружен в attachemnt)
а в чём связь между вложением и этим cid?
Изменено: Игорь - 23.05.2018 06:12:08
 
Код
Sub SendMail()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim cell As Range
    Dim TepmFilePath As String
   
    Application.ScreenUpdating = False
    Set OutApp = CreateObject("Outlook.Application")   
    OutApp.Session.Logon
    On Error GoTo cleanup  
    Set OutMail = OutApp.CreateItem(0)   
    On Error Resume Next
    'çàïîëíÿåì ïîëÿ ñîîáùåíèÿ
    With OutMail
        .To = Cells(1, 2).Value
        .Subject = Cells(2, 2).Value
        TempFilePath = "D:\Mailing\"
        .Attachments.Add TempFilePath & Cells(5, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(6, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(7, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(8, 2).Value, olByValue, 0
        .HTMLBody = Cells(3, 2).Value
        Cells(45, 4).Value = Cells(3, 2).Value
        'Set .SendUsingAccount = .Session.Accounts.Item(Cells(1, 3).Value)
        
        .Send
        '.Display
    End With
 
    On Error GoTo 0
    Set OutMail = Nothing
 
cleanup:
    Set OutApp = Nothing
    Application.ScreenUpdating = True
End Sub

<br> <img src='cid:2.jpg' width=width height=height><br><br>
Изменено: Lisper - 23.05.2018 06:26:43
 
нашел одну статью от 2014 года, что <img src='cid:2.jpg' > с прикреплением в attach не работает в большинстве почтовиков... Видно с того времени ничего не изменилось. Советуют использовать кодирование base64. Попробуем...
 
ups
Мои извинения
Изменено: Андрей VG - 23.05.2018 06:35:42
 
PS:
С картинками, подгружаемыми из интернета, работает нормально.
 
а если отправить письма с картинками с сайта почтовика и с телефона и посмотреть их в аутлуке и их тэги?..
 
именно так и делал там есть еще что-то вроде условных операторов и функций (HTML я не знаю, только на уровне копипаста тегов) но все равно берет он картинку из письмо.files/FILENAME, пробовал так (без всяких левых функций, не выходит), решил делать по простому, залил фотки на радикал. Не очень хорошо, но что поделать, время очень ограниченно.
 
https://officetricks.com/excel-vba-inline-image-outlook-email-body/ - посмотрите, может поможет, проверять нет времени, но бросается в глаза, что у вас нет установки формата сообщения HTML
По вопросам из тем форума, личку не читаю.
 
проверил, письма с картинками из аутлука отображаются в яндексе, мэйле, гмэйле...
 
@DenSyo
Отображаются в тексте? какой код вставки в текст?
К сожалению параметр сути не изменил, в Outlook отображается, в мазиле нет.
.BodyFormat = olFormatHTML
Вот это полученное письмо в аутлуке. Он получил на вход картинку и сам чекнул аттачмент
Код
<p class=MsoNormal style='margin-bottom:12.0pt'><br>
<!--[if gte vml 1]><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75"
 o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:663pt;
 height:345.75pt'>
 <v:imagedata src="1111.files/image001.jpg" o:href="1.jpg"/>
</v:shape><![endif]--><![if !vml]><img border=0 src="1111.files/image001.jpg"
v:shapes="_x0000_i1025"><![endif]></p>
А вот что я получил на выходе в мазиле
Код
<br> <img src='1.jpg' width=width height=height><br><br>
Т.е. абсолютно без изменений, именно то, что и подавал на вход. И он сам аттачмент проверять не хочет.
Изменено: Lisper - 23.05.2018 08:49:40
 
Ни в одном из приведенных кодов не видно, чтобы Вы вообще вставляли в сообщение картинку. Как вложение - да. А как часть сообщения - не видать. Вот есть кусок:
Код
    .To = Cells(1, 2).Value
        .Subject = Cells(2, 2).Value
        TempFilePath = "D:\Mailing\"
        .Attachments.Add TempFilePath & Cells(5, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(6, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(7, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(8, 2).Value, olByValue, 0
        .HTMLBody = Cells(3, 2).Value
        Cells(45, 4).Value = Cells(3, 2).Value
        'Set .SendUsingAccount = .Session.Accounts.Item(Cells(1, 3).Value)
         
        .Send
        '.Display
    End With
где тут картинка добавлена в текст сообщения? И я не вижу. Теоретически, должно быть как-то так(но что там у Вас в Cells(3, 2).Value только Вам известно, поэтому просто добавил):
Код
Dim sAttachInline as String
sAttachInline = "<img src='cid:" & Cells(5, 2).Value & "'" & " ><br>"
    .To = Cells(1, 2).Value
        .Subject = Cells(2, 2).Value
        TempFilePath = "D:\Mailing\"
        .Attachments.Add TempFilePath & Cells(5, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(6, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(7, 2).Value, olByValue, 0
        .Attachments.Add TempFilePath & Cells(8, 2).Value, olByValue, 0
        .HTMLBody = Cells(3, 2).Value & sAttachInline
        Cells(45, 4).Value = Cells(3, 2).Value
        'Set .SendUsingAccount = .Session.Accounts.Item(Cells(1, 3).Value)
        .Send
        '.Display
    End With
Cells(5, 2).Value должна содержать имя файла с расширением.
Изменено: Дмитрий Щербаков - 23.05.2018 09:40:55
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, Глазастый Вы. Я пропустил в кодах от Lisper,

по ссылке что указывал №9

       .HTMLBody = "<img src='cid:" & sImgName & "'" & " ><br>" 'Mention only the image file name not its path
       'Or Use this below line.
       '.HTMLBody = "<img src='" & sImgName & "'" & " ><br>"

ну и у вас
      sAttachInline = "<img src='cid:" & Cells(5, 2).Value & "'" & " ><br>"

Lisper,  судя по всему вы ссылку не открывали.
По вопросам из тем форума, личку не читаю.
 
Ну как, в #1 сообщении и указал, и в сообщении #3 указал после кода как выглядит вызов картинки, пробовал и полный путь указывать и только имя, и затем указал в сообщении #11 какое письмо получаю в outlook и в мазиле, а там видно что картинка вызвана, но верно отображается она только в аутлуке.
И еще раз, когда мне надоело мучиться я заменил указатель на картинку из приложения, на указатель на картинку из интернета, (вместо 1.jpg стало blabla.radical...) и все работает во всех браузерах и телефонах и почтовых клиентах.
Т.е. код верный и он работает, он работает для картинок из интернета, и работает для картинок просто (но только в outlook), в остальных почтовых клиентах она попросту не отображается т.к. не находится.

код который вы видели в последнем сообщении это уже после убора всего мусора, пробитие всех тегов в ячейках и компоновки всего HTML кода в одну ячейку. В первом сообщении было указано какие я пробовал варианты (они все работают, но только в outlook).
Изменено: Lisper - 23.05.2018 12:11:59
 
Lisper, вы не пробовали в  Птичке скомпоновать письмо с картинкой и посмотреть, что будет в тегах?
По вопросам из тем форума, личку не читаю.
 
Цитата
Lisper написал:
в #1 сообщении и указал, и в сообщении #3 указал после кода как выглядит вызов картинки
почему не видно внутри кода, где Вы там картинку добавляете? Вы сами видите внутри тегов хоть намек на это? Да, есть некая непонятная функция IMG, которая даже не возвращает значения, а значит даже вызов её внутри другой процедуры ничего не изменит. Неужели даже автору сообщений надо разжевывать что он там накалякал?
Что в первом сообщении, что в третьем, что дальше - нет нигде вменяемого кода по вставке картинки в само сообщение. В первом - везде, где можно что-то похожее найти содержит зачем-то внутри src полный путь к файлу(sFolder), в то время как его и не должно быть.
В другом сообщении каким-то отдельным блоком написано "width=width height=height>". Что это и как понимать? Зачем в качестве width присваивается текст width? Это что нам должно сказать? Почему там не ширина картинки в виде числа?

Вы можете приложить нормальный код, который у Вас получился и сказать: я вот так пытаюсь, но ничего не выходит почему-то? Тогда будет о чем говорить. А сейчас разговор ни о чем. Я свой код попробовал - картинка есть и она успешно приходит на почту Яндекса и Мэйл.ру.

И еще у меня вопрос: Вы используете раннее связывание с Outlook? Если да - то зачем CreateObject? Если нет - то почему olByValue, а не числовая константа? Хотя там все равно должно быть 0, но если Вы по всему коду таких констант напихали - то ошибки неизбежны. Option Explicit явно не используете.
Изменено: Дмитрий Щербаков - 23.05.2018 12:43:16
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Доброе время суток.
Цитата
Lisper написал:
Советуют использовать кодирование base64. Попробуем...
А почему не попробовали? Кода-то как сделать embedded image, в принципе, полно.  Вариант.
Скрытый текст

Успехов.
 
Дмитрий Щербаков
Думал что и так понятно, что эта функция генерирует ссылку, все значения которые там остались закомментированными, тестировались, и еще куча других, которые я попросту удалил.
Или вы думаете что я и процедуру не вызывал?
Вчера писал с помощью этой функции, но так как коду у меня на 18 разных частей / форматирования, и делал я ее не для себя а для людей, то полная компиляций HTML кода происходит на форме. Как выглядят ссылки, которые я пробовал, я прикрепил в виде закомментированной функции. и

По поводу по полного адреса, да моя вина, тут я другого варианта не отобразил, но тоже пробовал.
По поводу  width=width height=height было написано в одном англо-источнике, но я и пробовал без него.
Зачем вызываю createobject, потому что outlook закрыт, он его сам запустит и отправит.

Если у вас получилось принять письмо в браузере на yandex.ru с правильным отображением, отлично! Если не затруднит, поделитесь методом вставки.
Ссылку, о которой я говорил, к сожалению, сейчас найти не смог.
Вот он полный код, сейчас ссылка стоит из интернета.
<br> <img src='https://d.radikal.ru/ХХХХ.jpg' width=width height=height><br><br>
Почему тут width=width height=height не знаю, ибо как говорил, в HTML не вникал, может это чтобы он по широте страницы встал, и не обрезался по краям.
Код
Sub SendMail_auto()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim cell As Range
    Dim TepmFilePath As String
    Dim q As Integer
   
    Application.ScreenUpdating = False
    Set OutApp = CreateObject("Outlook.Application")
    OutApp.Session.Logon
    On Error GoTo cleanup
    q = 1
Do While Worksheets("AUTODATA").Cells(q, 1).Value <> ""
    Cells(1, 2).Value = Worksheets("AUTODATA").Cells(q, 1).Value
    Cells(16, 5).Value = Worksheets("AUTODATA").Cells(q, 2).Value
    
    Set OutMail = OutApp.CreateItem(0)
    On Error Resume Next

    With OutMail

            .To = Cells(1, 2).Value
            .Subject = Cells(2, 2).Value
            .HTMLBody = Cells(3, 2).Value
            .Send
            

    End With
    q = q + 1
Loop
    On Error GoTo 0
    Set OutMail = Nothing
 
cleanup:
    Set OutApp = Nothing
    Application.ScreenUpdating = True
End Sub
Андрей VG
Спасибо, обязательно попробую, пригодится в будущем, но что-то я подумал, что если рассылать большое количество писем, то как там пойдет с загрузкой картинок к каждому сообщению, может и правда нужно было сразу оставить подгрузку из интернета, быстрее отправятся.
Изменено: Lisper - 23.05.2018 13:30:02
Страницы: 1
Читают тему
Наверх