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

时间:2016-06-23 04:53:43

标签: php email ssl smtp gmail

根据this

  

Gmail SMTP服务器也可用于转发来自您的邮件   设备或应用程序。您可以使用连接到Gmail邮件服务器   SMTP,SSL / TLS。如果使用SMTP连接,则只能发送邮件   Gmail或Google Apps用户;如果使用SSL / TLS连接,则可以发送   邮寄给任何人。

     

如果您的设备或应用程序支持SSL - 请连接到smtp.gmail.com   在465号港口。

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

  

无法使用PHP SMTP发送电子邮件。您的服务器可能不是   配置为使用此方法发送邮件。

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

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

  • 如果后者也使用ssl,ssl://smtp.gmail.com和smtp.gmail.com之间有什么区别?
  • 为什么我们不能在没有SSL的情况下向其他域发送电子邮件?出于安全考虑,这只是由gmail完成的吗?

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

1 个答案:

答案 0 :(得分:2)

主机名前缀为ssl://且没有前缀的区别在于底层流是通过OpenSSL进行wrapped还是以纯文本发言。

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

当您使用ssl://包装器连接到支持TLS或SSL的服务时,PHP会为您带来魔力。它允许您以与未加密连接相同的方式读取和写入流(使用说fread / fwrite),并且所有握手,加密和解密都在后台完成,只需要为主机添加前缀使用ssl包装器。

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

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