使用 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 &lt;blah@blah.com&gt; 开始后立即断开连接,或者要求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的主要内容,如果未能解决你的问题,请参考以下文章

Rails-使用Gmail和SMTP发送电子邮件

使用 smtp 和 Gmail 的 Phpmailer 无法正常工作 - 连接超时

CakePHP-2.0:如何使用 CakEmail 和 SMTP 设置从 gmail 帐户发送电子邮件?

SMTP使用Gmail发送电子邮件问题

无法通过 telnet 使用 smtp.gmail.com

使用SMTP和Gmail在Django上发送电子邮件