在Delphi XE中使用Indy发送电子邮件时发生STARTTLS错误
我正在尝试使用以下代码从我的应用程序发送电子邮件:在Delphi XE中使用Indy发送电子邮件时发生STARTTLS错误,delphi,delphi-xe,indy10,Delphi,Delphi Xe,Indy10,我正在尝试使用以下代码从我的应用程序发送电子邮件: Var MailMessage : TIdMessage; SMTP : TIdSMTP . . . //setup SMTP SMTP.Host := 'smtp.gmail.com'; SMTP.Port := 25; //setup mail message MailMessage.From.Address := 'fromMe@gmail.com'; MailMessage.Rec
Var
MailMessage : TIdMessage;
SMTP : TIdSMTP
.
.
.
//setup SMTP
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 25;
//setup mail message
MailMessage.From.Address := 'fromMe@gmail.com';
MailMessage.Recipients.EMailAddresses := 'ToSomeOne@hotmail.com';
MailMessage.Subject := 'Test';
MailMessage.Body.Text := 'Hello, It is Just for test';
SMTP.Connect;
SMTP.Send(MailMessage);
var
...
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
SSLHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(Form1);
SMTP.IOHandler:= SSLHandler;
SMTP.UseTLS:= utUseExplicitTLS;
SMTP.Username:= 'username';
SMTP.Password:= 'password';
SMTP.Port:= 587;
当我运行它时,它会生成以下错误
**ERROR: Must issue a STARTTLS command first. i29sm34080394wbp.22**
如何解决此问题?
smtp.gmail.com
强制您使用STARTTLS加密连接
Indy 9不直接支持STARTTLS,但Indy 10支持
在Indy 10中,在连接到服务器之前,必须分配一个
启用SSL的IOHandler,例如TIdSSLIOHandlerSocketOpenSSL
见:
添加以下代码:
Var
MailMessage : TIdMessage;
SMTP : TIdSMTP
.
.
.
//setup SMTP
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 25;
//setup mail message
MailMessage.From.Address := 'fromMe@gmail.com';
MailMessage.Recipients.EMailAddresses := 'ToSomeOne@hotmail.com';
MailMessage.Subject := 'Test';
MailMessage.Body.Text := 'Hello, It is Just for test';
SMTP.Connect;
SMTP.Send(MailMessage);
var
...
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
SSLHandler:= TIdSSLIOHandlerSocketOpenSSL.Create(Form1);
SMTP.IOHandler:= SSLHandler;
SMTP.UseTLS:= utUseExplicitTLS;
SMTP.Username:= 'username';
SMTP.Password:= 'password';
SMTP.Port:= 587;
如果您只是将SMTP发送到未加密的SMTP处理程序(ISP的SMTP),则不会遇到此问题 错误是因为Gmail使用SSL和TLS。您将需要使用Indy的SSL IO处理程序以及适用于您的Indy版本的适当版本
这里有一个关于如何实现这一点的教程。将答案放在一起,您可以得到以下代码。如前所述,不要忘记将
libeay32.dll
和ssleay32.dll
库(例如从)放置到项目文件夹或中的路径
希望这有助于摆脱对
SSLHandler.Destination
、SSLHandler.Host
和SSLHandler.Port
属性的分配。这些属性由Connect()
@Johna自动填写:说Indy 9不支持这一点是错误的。Indy9确实支持SSL加密,只是不支持GMail SMTP服务器所需的STARTTLS命令。不过,您可以使用几行额外的代码手动发送STARTTLS命令。至于OnGetPassword
事件,只有在使用受密码保护的SSL证书时才适用(GMail不是这种情况)。@RemyLebeau TeamB,感谢您指出,我已经有一段时间没有使用Indy了。@RemyLebeau可以用Indy 8手动发送STARTTLS吗?我有一个使用Indy 8的应用程序。我可以使用SSL连接发送电子邮件,但前提是服务器使用隐式TLS。我想补充一下STARTTLS的支持。如果可能的话,请告诉我您应该如何熟悉STARTTLS:并且两者都很有帮助。