2

我正在尝试向我的程序添加使用 Indy 9 通过 SMTP 发送 html 电子邮件的功能。如果程序只包含文本(文本将是希伯来语,所以我需要从右到左显示它,这意味着我是使用 HTML 语句),然后正确发送电子邮件。我的问题在于将图片嵌入到 HTML 流中。

HTML 流将使用类似的命令

<IMG SRC="cid:foo4atfoo1atbar.net" ALT="IETF logo">

虽然 Indy 10 组件 TIdAttachmentFile 有一个 ComponentID 属性,其值必须设置为“cid”引用的值,但我找不到在 Indy 9 中设置 ComponentID 属性的位置。

目前,处理添加图片(名称在 laPicture.text 中)的代码如下所示

  if laPicture.text <> '' then
  with TIdAttachment.Create (email.MessageParts, laPicture.text) do
   begin
    ContentDisposition:= 'inline';
    ContentType:= 'image/jpeg';
    DisplayName:= ExtractFileName (laPicture.text);
    filename:= ExtractFileName (laPicture.text);
   end;

我在哪里定义 ContentID?

而且,虽然这是一个愚蠢的问题,但我怎么知道我拥有的是哪个版本的 Indy?

4

3 回答 3

5

TIdAttachment派生自TIdMessagePart,它具有公共ContentID属性。如果您安装的 Indy 9 版本没有该属性,那么您使用的是过时的版本,因此请使用该ExtraHeaders属性来Content-ID手动添加标题。

有关使用 HTML 电子邮件的更多信息,请查看 Indy 网站上的以下博客文章:

HTML 消息

更新:因此,如果 HTML 显示,cid:foo4atfoo1atbar.net那么您需要在代码中执行此操作以匹配它:

with TIdAttachment.Create (email.MessageParts, laPicture.text) do
begin
  ...
  ContentID := '<foo4atfoo1atbar.net>';
  // or this, if you do not have the ContentID property available:
  // ExtraHeaders.Values['Content-ID'] := '<foo4atfoo1atbar.net>';
end;

请注意,在 Indy 9 中,您必须手动提供括号。如果省略它们,Indy 10 会为您插入它们,例如:

ContentID := 'foo4atfoo1atbar.net';
于 2013-01-11T16:37:28.877 回答
0

我找到了一个解决方案——我不需要 Indy10 而不是 Content-ID 字段。

我在问题中显示的代码很好,问题可能出在显示图片的 HTML 代码中。我认为“cid”变量必须“指向” Content-ID 的值;发现可以设置为文件名(TIDAttachment.filename),如下

<img src="cid:' + ExtractFileName (laPicture.text) + '"><br>

上面的行被插入到适当位置的 html 流中。

于 2013-01-11T19:05:17.057 回答
0

这对我有用:

function SendEmail(SMTP: TIdSMTP; CONST AdrTo, AdrFrom, Subject, Body, HtmlImage, DownloadableAttachment: string; SendAsHtml: Boolean= FALSE): Boolean;
VAR MailMessage: TIdMessage;
begin
 Result:= FALSE;
 Assert(SMTP <> NIL, 'SMTP in NIL!');

 MailMessage:= TIdMessage.Create(NIL);
 TRY
  MailMessage.ConvertPreamble:= TRUE;
  MailMessage.Encoding       := meDefault;
  MailMessage.Subject        := Subject;
  MailMessage.From.Address   := AdrFrom;
  MailMessage.Priority       := mpNormal;
  MailMessage.Recipients.EMailAddresses := AdrTo;

  {How to send multi-part/attachment emails with Indy:
  www.indyproject.org/2005/08/17/html-messages
  www.indyproject.org/2008/01/16/new-html-message-builder-class }
  WITH IdMessageBuilder.TIdMessageBuilderHtml.Create DO
  TRY
    if SendAsHtml
    then Html.Text := Body
    else PlainText.Text := Body;

    { This will be visible ONLY if the email contains HTML! }
    if SendAsHtml AND FileExists(HtmlImage)
    then HtmlFiles.Add(HtmlImage);

    if FileExists(DownloadableAttachment)
    then Attachments.Add(DownloadableAttachment);
    FillMessage(MailMessage);
  FINALLY
    Free;
  END;

  { Connect }
  TRY
    if NOT SMTP.Connected
    then SMTP.Connect;
  EXCEPT
    on E: Exception DO
     begin
      AppLog.AddError('Cannot connect to the email server.');
      AppLog.AddError(E.Message);
     end;
  END;

  { Send mail }
  if SMTP.Connected then
   TRY
     SMTP.Send(MailMessage);
     Result:= TRUE;
   EXCEPT
     on E:Exception DO
      begin
       AppLog.AddError('Connected to server but could not send email!');
       AppLog.AddError(E.Message);
      end;
   END;

  if SMTP.Connected
  then SMTP.Disconnect;

 FINALLY
  FreeAndNil(MailMessage);
 END;
end;

注意:将 AppLog 替换为您的个人日志记录系统或 ShowMessage。

你当然需要 libeay32.dll + ssleay32.dll。我会张贴他们的链接,但找不到他们了。

于 2021-03-27T09:18:22.877 回答