使用 SMTP、Gmail 和 STARTTLS
Posted
技术标签:
【中文标题】使用 SMTP、Gmail 和 STARTTLS【英文标题】:Using SMTP, Gmail, and STARTTLS 【发布时间】:2013-06-21 07:48:40 【问题描述】:所以我正在学习 SMTP,并尝试使用 telnet
通过 SMTP 发送一些邮件。
我已经很容易通过以下方式将邮件发送到我的 gmail 帐户:
$ host gmail.com
...
gmail.com mail is handled by 5 gmail-smtp-in.l.google.com.
...
$ telnet gmail-smtp-in.l.google.com 25
Trying 74.125.142.27...
...
Connected to gmail-smtp-in.l.google.com.
...
HELO <me@test.com>
...
但是,我在 我的 gmail 帐户发送邮件时遇到了问题。根据我对 SMTP 的了解,我应该使用 SMTP 从 发送邮件 到传出的 gmail SMTP 服务器,后者又使用 SMTP 将邮件传输到接收者传入的 SMTP 服务器等。
但是,我遇到了困难。如果我通过465
端口telnet
进入smtp.gmail.com
(gmail 传出 smtp 邮件服务器规范),我会在以HELO <blah@blah.com>
开始后立即断开连接,或者要求STARTTLS
。我找不到如何继续的答案。
感谢任何帮助。
旁注:目前我正在使用星巴克的免费 Wi-Fi 上网。我实际上无法直接从我的计算机telnet
(没有路由到主机错误)。相反,它只有在我先ssh
进入我学校网络上的远程 linux 机器,然后从那里进入telnet
时才有效。知道这是为什么吗?
谢谢!
【问题讨论】:
How to send email using simple SMTP commands via Gmail?的可能重复 【参考方案1】:首先,您似乎使用了错误的端口。 Gmail 为基于 SSL 的 SMTP 公开端口 465,为使用 STARTTLS 的 SMTP 公开端口 587,为 documented here。这两者之间的区别在于,SMTP over SSL 首先建立一个安全的 SSL/TLS 连接并通过该连接进行 SMTP,而带有 STARTTLS 的 SMTP 以未加密的 SMTP 开始,然后切换到 SSL/TLS。这就是您的 HELO 没有得到响应的原因。
$ telnet smtp.gmail.com 587
Trying 74.125.25.108...
Connected to gmail-smtp-msa.l.google.com.
Escape character is '^]'.
220 mx.google.com ESMTP fr1sm24834956pbb.26 - gsmtp
HELO <me@test.com>
250 mx.google.com at your service
STARTTLS
220 2.0.0 Ready to start TLS
但是,即使您远程登录到端口 587,您仍然无法手动发送任何电子邮件。为了做任何有趣的事情,你必须STARTTLS,你将无法处理SSL/TLS binary protocol来协商加密。
【讨论】:
查看 Swaks 以弥合原始 telnet 和邮件客户端之间的差距。 jetmore.org/john/code/swaks 对我来说 STARTTLS 不起作用,根据文档,587 用于 TLS,465 用于 SSL:support.google.com/a/answer/176600?hl=en【参考方案2】:telnet 客户端不会为您协商 TLS 会话。您应该使用其他工具,例如 OpenSSL 的 s_client。以下为您发出 STARTTLS 命令并处理 TLS 协商:
$ openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf
或者,您可以直接连接到 SMTPS 端口:
$ openssl s_client -connect smtp.gmail.com:465 -crlf
【讨论】:
嗨@Erwan Legrand 我正在尝试实现一个 smtp 守护进程,并且想要触发 TLS 会话的协商,但是当我使用 openssl 和您在此处建议的命令时,我得到了这个响应“ SSL 握手已读取 2888 字节并写入 429 字节验证错误:无法获取本地颁发者证书 --- 新,TLSv1.3,密码为 TLS_AES_256_GCM_SHA384 服务器公钥为 256 位不支持安全重新协商”。有什么建议吗? @EricLang 您需要使用 -CAfile 或 -CApath 将 CA 证书传递给 s_client。 (TLS 服务器应该发送完整的证书链。实际上,服务器通常会发送减去根证书的链,因为它们假设客户端已经拥有他们信任的根证书的副本。)以上是关于使用 SMTP、Gmail 和 STARTTLS的主要内容,如果未能解决你的问题,请参考以下文章
使用 smtp 和 Gmail 的 Phpmailer 无法正常工作 - 连接超时