【问题标题】:Sending mail using Indy and smtp使用 Indy 和 smtp 发送邮件
【发布时间】:2014-10-12 19:02:12
【问题描述】:

我正在尝试使用此代码发送邮件:

With IdMessage1 Do Begin
  Recipients.EMailAddresses := 'XXXXX@gmail.com';
  From.Address              := 'XXXXX@gmail.com';
  From.Name                 := edit_from.Text;
  CCList.EMailAddresses     := '';
  BccList.EMailAddresses    := '';
  Priority                  := mpNormal;
  Subject                   := edit_subject.Text;
  Body.Add(memo_body.Lines.Text);
End;

With IdSMTP1 Do Begin
  Host      := 'smtp.gmail.com';
  Username  := 'XXXXX@gmail.com';
  Password  := '*****';
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  Port      := 465;
  UseTLS    := utUseImplicitTLS;

  Try
    Connect;
  Except
  End;

  If Not Connected Then Begin
    Showmessage('Error');
    Exit;
  End;

  Try
    Send(IdMessage1);
  Finally
    Disconnect;
  End;
End;

它在我的计算机上运行良好,但是当我在其他机器上测试它时,将引发“错误”(在最后一个 Try 块之前的 If 块中出错)... 问题出在哪里?

【问题讨论】:

  • 您是否在其他机器上安装了 OpenSSL 库?
  • 引发了什么“错误”?
  • 该错误可能告诉您缺少 DLL。在不告诉我们错误消息/代码的情况下,您永远不应该询问有关代码错误的问题。
  • 你看过openssl.org 吗?有一些有用的信息(fi. FAQ 部分)可以帮助您入门
  • Indy 的 Fulgan 镜像上有可用的 OpenSSL DLL:indy.fulgan.com/SSL

标签: delphi indy delphi-xe5


【解决方案1】:

这不是使用 Indy 进行错误处理的正确方法。它应该更像这样:

With IdSMTP1 Do Begin
  IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
  UseTLS    := utUseImplicitTLS;
  Host      := 'smtp.gmail.com';
  Username  := 'XXXXX@gmail.com';
  Password  := '*****';
  Port      := 465;

  Try
    Connect;
    Try
      Send(IdMessage1);
    Finally
      Disconnect;
    End;
  Except
    Showmessage('Error');
    Exit;
  End;
End;

Send()Disconnect() 可以像 Connect() 一样容易失败。如果您希望Connect() 位于其自己的try/except 块中,那么至少不要使用Connected 来验证Connect() 是否成功:

Try
  Connect;
Except
  Showmessage('Error connecting');
  Exit;
End;

Try
  Try
    Send(IdMessage1);
  Finally
    Disconnect;
  End;
Except
  Showmessage('Error sending');
  Exit;
End;

话虽如此,异常会告诉您实际失败的原因,因此请不要忽略它。如果您显示其内容,您会更好地了解失败的原因,例如:

Except
  on E: Exception do
  Begin
    ShowMessage(Format('Error!'#10'[%s] %s', [E.ClassName, e.Message]));
    Exit;
  End;
End;

最可能的罪魁祸首是您没有在您的应用中部署 OpenSSL DLL。您可以从OpenSSL's websiteIndy's Fulgan mirror 下载它们。

【讨论】:

  • 我使用了异常,我收到的是“Socket Error #11001 - Host not Found”
  • 那么您机器的 DNS 子系统无法将 smtp.gmail.com 解析为 IP 地址。那是在印地之外。当 Indy 能够连接时,它本身可以很好地与 GMail 配合使用。
猜你喜欢
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 2015-10-24
  • 2016-01-13
  • 2015-12-29
  • 2010-12-06
  • 2017-06-26
  • 1970-01-01
相关资源
最近更新 更多