Пользователи, сталкивающиеся с разработкой на Delphi, часто используют компоненты Microsoft Outlook для отправки электронных писем с вложенными изображениями. Однако иногда возникают проблемы с отображением этих изображений в теле письма. В данной статье мы рассмотрим, как правильно интегрировать изображения в HTML-текст письма, используя Object Pascal и компоненты Outlook.
Проблема
Пользователь столкнулся с проблемой, при которой вложенное изображение в электронном письме, отправленном через Outlook, не отображается у получателя. Изображение присутствует в письме как отдельный вложенный файл, а не встроено в тело письма.
Контекст
В предоставленном коде используется попытка вставки изображения в HTML-текст письма с помощью CID и свойств вложения. Однако, несмотря на то, что изображение отображается в клиенте Outlook перед отправкой, оно не встраивается в тело письма у получателя.
Пример кода
unit unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, OutlookXP, comobj,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
system.Diagnostics;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TOutlookEmail = class
private
FOutlookApp: OleVariant;
public
constructor Create;
destructor Destroy; override;
procedure SendEmailWithEmbeddedImage(const aRecipient, aSubject, aBody, aImagePath: string);
end;
var
Form1: TForm1;
// Код формы и реализация класса TOutlookEmail
procedure TForm1.Button1Click(Sender: TObject);
var
b: String;
mailOut: TOutlookEmail;
begin
mailOut := TOutlookEmail.Create;
// Создание HTML-текста письма с вставкой изображения
b := '<html><body style="font-family:"Tahoma";font-style:normal;font-weight:normal;font-size:8pt">' +
'<font color="#000000">Hello world</font><IMG src="cid:ImageId1" width="606" height="606">' +
'</font></body></html>';
// Отправка письма с вложенным изображением
mailOut.SendEmailWithEmbeddedImage('xxx@googlemail.com', 'Test', b, 'C:\Delphi\1.png');
end;
constructor TOutlookEmail.Create;
begin
inherited;
FOutlookApp := CreateOleObject('Outlook.Application');
end;
destructor TOutlookEmail.Destroy;
begin
FOutlookApp := Unassigned;
inherited;
end;
procedure TOutlookEmail.SendEmailWithEmbeddedImage(const aRecipient, aSubject, aBody,
aImagePath: string);
var
MailItem,
Attachment: OleVariant;
begin
MailItem := FOutlookApp.CreateItem(0);
MailItem.Subject := ASubject;
MailItem.To := aRecipient;
MailItem.BodyFormat := olFormatHTML;
MailItem.htmlBody := aBody;
// Добавление вложения и установка свойства MAPI
if FileExists(aImagePath) then
begin
Attachment := MailItem.Attachments.Add(aImagePath);
Attachment.PropertyAccessor.SetProperty(
'http://schemas.microsoft.com/mapi/proptag/0x3712001F', 'ImageId1');
end;
// Отправка письма
MailItem.Send;
MailItem := Unassigned;
end;
end.
Подтвержденный ответ
Использование чисел в качестве имени CID может быть некорректным. Важно использовать буквенно-цифровое обозначение для CID. Пример рабочего кода:
var
OL,
MailItem,
Attachment: OleVariant;
begin
OL := CreateOleObject('Outlook.Application');
MailItem := OL.CreateItem(0);
// Настройка письма
MailItem.Subject := 'Subject';
MailItem.To := 'xxx@gmail.com';
MailItem.BodyFormat := olFormatHTML;
MailItem.htmlBody := '<html><body style="font-family:"Tahoma";font-style:normal;font-weight:normal;font-size:8pt">' +
'<font color="#000000">Hello world</font><IMG src="cid:ImageId1" width="606" height="606">' +
'</font></body></html>';
// Добавление вложения и установка MAPI свойства с использованием того же CID
Attachment := MailItem.Attachments.Add('C:\PathTo\1.png');
Attachment.PropertyAccessor.SetProperty(
'http://schemas.microsoft.com/mapi/proptag/0x3712001F', 'ImageId1');
// Завершение процесса отправки
MailItem.Recipients.ResolveAll;
MailItem.Send;
MailItem := Unassigned;
OL := Unassigned;
end;
Альтернативные решения
Возможное решение может включать кодирование изображения в формате base64 прямо в HTML-текст письма.
Использование других методов для интеграции изображений, например, через веб-сервисы для хранения изображений и вставки их URL в HTML.
Заключение
Правильная настройка свойств вложения и использование буквенно-цифровых идентификаторов CID является ключом к успешному встраиванию изображений в тело электронного письма в Outlook. Убедитесь, что вы используете правильные форматы и свойства MAPI, а также что версия Outlook и используемый аккаунт совместимы с такими операциями.
Разработчики, использующие Delphi для создания электронных писем в Outlook, сталкиваются с проблемой неотображения вложенных изображений у получателя, и рассматривают способы их корректной интеграции в HTML-текст письма.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.