使用Indy和smtp发送邮件

时间:2014-10-12 19:02:13

标签: delphi indy delphi-xe5

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

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;

它可以在我的电脑上正常工作,但是当我在其他机器上测试时,错误' ERROR' (将在If阻止之前的Try块中出错)将被引发... 问题在哪里?

1 个答案:

答案 0 :(得分: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下载。