我知道 SMTP 服务器需要 TLS,所以我使用 OpenSSL(在 Windows 上)。
openssl s_client -connect smtp.gmail.com:465 -crlf
现在,我知道我必须\x00myemail\x00password
使用 base64 对包含我的帐户和密码的字符串(基本上是)进行编码。一切进展顺利:
AUTH PLAIN <encodedString>
235 2.7.0 Accepted
问题是当我尝试写我的消息时:
MAIL FROM:<myemail>
250 2.1.0 OK qwertyzxcv.1 - gstmp
RCPT TO:<myemail>
RENEGOTIATING
depth=1 C = US, O = Google Inc, CN = Google Internet Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
事实是,我不明白该错误消息。我必须生成一些证书吗?如果是这样,我该怎么做(再次,在 Windows 上)?
rcpt
EDIT[0]:我终于解决了这个问题。你必须用小写字母写命令,因为R
这样会使 OpenSSL 重新协商。但现在,我遇到了一个新问题。SMTP 服务器似乎无法识别命令DATA
:
DATA
502 5.5.1 Unrecognized command qwertyzxcv.1 -gsmtp
答案1
好的,我终于解决了我的两个问题:。
第一个问题是关于
RENEGOTIATING
事物的。解决方案是将命令(或至少以 开头的命令R
)用小写形式书写。OpenSSL 将大写字母解释R
为重新协商 TLS 的命令。第二个问题是服务器“无法识别DATA命令”。这个问题一开始就出现了:
openssl s_client -connect smtp.gmail.com:465 -crlf
互联网上的所有教程都说你应该使用该-crlf
选项,这是真的,对于 Linux。如果您使用的是 Windows,请不要使用该选项。该选项是,根据文件:
此选项将终端的换行符转换为 CR+LF,以满足某些服务器的要求。
我认为,即使 Windows 使用 CR+LF,OpenSSL 也会强制将换行符设为 LF,以便与 unix 实现保持一致。我错了。事实上,现在我不知道该-crlf
选项的作用是什么在 Windows 上。也许它将 CR+LF 翻译成 LF?不过,考虑到该选项的名称,这会很奇怪。