Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.08.2014, 19:47   #1
tromani
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 23
По умолчанию Добавить картинку в тело письма

Доброго времени суток, подскажите с решением такой задачи:

есть картинка пусть JPG надо ее вставить в текст письма (т.е. чтоб она была именно в тексте а не во вложении), поиски по просторам интернета привели к следующим теоретическим выводам:

1. письмецо должно быть Content-Type: multipart/related
2. картинку надо закодить Base64
3. в теле письма надо указать ссылку на часть письма содержащую картинку (вроде того: <IMG SRC="cid:My-Image-Identifier">)

еще тут все это связано с MIME

компоненты Indy
среда XE5

Заранее спасибо за помощь
tromani вне форума Ответить с цитированием
Старый 29.08.2014, 20:09   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от tromani Посмотреть сообщение
еще тут все это связано с MIME
компоненты Indy
Что связано? Какие компоненты используете?
Выражайте свои мысли яснее.
Вот пример отправки письма с картинками.
Streletz вне форума Ответить с цитированием
Старый 29.08.2014, 20:17   #3
tromani
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Какие компоненты используете?
я помоему написал, компоненты Indy

задача не в том чтоб добавить картинку в аттач письма, а в том чтобы
картинка была в теле письма в виде Base64 part

а в части письма которая text/html была ссылка на закодированную методом Base64 картинку

выражусь яснее

http://prntscr.com/4hom68

вот что приходит мне на е-майл
если сделать так:
Код:
Memo1.Lines.Add('<p>');
Memo1.Lines.Add('  <image width="'+IntToStr(bmp.Width)+'"'+
   ' height="'+IntToStr(bmp.Height)+'" src="cid:image_0.jpg"/>');
Memo1.Lines.Add('</p>');

....

idAF:=TIdAttachmentFile.Create(IdMessage1.MessageParts,'d:\image_0.jpg');
idAF.ContentType := 'image/jpg';
idAF.Headers.Add('Content-ID: <image_0.jpg>');
idtTextPart := TIdText.Create(idMessage1.MessageParts, nil);
idtTextPart.ContentType := 'text/html';
idtTextPart.CharSet := 'Windows-1251';
idtTextPart.Body.Text:=Memo1.Text;
Я так понимаю, что картинки надо не как аттач кидать, а в текст письма MIME кодированием, только как все это свести до кучи никак не пойму пока-что, это к вопросу как я связываю это с MIME

Последний раз редактировалось Stilet; 29.08.2014 в 21:45.
tromani вне форума Ответить с цитированием
Старый 29.08.2014, 22:13   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от tromani Посмотреть сообщение
я помоему написал, компоненты Indy
В библиотеку Indy входит множество компонентов и классов. В своём проекте Вы задействуете их все? По последнему посту видно, что нет.
Цитата:
Сообщение от tromani Посмотреть сообщение
Я так понимаю, что картинки надо не как аттач кидать, а в текст письма MIME кодированием,
К сожалению, этот подход в корне не верный. За MIME отвечает TIdAttachmentFile. Он всё сделает за Вас. А, без аттача "почтовику" будет неоткуда брать картинку.
Всё это реализуется через IdText.
Streletz вне форума Ответить с цитированием
Старый 29.08.2014, 22:40   #5
tromani
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Всё это реализуется через IdText.
пробовал так:
Код:
  MSsrc:=TMemoryStream.Create;
  MSdst:=TMemoryStream.Create;
              MSsrc.LoadFromFile(AttFN.Strings[i]);
              MSsrc.Position:=0;
              idMI:=TIdEncoderMIME.Create(nil);
              idMI.Encode(MSsrc,MSdst);
              MSdst.Position:=0;
              idtTextPart := TIdText.Create(idMessage1.MessageParts, nil);
              with  idtTextPart do
              begin
                ContentType := 'image/jpg';
                ContentID:='<image_0>';
                ContentDisposition:='inline; filename="'+ExtractFileName(AttFN.Strings[i])+'"';
                ContentTransfer:='base64';
                Body.LoadFromStream(MSdst);
              end;
              MSsrc.Free;
              MSdst.Free;
аттачмента в виде скрепочки нет но и картинка не отображается
tromani вне форума Ответить с цитированием
Старый 29.08.2014, 23:07   #6
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от tromani;
аттачмента в виде скрепочки нет но и картинка не отображается
Потому что картинки в письме нет. Посмотрите примеры в статье на официальном сайте Indy. Ссылку я давал в своём предыдущем посте. Там всё делается без всяких TMemoryStream, TIdEncoderMIME и пр.
Streletz вне форума Ответить с цитированием
Старый 29.08.2014, 23:22   #7
tromani
Пользователь
 
Регистрация: 10.12.2010
Сообщений: 23
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
Потому что картинки в письме нет.
ну бред то не несите, куда ж она денется то?
я ж могу то открыть исходный текст письма и посмотреть есть там картинка или нет (уже после получения)
http://prntscr.com/4hqlf1
вот картинка на месте...

короче вот код, кто знает в чем дело, подскажите.

Код:
          with TIdText.Create(idMessage1.MessageParts, nil) do
            ContentType := 'multipart/related; type="multipart/alternative"';

          with TIdText.Create(idMessage1.MessageParts, nil) do
          begin
            ContentType := 'multipart/alternative';
            ParentPart:=0;
          end;

          with TIdText.Create(idMessage1.MessageParts, nil) do
          begin
            ContentType := 'text/html';
            CharSet := 'Windows-1251';
            Body.Text:=Memo1.Text;
            ParentPart:=1;
          end;

          if AttFN.Count>0 then
            for i := 0 to AttFN.Count-1 do
            begin
              with TIdAttachmentFile.Create(IdMessage1.MessageParts,AttFN.Strings[i]) do
              begin
                ContentID:='<image_0>';
                ContentType := 'image/jpg';
                ContentDisposition :='inline';
                FileName:=AttFN.Strings[i];
                ParentPart:=0;
              end;
HTML текст в мемо1 см. выше

вопрос закрыт. причину нашел
был неверный HTML текст.

Последний раз редактировалось tromani; 29.08.2014 в 23:47.
tromani вне форума Ответить с цитированием
Старый 30.08.2014, 00:03   #8
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Радость

Поздравляю!
Цитата:
Сообщение от tromani Посмотреть сообщение
ну бред то не несите, куда ж она денется то?
Почему сразу бред? По Вашему у других, в том числе у меня, есть возможность всесторонне протестировать работу Вашей программы?
В прочем вопрос темы не об этом да и, как говорится, всё хорошо, когда хорошо кончается!
Streletz вне форума Ответить с цитированием
Старый 30.08.2014, 09:21   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
HTML текст в мемо1 см. выше
Я инди не пользуюсь для передачи вложений, но одно могу сказать точно: Не все почтовые клиенты до сих пор поддерживают HTML, так что поосторожнее в надеждах. Сам так попался.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить картинку в тело письма LISTAT Работа с сетью в Delphi 3 10.06.2014 15:17
html в тело письма МашаМаша Помощь студентам 0 11.10.2012 17:59
Не вставляется изображение в тело письма Goerg Microsoft Office Excel 1 23.08.2012 15:24