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

Как исправить проблему с отображением вложенных изображений в Outlook при использовании Delphi

Delphi , Графика и Игры , Изображения

Пользователи, сталкивающиеся с разработкой на 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




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


:: Главная :: Изображения ::


реклама


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

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