【问题标题】:Sending an email via gmail using delphi 7使用delphi 7通过gmail发送电子邮件
【发布时间】:2015-09-22 10:59:27
【问题描述】:

我正在尝试为用 delphi 7 编写的数据库备份代理设置自动电子邮件。 我需要通过基于 Web 的电子邮件系统发送电子邮件,因为无法使用本地 SMTP。 我正在使用的代码返回 Socket Error #10060。

这里是代码。

begin
IdSMTP1    := TIdSMTP.Create(nil);
SSLHandler := TIdSSLIOHandlerSocket.Create(nil);
IdMessage1 := TIdMessage.Create(nil);
try
  IdMessage1.From.Address := 'xxx@gmail.com';
  IdMessage1.Recipients.EMailAddresses := 'xxx@gmail.com';
  IdMessage1.Subject      := Memo2.Lines.Text;
  IdMessage1.Body.Text    := Memo3.Lines.Text;
  try
    SSLHandler.SSLOptions.Method := sslvTLSv1;
    SSLHandler.SSLOptions.Mode   := sslmUnassigned;

    IdSMTP1.Host      := 'smtp.gmail.com';
    IdSMTP1.Port      := 587;
    IdSMTP1.Username  := 'xxx@gmail.com';
    IdSMTP1.Password  := 'xxx';
    IdSMTP1.IOHandler := SSLHandler;
    IdSMTP1.Connect();
    IdSMTP1.Send(IdMessage1);
    IdSMTP1.Disconnect;
  Finally
    IdSMTP1.Free;
  end;
finally
  IdMessage1.Free;
end;
end;

【问题讨论】:

  • 同一台计算机上没有邮件客户端,因为它只是一个运行着一些进程的数据库服务器
  • 查看这篇文章了解一些额外的 Indy 配置思路:mikejustin.wordpress.com/2014/07/27/…
  • 它不会通过 delphi 7 IDE 从我正在开发它的机器上运行。不过,它将是与服务器相同的网络。
  • 您使用的是当前的 Indy 版本吗?
  • 我不这么认为但是新版本说它不完整而且我运行的delphi版本很旧,我会试试看。

标签: email delphi smtp gmail delphi-7


【解决方案1】:

由于无法使用本地 SMTP,我需要通过基于 Web 的电子邮件系统发送电子邮件。

您不能使用TIdSMTP 发送基于网络的电子邮件。您必须改用 TIdHTTP 并模拟用户必须在 Web 浏览器中执行的所有步骤(下载并提交登录 Web 表单,然后请求、填充和提交为用户提供传出信息的网页电子邮件表格等)。这是很多工作。

如果用户有 SMTP 服务器,您可以使用TIdSMTP。但是,即使 user 没有自己的 SMTP 服务器,用户的 ISP 也有 SMTP 服务器。如果无法连接到用户的 ISP 的 SMTP 服务器,您可以尝试使用 TIdSMTPRelay (Indy 10+) 将电子邮件直接发送到电子邮件recipients 代替(因为每个人的 ISP 都有一个用于接收电子邮件的 SMTP 服务器)。问题是您必须在 TIdSMTPRelay.DNSServer 属性中提供 DNS 服务器的主机/IP,但您可以枚举用户的本地网络适配器以发现他们的 DNS 服务器并使用其中一个,或使用众多公共服务器之一DNS 服务器在线。

我使用的代码返回 Socket Error #10060

Gmail 的端口 587 需要 SMTP STARTTLS 命令,而 Indy 9 中的 TIdSMTP 不支持该命令。为此,您需要 Indy 10。对于 Indy 9,您可以改用 Gmail 的端口 465。只需确保在调用TIdSMTP.Connect() 之前将TIdSSLIOHandlerSocket.PassThrough 属性设置为False。

您还泄漏了TIdSSLIOHandlerSocket 对象。

IdSMTP1 := TIdSMTP.Create(nil);
try
  SSLHandler := TIdSSLIOHandlerSocket.Create(IdSMTP1);
  SSLHandler.SSLOptions.Method := sslvTLSv1;
  SSLHandler.SSLOptions.Mode   := sslmUnassigned;
  SSLHandler.PassThrough       := False;

  IdMessage1 := TIdMessage.Create(IdSMTP1);
  IdMessage1.From.Address := 'xxx@gmail.com';
  IdMessage1.Recipients.EMailAddresses := 'xxx@gmail.com';
  IdMessage1.Subject      := Memo2.Lines.Text;
  IdMessage1.Body.Text    := Memo3.Lines.Text;

  IdSMTP1.Host      := 'smtp.gmail.com';
  IdSMTP1.Port      := 465;
  IdSMTP1.Username  := 'xxx@gmail.com';
  IdSMTP1.Password  := 'xxx';
  IdSMTP1.IOHandler := SSLHandler;

  IdSMTP1.Connect;
  try
    IdSMTP1.Send(IdMessage1);
  finally
    IdSMTP1.Disconnect;
  end;
finally
  IdSMTP1.Free;
end;

【讨论】:

  • Google 是否仍然允许访问 smtp.gmail.com 而无需将您的帐户“允许不太安全的应用程序访问”切换为 ON ?我认为他们实施了更严格的政策,您需要将该选项设置为 ON,然后才能使用 smtp.gmail.com。您可以将其设置为myaccount.google.com/security(一直位于该页面的底部)或直接设置为google.com/settings/security/lesssecureapps。 (如果没有帮助不要忘记设置它)
  • 如果您在 Google 帐户中启用两步验证,“安全性较低的应用”功能将被禁用。然后,您可以创建应用程序专用密码,以允许不支持 2 步的应用程序登录 Google/Gmail。它适用于TIdSMTP
  • 很高兴知道。尚不清楚 Jonny 是否启用了两步登录。所以选择启用两步和using a specific app passwordsetting "Allow less secure apps access" to ON
  • 基本上,是的。 Indy 还没有实现 OAuth 协议,因此它无法使用 Gmail 的两步 SASL 身份验证登录(尽管有一些第三方实现浮动,或者您可以自己编写)。
猜你喜欢
  • 2012-01-07
  • 2023-03-19
  • 2011-06-08
  • 2017-05-12
  • 2015-09-28
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多