我尝试使用此代码发送邮件:
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
块中出错)将被引发...
问题在哪里?
答案 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 website或Indy's Fulgan mirror下载。