使用嵌入式图片向Indy 9发送电子邮件

时间:2013-01-11 13:29:22

标签: delphi delphi-7 indy

我正在尝试向我的程序添加通过SMTP与Indy 9发送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?

3 个答案:

答案 0 :(得分:4)

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

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

HTML Messages

更新:因此,如果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';

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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。我本来会发布一个指向他们的链接,但再也找不到他们了。