我正在尝试向我的程序添加通过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?
答案 0 :(得分:4)
TIdAttachment
派生自TIdMessagePart
,其具有公共ContentID
属性。如果您安装的Indy 9版本没有该属性,那么您使用的是过时版本,因此请使用ExtraHeaders
属性手动添加Content-ID
标题。
有关使用HTML电子邮件的更多信息,请查看有关Indy网站的以下博客文章:
更新:因此,如果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。我本来会发布一个指向他们的链接,但再也找不到他们了。