c++ - 在 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
命令后,如果服务器返回除 之外的任何回复220
,则处理它出现故障并根据需要继续使用其他 SMTP 命令(尽管此时,唯一真正有意义的是QUIT
)。
如果服务器返回220
,STARTTLS
则您需要在现有 TCP 连接上执行实际的 TLS 握手,从 TLS CLIENT HELLO 开始。无论您在套接字上使用什么 TLS 库,都应该能够为您处理这个问题,不要从头开始实现它。
如果 TLS 握手成功,那么您可以发送更多 SMTP 命令(通过 TLS 加密通道),从一个新命令开始EHLO
(因为服务器的功能可能并且可能会改变,最明显的是可用的AUTH
方案),然后是AUTH
, MAIL FROM
, RCPT TO
, DATA
/BDAT
等,最后QUIT
,根据需要。
如果 TLS 握手失败,TCP 连接将处于未知状态,因此无法进行进一步的 SMTP 通信。那时您所能做的就是关闭 TCP 连接并重新开始。
推荐阅读
- heroku - 如何在heroku上使用dlib预测器部署django rest API?
- parsing - 备注:如何在 MDAST 中解析 HTML 标签及其内容
- python - 具有多个输出 Python 的拟合函数
- typescript - Typescript - 'string' 类型的表达式不能用于索引类型
- c# - 如何在视图中显示月份名称而不是月份编号?
- android-fragments - 无法从 LiveData 获取数据
- angular - 将其他用户列添加到周视图日历
- java - 有没有办法删除链接列表节点,以使这段代码中的头部成为唯一剩下的东西?
- javascript - 将 jQuery ajax 转换为 fetch
- typescript - 高级 TS 类型:镜像键但成为新值的包装器类型