使用SMTP、Gmail和STARTTLS

13

所以我正在学习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将邮件从<mygmailaddress@gmail.com>发送到出站Gmail SMTP服务器,再通过SMTP将邮件传输到接收方的入站SMTP服务器等。

然而,我遇到了困难。如果我通过端口465 (gmail 出站SMTP邮件服务器规范) telnet 到 smtp.gmail.com,我在使用“HELO <blah@blah.com>”开始后立即断开连接,或者要求使用“STARTTLS”。我找不到如何继续进行的答案。

感谢您提供任何帮助。

附注:目前我正在使用星巴克的免费Wi-Fi访问互联网。 我无法直接从我的计算机上进行telnet(出现“主机没有路由”的错误)。 相反,只有当我首先SSH到我的学校网络上的远程Linux框中,然后从那里进行telnet时才能正常工作。 有任何想法是为什么吗?

谢谢!


2个回答

27

首先,看起来您正在使用错误的端口。 Gmail公开了端口465用于SMTP over SSL,端口587用于带有STARTTLS的SMTP,如此处所述。这两者之间的区别在于,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

但是,即使您通过telnet连接到587端口,也无法手动发送任何电子邮件。为了进行任何有趣的操作,您都需要启用STARTTLS,并且您将无法处理SSL/TLS二进制协议以协商加密。


5
试试使用Swaks,它可以弥补原始telnet和邮件客户端之间的差距。http://www.jetmore.org/john/code/swaks/ - Jed
对我来说,STARTTLS没有起作用,根据文档,587用于TLS,465用于SSL:https://support.google.com/a/answer/176600?hl=en - flotto

20

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位 不支持安全重新协商”。有什么建议吗?
- Eric Lang
@EricLang 你需要使用-CAfile或-CApath将CA证书传递给s_client。(TLS服务器应该发送完整的证书链。实际上,服务器通常会发送扣除根证书的证书链,因为它们假定客户端已经拥有了信任的根证书的副本。) - Erwan Legrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接