使用 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 2009 中逐步升级 Indy 10

Delphi组件indy 10中IdTCPServer修正及SSL使用心得

使用 Delphi 和 Indy 以编程方式通过 Progress 事件从 Internet 下载文件

使用 indy 10.5.8 在 Delphi 2010 中设置 KeepAlive 超时

私钥密码中包含非 ASCII 字符的 Indy TLS 服务器

INDY 10.1.5 - 哪些 SSL dll 适用于 Delphi 2006?