使用 Indy SMTP 客户端通过 GMail 发送电子邮件时出现问题

Problem sending an email via GMail with Indy SMTP client

有人可以告诉我我做错了什么(或没有做)吗?

这是我的程序代码:

procedure TForm20.SendImage(const Comment, AImage: String);
var
  SMTP: TIdSMTP;
  Msg: TIdMessage;
begin
  Msg := TIdMessage.Create(nil);
  try
    Msg.From.Address := 'frostydennis7@gmail.com';
    Msg.Recipients.EMailAddresses := 'trevosedennis@gmail.com';
    Msg.Body.Text := 'hello dennis';
    Msg.Subject := 'free space';

    SMTP := TIdSMTP.Create(nil);
    try
      SMTP.Host := 'smtp.gmail.com';
      SMTP.Port := 587;  
      //SMTP.Port := 465; //gives different error-connection closed gracefully but
      //no email is sent or received
         
      SMTP.AuthType := satDefault;
      SMTP.Username := 'frostydennis7@gmail.com';
      SMTP.Password := '$$$$$$$';

      SMTP.Connect;
      //fails with port 25- connection time out socket error
      //with port 465 it never gets past smtp connect.  shows 'closed graceflly'
      //with port 587 it gets past connect but then says
      //'must issue a STARTTLS command first' before smtp.send(msg)

      SMTP.Send(Msg);
    finally
      SMTP.Free;
    end;
  finally
    Msg.Free;
  end;
end;

问题是您没有设置 TIdSMTP.UseTLS 属性。

在25和587端口,必须设置UseTLSutUseExplicitTLS,然后TIdSMTP会发出STARTTLS命令发起SSL/TLS握手在发送电子邮件之前。

在端口 465 上,您必须将 UseTLS 设置为 utUseImplicitTLS,然后 TIdSMTP 将在连接后立即发起 SSL/TLS 握手,然后再读取服务器的问候语。

无论哪种方式,使用 SSL/TLS 都需要在连接到服务器,例如:

var
  IO: TIdSSLIOHandlerSocketOpenSSL;
...
IO := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
IO.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
// configure other IO properties as needed...

SMTP.IOHandler := IO;

请注意 TIdSSLIOHandlerSocketOpenSSL 不支持 TLS 1.3+。目前,如果您需要使用 TLS 1.3+,请为此目的尝试 this work-in-progress SSLIOHandler