使用delphi 7通过gmail发送电子邮件

时间:2015-09-22 10:59:28

标签: email delphi smtp gmail delphi-7

我正在尝试为使用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;

1 个答案:

答案 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;