我正在尝试为使用delphi 7编写的数据库备份代理设置自动电子邮件。 我需要通过基于Web的电子邮件系统发送电子邮件,因为无法使用本地SMTP。 我正在使用的代码是返回套接字错误#10060。
这是代码。
begin
IdSMTP1 := TIdSMTP.Create(nil);
SSLHandler := TIdSSLIOHandlerSocket.Create(nil);
IdMessage1 := TIdMessage.Create(nil);
try
IdMessage1.From.Address := 'xxx@gmail.com';
IdMessage1.Recipients.EMailAddresses := 'xxx@gmail.com';
IdMessage1.Subject := Memo2.Lines.Text;
IdMessage1.Body.Text := Memo3.Lines.Text;
try
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
IdSMTP1.Host := 'smtp.gmail.com';
IdSMTP1.Port := 587;
IdSMTP1.Username := 'xxx@gmail.com';
IdSMTP1.Password := 'xxx';
IdSMTP1.IOHandler := SSLHandler;
IdSMTP1.Connect();
IdSMTP1.Send(IdMessage1);
IdSMTP1.Disconnect;
Finally
IdSMTP1.Free;
end;
finally
IdMessage1.Free;
end;
end;
答案 0 :(得分:0)
我需要通过基于网络的电子邮件系统发送电子邮件,因为无法使用本地SMTP。
您无法使用TIdSMTP
发送基于网络的电子邮件。您必须使用TIdHTTP
来模拟用户在Web浏览器中必须经历的所有步骤(下载并提交登录webform,然后请求,填充和提交为用户提供的网页)即将发送的电子邮件表单等)。这是很多工作。
如果用户有SMTP服务器,则可以使用TIdSMTP
。但是,即使用户没有自己的SMTP服务器,用户的 ISP 也有SMTP服务器。如果无法连接到用户的ISP 的SMTP服务器,则可以尝试使用TIdSMTPRelay
(Indy 10+)将电子邮件直接发送到该服务器的SMTP服务器。发送电子邮件收件人(因为每个人的ISP都有一个用于接收电子邮件的SMTP服务器)。问题是您必须在TIdSMTPRelay.DNSServer
属性中提供DNS服务器的主机/ IP,但您可以枚举用户的本地网络适配器以发现其DNS服务器并使用其中一个,或者在线使用众多公共DNS服务器之一。
我正在使用的代码是返回套接字错误#10060
Gmail的端口587需要SMTP STARTTLS
命令,而Indy 9中的TIdSMTP
不支持该命令。你需要Indy 10。对于Indy 9,您可以使用Gmail的端口465代替。在调用TIdSSLIOHandlerSocket.PassThrough
之前,请务必将TIdSMTP.Connect()
属性设置为False。
您也在泄漏TIdSSLIOHandlerSocket
对象。
IdSMTP1 := TIdSMTP.Create(nil);
try
SSLHandler := TIdSSLIOHandlerSocket.Create(IdSMTP1);
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.PassThrough := False;
IdMessage1 := TIdMessage.Create(IdSMTP1);
IdMessage1.From.Address := 'xxx@gmail.com';
IdMessage1.Recipients.EMailAddresses := 'xxx@gmail.com';
IdMessage1.Subject := Memo2.Lines.Text;
IdMessage1.Body.Text := Memo3.Lines.Text;
IdSMTP1.Host := 'smtp.gmail.com';
IdSMTP1.Port := 465;
IdSMTP1.Username := 'xxx@gmail.com';
IdSMTP1.Password := 'xxx';
IdSMTP1.IOHandler := SSLHandler;
IdSMTP1.Connect;
try
IdSMTP1.Send(IdMessage1);
finally
IdSMTP1.Disconnect;
end;
finally
IdSMTP1.Free;
end;