使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP
Posted
技术标签:
【中文标题】使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP【英文标题】:Using Gmails Outgoing SMTP from DELPHI(Indy) using TLS 【发布时间】:2011-10-25 15:50:46 【问题描述】:我正在使用 INDY 使用 SMTP 客户端在端口 25 上发送电子邮件,没有问题。
现在我需要使用 Gmail 帐户发送电子邮件,为此我需要使用 TLS。
谁能提供一个简单的示例来说明如何做到这一点。
谢谢
【问题讨论】:
“indy+smtp+gmail”在谷歌上的最高结果显示:Send mail to GMail using Indy 我过去使用过 Marco Cantu 的指南:marcocantu.com/tips/oct06_gmail.html 【参考方案1】:此代码适用于 GMail:
begin
IDSMTP1 := TIDSMTP.Create;
IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create;
try
with IDSMTP1 do
begin
Host := srvr.Host;
Port := srvr.Port;
if (srvr.needAuthentication = 'Y') then
AuthType := satDefault
else
AuthType := satNone;
IOHandler := IdSSLIOHandlerSocketOpenSSL1;
if (srvr.secureMode = 'Y') then
UseTLS := utUseRequireTLS
else
UseTLS := utNoTLSSupport;
Username := srvr.Username;
Password := srvr.Password;
end;
idMBHTML := TIdMessageBuilderHTML.Create;
Idmessage1 := TIDMessage.Create;
try
with idMBHTML do
begin
enc := TEncoding.Unicode;
HTML.LoadFromStream(FEmlMsg.MsgBody, enc);
for c := 0 to FEmlMsg.Attachmnts.Count - 1 do
Attachments.Add(FEmlMsg.Attachmnts[c]);
FillMessage(IDMessage1);
end;
with Idmessage1 do
begin
Subject := FEmlMsg.MsgSubject;
From.Address := FEmlMsg.FromAddress;
From.Name := FEmlMsg.FromName;
Recipients.EMailAddresses := FEmlMsg.RecipientAddress;
if FEmlMsg.ReceiptRecipientAddress <> '' then
ReceiptRecipient.Address := FEmlMsg.ReceiptRecipientAddress;
if FEmlMsg.ReceiptRecipientName <> '' then
ReceiptRecipient.Name := FEmlMsg.ReceiptRecipientName;
end;
with IDSMTP1 do
begin
if not Connected then
Connect;
Send(IdMessage1);
end;
finally
Idmessage1.Free;
idMBHTML.Free;
end;
finally
IDSMTP1.Free;
IdSSLIOHandlerSocketOpenSSL1.Free;
end;
end;
【讨论】:
测试过你自己吗?我在连接时收到错误:EIdOSSLCouldNotLoadSSLLibrary 带有消息“无法加载 SSL 库。” 确保为您的 Indy 版本使用正确版本的 OpenSSL DLL。使用 Indy 的WhichFailedToLoad()
函数来确定 OpenSSL 的哪些部分加载失败。
正如 Remy 上面提到的,您必须在应用程序中包含 OpenSSL DLL 文件。它们应该与应用程序可执行文件在同一个文件夹中,或者应该在系统路径中(例如 System32 文件夹)。您可以从 Indy 网站下载最新文件。【参考方案2】:
您需要 SSL dll 才能使 IdSSLIOHandler 工作。
有信息Indy SSL Website 将您重定向到Fulgan Download Site
您可以下载一个适合您平台的软件包,然后将这 2 个 dll 包含在您的应用程序中。我本人正在使用带有 indy 组件的 2 个 dll 通过电子邮件发送邮件超过 2 年。唯一的问题是发送速度很慢。
【讨论】:
【参考方案3】:你没有说你使用的是什么版本的 Indy。 要使用 TSL(Hotmail/GMaill 中的最后一次安全更改),您需要使用 Indy 10。
见description here。
实际上Y使用此配置使用GMail发送邮件并且它可以正常工作:
MailServer=smtp.gmail.com PortServer=465 FromText=account@gmail.com(与邮件相同) SSLMethod=sslvTLSv1【讨论】:
以上是关于使用 TLS 使用来自 DELPHI(Indy) 的 Gmail 传出 SMTP的主要内容,如果未能解决你的问题,请参考以下文章
Delphi组件indy 10中IdTCPServer修正及SSL使用心得
使用 Delphi 和 Indy 以编程方式通过 Progress 事件从 Internet 下载文件
使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时