首页 > 解决方案 > 在 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 连接重新开始吗?

标签: c++smtpstarttls

解决方案


在您发送一个(未加密的)STARTTLS命令后,如果服务器返回除 之外的任何回复220,则处理它出现故障并根据需要继续使用其他 SMTP 命令(尽管此时,唯一真正有意义的是QUIT)。

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

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

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


推荐阅读