【发布时间】:2015-09-22 18:54:42
【问题描述】:
我正在尝试在 Delphi 5 上使用 Indy 10 发送电子邮件,发生的情况是它不想进行身份验证,因为它向我显示了“Nooo”消息。到目前为止,我在这里有这段代码(我从另一个 Stack Overflow 问题中得到)。我不知道为什么它对我不起作用,因为它显然对另一个人起作用......也许我错过了一些东西,我用我的 2 封实际邮件和密码替换了 senderemail 和 receiveremail。
编辑
这就是我现在所处的位置,它会弹出“必须先发出 STARTTLS 命令”。但是现在出错了……我真的很困惑……
编辑 2
所以我设法让它工作,这是最终的结果。如果某些事情没有正确完成,请随时告诉我......在添加“IdSMTP.Authenticate;”之前,我遇到了访问冲突。发送消息前的一行!
procedure TForm1.Button3Click(Sender: TObject);
var
IdSMTP: TIdSMTP;
Email: TIdMessage;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
IdSMTP := TIdSMTP.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
Email := TIdMessage.Create(nil);
try
SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvSSLv23;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;
IdSMTP.IOHandler := SSLHandler;
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.Port := 587;
IdSMTP.Username := 'email@gmail.com';
IdSMTP.Password := 'password';
IdSMTP.UseTLS := utUseExplicitTLS;
Email.From.Address := 'email@gmail.com';
Email.Recipients.EmailAddresses := 'secondemail@gmail.com';
Email.Subject := 'Test subject';
Email.Body.Text := 'Test body';
IdSMTP.Connect;
if IdSMTP.Connected then
begin
IdSMTP.Authenticate;
IdSMTP.Send(Email);
IdSMTP.Disconnect;
end;
finally
Email.Free;
SSLHandler.Free;
IdSMTP.Free;
end;
end;
【问题讨论】:
-
请注意,
AuthType=satDefault不适用于所有服务器。它使用不安全的AUTH LOGIN命令,并且一些服务器已经放弃了对它的支持。您应该考虑将AuthType=satSASL与TIdSMTP.SASLMechanisms集合一起使用。您不需要手动调用 Authenticate() -
Gmail 对 SMTP 使用 25、465 和 587,但由于几乎所有 isps 都阻止 25,因此 465 是 gmail 首选的带有 SSL 的 SMTP,而 587 是带有 TLS 端口的首选 SMTP。
-
GMail 可以使用不允许访问您的程序的设置 - 尝试在您的设置中找到“访问安全性较低的应用程序”。
-
如果您启用了 2 因素身份验证并创建了应用专用密码,则无需启用“访问安全性较低的应用”。