smtp.gmail.com vs ssl://smtp.gmail.com 使用 gmail smtp 服务器发送电子邮件时

smtp.gmail.com vs ssl://smtp.gmail.com while sending email using gmail smtp server

根据this

Gmail SMTP Server could also be used to relay messages from your device or application. You can connect to Gmail mail servers using SMTP, SSL/TLS. If you connect using SMTP, you can only send mail to Gmail or Google Apps users; if you connect using SSL/TLS, you can send mail to anyone.

If your device or application supports SSL - connect to smtp.gmail.com on port 465.

所以我尝试连接到端口 465 上的 smtp.gmail.com。我收到以下错误:

Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method.

一些code使用另一个地址"ssl://smtp.gmail.com"。

当我也在端口 465 上使用 ssl://smtp.gmail.com 时,我的应用程序现在可以正常工作。

我对此非常陌生。谁能解释一下?如果重要的话,我正在使用 php。

在主机名前加 ssl:// 和不加前缀的区别在于底层流是 wrapped 通过 OpenSSL 还是以纯文本形式说话。

当您在端口 465 上连接到 Gmail 时,它希望客户端使用 TLS 加密。最有可能的是,您看到的错误消息是在尝试以纯文本格式写入和读取数据时连接到需要加密连接的服务的一般结果。

当您使用 ssl:// 包装器连接到支持 TLS 或 SSL 的服务时,

PHP 会为您带来神奇的效果。它允许您以与未加密连接相同的方式在流上读写(使用 fread/fwrite),并且所有握手、加密和解密都在后台完成,只需前缀即可带有 ssl 包装器的主机。

关于第二个问题,应该是安全问题。为了中继(将邮件发送到另一个域),您需要通过 SMTP 进行身份验证,这永远不应以明文形式完成,而您可以使用未加密的连接连接到端口 25 并在不进行身份验证的情况下将邮件发送给 Gmail 用户(这是最外面的邮件服务器会在其用户之一向 Gmail 发送邮件时执行此操作)。但从技术上讲,没有什么可以阻止他们允许您使用未加密的连接发送邮件,甚至可以使用 Gmail 凭据进行身份验证(这称为开放中继,通常被垃圾邮件发送者严重滥用)。

您可以通过阅读有关 SMTP 协议、STARTTLS 命令和一般 TLS 加密的内容来了解​​有关第一个问题的更多信息。 STARTTLS 允许客户端通过未加密的连接连接到邮件服务器,然后协商(升级)连接以使用加密,而另一方面,与端口 465 的连接期望 TLS 握手在在任何协议 (SMTP) 通信发生之前建立连接。