email - 连接到 SMTP 服务器时,我应该先尝试 SSL 还是 TCP/STARTTLS?

标签 email ssl smtp starttls

SMTP 允许通过端口 25 进行未加密通信。对于某些服务器(如 Google 的 MX 服务器),我可以在建立初始未加密连接后使用 STARTTLS 切换到 TLS 连接。

S:220 mx.google.com ESMTP l1si352658een.133
C:EHLO mail.example.com
S:250-mx.google.com at your service
S:250-SIZE 35882577
S:250-8BITMIME
S:250-STARTTLS
S:250-ENHANCEDSTATUSCODES
S:250 PIPELINING
C:STARTTLS
S:220 2.0.0 Ready to start TLS
[socket switches to TLS here]
C:EHLO mail.example.com
...

但是,我也想支持直接的 SSL 连接,我想知道大多数邮件服务器是更喜欢从 SSL 开始还是从 TCP 开始,然后在建立连接后转向 TLS。

最佳答案

除非您事先与服务器管理员有安排,否则不要尝试使用 SSL 进行连接。端口 (465) 用于 SSMTP 或 SMTPS(SMTP over SSL)。与此端口的连接应使用 SSL 启动连接。由于 StartTLS 可用,此端口和协议(protocol)的使用已被放弃。

有两个端口可以支持带有 StartTLS 的 SMTP。如果没有 StartTLS,两者都不会支持 SSL,如果您尝试,它们可能会断开连接。 SMTP (25) 和提交 (587) 都可能支持 StartTLS。如果支持,它将列在对 EHLO 消息的响应中。然后您可以启动 StartTLS 过程。参见 RFC 3207了解更多详情。

从您的评论看来,您真正关心的是如何验证证书。这是一个不同但相关的问题。它还假定邮件服务器未使用自签名证书。就我而言,我使用自签名证书。这对我来说效果很好,因为 StartTLS 很少(如果有的话)用于 SMTP(端口 25)连接。我可以合理控制连接到消息提交(端口 587 或端口 25)的客户端,这些客户端必须在发送消息之前进行身份验证。根据我的经验,StartTLS 主要用于保护在发送电子邮件之前必须进行身份验证的客户端的连接。

关于email - 连接到 SMTP 服务器时,我应该先尝试 SSL 还是 TCP/STARTTLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409419/

相关文章:

php - Laravel 5 邮件队列不工作

java - Imap 文件夹共享邮箱 - 在无效状态下收到 BAD 命令

php - 无法在 Codeigniter 中发送电子邮件,没有错误消息。本地或远程

ssl - Heroku ssl 证书 : Key could not be read since it's protected by a passphrase

java - 为什么 HttpUrlConnection 在移动数据连接上抛出 SSLException?

c# - 如何使用 smtp4dev 接收电子邮件

c# - 有什么办法可以关闭邮件 smtp session 吗?

c# - .NET Pop3 库的建议

ssl - 关于自签名 SSL

php - 邮件发送后重定向失败且未发送邮件