В данной статье мы рассмотрим, как отправить email с встроенным изображением в Delphi, используя библиотеку Synapse. Особое внимание уделим решению проблемы, когда изображение приходит как вложение, а не встроенный элемент, а также разберём работу с CID (Content ID) и настройкой заголовков письма.
Проблема и её решение
Пользователь столкнулся с ситуацией, когда изображение, добавленное в HTML-часть письма через TMimeMess (из Synapse), приходит как вложение, а не встроенный элемент. Основная причина — неправильное указание Content-ID (CID) и структуры письма.
Ключевые моменты:
Правильное указание CID в HTML
В HTML-части письма ссылка на изображение должна быть в формате: html <img src="cid:filename">
Где filename — имя файла, указанное в Content-ID при добавлении изображения.
Порядок добавления частей письма
Сначала нужно добавить текстовую часть, затем HTML-часть с изображениями. Если порядок нарушен, MIME-структура может сформироваться некорректно.
Настройка 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):
В 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.