by marco cantu
![](https://i-blog.csdnimg.cn/blog_migrate/ad23fe9b8d3e357e0f03ffe6d9b71d44.jpeg)
一旦你把你的电子邮件帐户转移到GMail(甚至是整个域名),你就必须修正你在Delphi程序中用于自动生成和发送电子邮件的代码。事实上,GMail使用SMTP协议来发送电子邮件,但有一种特殊形式的SSH加密,称为TLS。
让事情变得更加复杂的是,不同的客户端使用不同的端口和配置。特别是,Outlook(它不提供TLS支持)有不同的设置。对于Indy来说,你可以遵循其他客户端程序所使用的设置,比如为Thunderbird提供的设置。在这个新闻组的帖子中,有更多关于各种端口的信息。
Gmail使用25、465和587作为SMTP,但由于几乎所有的ISP都屏蔽了25,465是Gmail首选的带SSL的SMTP,而587是首选的带TLS的SMTP端口。
下面是一个演示程序的代码,其中有DFM文件和实际的Delphi代码(这和你一般使用的代码一样)。
object IdSMTP1: TIdSMTP
OnStatus = IdSMTP1Status
IOHandler = IdSSLIOHandlerSocketOpenSSL1
Host = 'smtp.gmail.com'
Password = '***'
Port = 587
SASLMechanisms = <>
UseTLS = utUseExplicitTLS
Username = '****'
end
object IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL
Destination = 'smtp.gmail.com:587'
Host = 'smtp.gmail.com'
MaxLineAction = maException
Port = 587
SSLOptions.Method = sslvTLSv1
SSLOptions.Mode = sslmUnassigned
SSLOptions.VerifyMode = []
SSLOptions.VerifyDepth = 0
OnStatusInfo = IdSSLIOHandlerSocketOpenSSL1StatusInfo
end
IdSMTP1.Connect;
IdSMTP1.Send(IdMessage1);
IdSMTP1.Disconnect;
其中IdMessage1是你要发送的信息。当然,你既可以向你的Gmail账户发送信息,也可以向你的GMail账户中的任何其他账户发送信息。
注意。如果你不使用 "显式TLS",你将不得不进行额外的初始化调用(如。IdSMTP1.SendCmd('STARTTLS', 220);)。最后,IdSSLIOHandlerSocketOpenSSL1StatusInfo事件处理程序产生一个报告,像这样:
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
SSL status: "SSLv3 read server certificate A"
SSL status: "SSLv3 read server done A"
SSL status: "SSLv3 write client key exchange A"
SSL status: "SSLv3 write change cipher spec A"
SSL status: "SSLv3 write finished A"
SSL status: "SSLv3 flush data"
SSL status: "SSLv3 read finished A"
SSL status: "SSL negotiation finished successfully"
status: "SSL negotiation finished successfully"
Cipher: name = [...]; description = [...] SSLv3 Kx=RSA Au=RSA Enc=3DES(168)