我应该在 STARTTLS 之后发送什么?

What should I send after STARTLS?

我正在使用 smtp.gmail.com 和端口 587。连接成功后,我发送 EHLO 并收到以下内容:

250-smtp.gmail.com at your service, [62.16.4.123]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF

我选择了STARTTLS,然后我不知道要向服务器发送什么以及登录和发送电子邮件。

如果我发送类似于 AUTH LOGIN 或 base64 加密的密码登录,连接将断开。

有人可以解释我的客户应该发送什么来成功完成 STARTTLS 协商吗?

或者,我应该使用新的 SSL 连接重新开始吗?

在您发送(未加密的)STARTTLS 命令后,如果服务器 returns 除了 220 以外的任何回复,则处理失败并继续执行其他 SMTP 命令需要(尽管在这一点上,唯一真正有意义的是 QUIT)。

如果服务器 returns 220STARTTLS,则需要在现有 TCP 连接上执行实际的 TLS 握手,从 TLS CLIENT HELLO 开始。无论您在套接字上使用什么 TLS 库都应该能够为您处理这个问题,不要从头开始实施。

如果 TLS 握手成功,那么您可以发送更多的 SMTP 命令(通过 TLS 加密通道),从新的 EHLO 开始(因为服务器的功能可能会改变,最显着的是可用的 AUTH 方案),然后是 AUTHMAIL FROMRCPT TODATA/BDAT 等,最后是 QUIT, 根据需要。

如果 TLS 握手失败,TCP 连接将处于未知状态,因此无法进行进一步的 SMTP 通信。此时您所能做的就是关闭 TCP 连接并重新开始。