我正在尝试使用以下代码从我的应用程序发送电子邮件:
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);
当我运行它时,它会生成以下错误
**ERROR: Must issue a STARTTLS command first. i29sm34080394wbp.22**
我该如何解决这个问题?
答案 0 :(得分:8)
通过将答案放在一起,您可以获得以下代码。不要忘记Nathanial Woolls
提及here
,例如将libeay32.dll
和ssleay32.dll
库从here
放到项目文件夹中,或放到following places
的路径中{3}}
uses
IdMessage, IdSMTP, IdSSLOpenSSL, IdGlobal, IdExplicitTLSClientServerBase;
procedure SendEmail(const Recipients: string; const Subject: string; const Body: string);
var
SMTP: TIdSMTP;
Email: TIdMessage;
SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
SMTP := TIdSMTP.Create(nil);
Email := TIdMessage.Create(nil);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
SSLHandler.MaxLineAction := maException;
SSLHandler.SSLOptions.Method := sslvTLSv1;
SSLHandler.SSLOptions.Mode := sslmUnassigned;
SSLHandler.SSLOptions.VerifyMode := [];
SSLHandler.SSLOptions.VerifyDepth := 0;
SMTP.IOHandler := SSLHandler;
SMTP.Host := 'smtp.gmail.com';
SMTP.Port := 587;
SMTP.Username := 'yourusername@gmail.com';
SMTP.Password := 'yourpassword';
SMTP.UseTLS := utUseExplicitTLS;
Email.From.Address := 'yourusername@gmail.com';
Email.Recipients.EmailAddresses := Recipients;
Email.Subject := Subject;
Email.Body.Text := Body;
SMTP.Connect;
SMTP.Send(Email);
SMTP.Disconnect;
finally
SMTP.Free;
Email.Free;
SSLHandler.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SendEmail('recipient@whatever.com', 'Subject', 'Body');
end;
希望这个帮助
答案 1 :(得分:6)
smtp.gmail.com
强制您使用STARTTLS使用加密连接。
Indy 9不直接支持STARTTLS,但indy 10支持STARTTLS。
在Indy 10中,在连接到服务器之前,您必须分配一个
支持SSL的IOHandler,例如TIdSSLIOHandlerSocketOpenSSL
,
添加以下代码:
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),您将不会遇到此问题。
答案 2 :(得分:3)
错误是因为Gmail使用SSL和TLS。您将需要使用Indy的SSL IO处理程序以及适用于Indy版本的OpenSSL DLL's。
有一个关于让这个工作的教程here。