Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как отправить email с встроенным изображением в Delphi с использованием Synapse: решение проблемы с CID и вложенными файлами

Delphi , Интернет и Сети , E-mail

В данной статье мы рассмотрим, как отправить email с встроенным изображением в Delphi, используя библиотеку Synapse. Особое внимание уделим решению проблемы, когда изображение приходит как вложение, а не встроенный элемент, а также разберём работу с CID (Content ID) и настройкой заголовков письма.


Проблема и её решение

Пользователь столкнулся с ситуацией, когда изображение, добавленное в HTML-часть письма через TMimeMess (из Synapse), приходит как вложение, а не встроенный элемент. Основная причина — неправильное указание Content-ID (CID) и структуры письма.

Ключевые моменты:

  1. Правильное указание CID в HTML
    В HTML-части письма ссылка на изображение должна быть в формате:
    html <img src="cid:filename">
    Где filename — имя файла, указанное в Content-ID при добавлении изображения.

  2. Порядок добавления частей письма
    Сначала нужно добавить текстовую часть, затем HTML-часть с изображениями. Если порядок нарушен, MIME-структура может сформироваться некорректно.

  3. Настройка Content-ID в TMimeMess
    В коде пользователя CID указывался как <filename>, но в HTML-части нужно использовать cid:filename (без угловых скобок).


Исправленный код

Вот пример корректной реализации:

procedure SendEmailWithEmbeddedImage;
var
  MimeMsg: TMimeMess;
  HTMLPart, TextPart: TMimePart;
  i: Integer;
  HTMLContent: string;
begin
  MimeMsg := TMimeMess.Create;
  try
    // Настройка заголовков письма
    MimeMsg.Header.From := 'sender@example.com';
    MimeMsg.Header.ToList.Add('recipient@example.com');
    MimeMsg.Header.Subject := 'Письмо с встроенным изображением';

    // Добавление текстовой части (обязательно перед HTML)
    TextPart := MimeMsg.AddPart;
    TextPart.Primary := 'text';
    TextPart.Secondary := 'plain';
    TextPart.Charset := 'utf-8';
    TextPart.Description := 'Текстовая версия письма';
    TextPart.Data.Text := 'Это текстовая версия письма.';

    // Добавление HTML-части
    HTMLPart := MimeMsg.AddPart;
    HTMLPart.Primary := 'text';
    HTMLPart.Secondary := 'html';
    HTMLPart.Charset := 'utf-8';
    HTMLPart.Description := 'HTML-версия письма';

    // Генерация HTML с изображением
    HTMLContent := 
      '<html><body>' +
      '<h1>Пример письма</h1>' +
      '<p>Встроенное изображение:</p>' +
      '<img src="cid:image1">' +  // Обратите внимание на формат CID
      '</body></html>';
    HTMLPart.Data.Text := HTMLContent;

    // Добавление изображения с правильным CID
    for i := 0 to HTMLImages.Count - 1 do
    begin
      MimeMsg.AddPartHTMLBinary(
        HTMLImages[i].Stream,
        HTMLImages[i].Name,
        'image1',  // CID должен совпадать с указанным в HTML
        HTMLPart
      );
    end;

    // Отправка письма через SMTP
    SendEmailViaSMTP(MimeMsg);
  finally
    MimeMsg.Free;
  end;
end;

Альтернативное решение: использование Indy

Если Synapse не подходит, можно воспользоваться библиотекой Indy (встроена в Delphi):

uses
  IdSMTP, IdMessage, IdText, IdAttachmentFile;

procedure SendEmailWithIndy;
var
  SMTP: TIdSMTP;
  Msg: TIdMessage;
  HTML: TIdText;
begin
  SMTP := TIdSMTP.Create(nil);
  Msg := TIdMessage.Create(nil);
  try
    SMTP.Host := 'smtp.example.com';
    SMTP.Username := 'user';
    SMTP.Password := 'password';

    Msg.From.Address := 'sender@example.com';
    Msg.Recipients.Add.Address := 'recipient@example.com';
    Msg.Subject := 'Письмо с встроенным изображением';

    // Текстовая часть
    Msg.Body.Text := 'Текстовая версия письма.';

    // HTML-часть
    HTML := TIdText.Create(Msg.MessageParts);
    HTML.ContentType := 'text/html';
    HTML.Body.Text := 
      '<html><body>' +
      '<img src="cid:image1">' +
      '</body></html>';

    // Встроенное изображение
    TIdAttachmentFile.Create(
      Msg.MessageParts,
      'C:\path\to\image.jpg',
      'image/jpeg'
    ).ContentID := 'image1';

    SMTP.Connect;
    SMTP.Send(Msg);
    SMTP.Disconnect;
  finally
    SMTP.Free;
    Msg.Free;
  end;
end;

Возврат пути (Return-Path)

В Synapse нет прямого аналога Return-Path, но его можно добавить вручную через заголовки:

MimeMsg.Header.CustomHeaders.Add('Return-Path: <bounce@example.com>');

В Indy это делается автоматически (если не указано иное).


Вывод

Для корректной отправки писем с встроенными изображениями в Synapse:
1. Убедитесь, что CID в HTML и при добавлении изображения совпадают.
2. Добавляйте текстовую часть перед HTML.
3. Используйте cid: в HTML-коде без угловых скобок.

Если нужны дополнительные функции (например, Return-Path), рассмотрите альтернативы вроде Indy.

Создано по материалам из источника по ссылке.

Статья объясняет, как корректно отправить email с встроенным изображением в Delphi через библиотеку Synapse, уделяя внимание правильному использованию CID и структуре письма.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: E-mail ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-02 03:49:15/0.0035290718078613/0