我想使用Indy发送带有嵌入图像的电子邮件,对于这些情况,HTML模板必须具有base64转换的图像。
示例HTML模板:
<html>
<head>
</head>
<body>
<div>
<p>Some text</p>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4
//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
</div>
</body>
</html>
这个HTML只是为了测试,但是即使使用这个简单的base64图像和纯文本,当我用Indy通过电子邮件发送它时,我也不能正确地接收图像。我收到的HTML代码,或文本与破碎的图像,或图像甚至不加载(带有一个空格)。
但是,当我在普通浏览器(即Chrome或Firefox)中打开HTML文件时,图像加载没有问题。
我尝试了以下例程:
uses
idMessage, idText, IdSMTP, IdSSLOpenSSL, IdExplicitTLSClientServerBase;
procedure SendMail;
var
html: TStringList;
email: TIdMessage;
idSMTP: TIdSMTP;
idSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
html:= TStringlist.Create;
html.LoadFromFile('<my_html_file>');
email := TIdMessage.Create(nil);
email.From.Text := 'from@mail.com';
email.From.Name:= 'from name'; ///
email.Recipients.EMailAddresses := 'recipient';
email.Subject := 'From DELPHI';
email.ContentType := 'multipart/mixed'; //email comes with HTML text
//email.ContentType := 'text/html'; //email comes with plain text, but not images
email.Body.Assign(html);
// SSL stuff //
idSSL:= TIdSSLIOHandlerSocketOpenSSL.Create(nil);
idSSL.SSLOptions.Mode:= sslmClient;
idSSL.SSLOptions.Method:= sslvSSLv23;
// SMTP stuff //
idSMTP:= TIdSMTP.Create(nil);
idSMTP.IOHandler:= idSSL;
idSMTP.Host:= 'smtp.office365.com';
idSMTP.Port:= 587;
idSMTP.AuthType := satDefault;
//idSMTP.UseTLS:= utUseImplicitTLS;
idSMTP.UseTLS:= utUseExplicitTLS;
idSMTP.Username:= 'mail@mail.com';
idSMTP.Password:= 'pass';
try
idSMTP.Connect();
idSMTP.Send(email);
ShowMessage('Sent');
except
on E: Exception do
ShowMessage('Failed: ' + E.Message);
end;
end;
我也尝试使用TIdMessageBuilderHtml
,但在这个案例中没有成功。
我做错了什么?
2条答案
按热度按时间jvidinwx1#
通用的解决方案,使用图像的html部分的电子邮件,它的内置图像作为附件和使用附件ID作为SRC的图像。比如:
在这种情况下,所有客户端邮件查看器必须显示电子邮件,因为它应该是。
这是我的旧项目的一部分,它将所有html图像添加到附件中,从“文件名”到相应的标识符。这不是最佳的来源,但你可以从中得到主要的信息。
P.S.所有来自附件的图像将不会显示为附加文件,如果它的HTML部分使用。
mpgws1up2#
正如我前面提到的,我的想法是(并且是)类似于@Oleksandr Morozevych的答案,我基本上将base64中的所有图像转换为附加在邮件消息上的临时二进制(图像)文件,并将正文
<img src="data:image/png;base64,iVBORw0KGgoAAAAN...
替换为<img src="cid:cid_image_id.jpg" />
,成为电子邮件正文中的内联图像。这里有一个例子:
我在上面使用的附加函数:
我做了这个测试和工作很好,它能够发送多个图像,是在html消息(需要在base64格式),在不久的将来,我会重构整个代码接口互动隔离和解耦的代码。