Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi XE中使用Indy发送电子邮件时发生STARTTLS错误_Delphi_Delphi Xe_Indy10 - Fatal编程技术网

在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:并且两者都很有帮助。