使用 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端口,必须设置UseTLS
为utUseExplicitTLS
,然后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。
有人可以告诉我我做错了什么(或没有做)吗?
这是我的程序代码:
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端口,必须设置UseTLS
为utUseExplicitTLS
,然后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。