如何通过 OpenSSL 通过 Gmail SMTP 发送电子邮件(在 Windows 上)?

如何通过 OpenSSL 通过 Gmail SMTP 发送电子邮件(在 Windows 上)?

我知道 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 上)?

rcptEDIT[0]:我终于解决了这个问题。你必须用小写字母写命令,因为R这样会使 OpenSSL 重新协商。但现在,我遇到了一个新问题。SMTP 服务器似乎无法识别命令DATA

DATA
502 5.5.1 Unrecognized command qwertyzxcv.1 -gsmtp

答案1

好的,我终于解决了我的两个问题:。

  1. 第一个问题是关于RENEGOTIATING事物的。解决方案是将命令(或至少以 开头的命令R)用小写形式书写。OpenSSL 将大写字母解释R为重新协商 TLS 的命令

  2. 第二个问题是服务器“无法识别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?不过,考虑到该选项的名称,这会很奇怪。

相关内容