因此,我尝试编写一个 bash 脚本,使用 openssl 向使用 smtp.gmail.com 服务器的某人发送邮件。
到目前为止一切运行正常:
printf "helo gmail.com\nauth plain $auth\n" | openssl s_client -connect smtp.gmail.com -crlf -quiet
但是当我将邮件添加到命令时,显示一个错误。
printf "helo gmail.com\nauth plain $auth\nmail from: <[email protected]>\n" | openssl s_client -connect smtp.gmail.com -crlf -quiet
显示的错误是:
451 4.5.0 SMTP protocol violation, see RFC 2821 lf3-20020a170902fb4300b0019f3141429csm696647plb.160 - gsmtp read:errno=0
我尝试了很多方法,包括将 MAIL FROM 保持大写:[电子邮件保护]或 邮件发自:[电子邮件保护]。还尝试不使用 '\n'。甚至尝试使用 echo。还改为执行以下操作:
openssl s_client -connect smtp.gmail.com:465 -crlf -quiet<<EOF
helo gmail.com
auth plain $auth
mail from: <[email protected]>
rcpt to: <[email protected]>
data
.
EOF
但运气不好。甚至还写了完整的正文。问题肯定出在命令邮件上。
有什么建议么?
答案1
SMTP 服务器不需要同时读取多个连续的命令。
printf "helo gmail.com\nauth plain $auth\n"
这会将整个字符串(两个命令)一次性以一个 blob 的形式发送到 SMTP 服务器。
这是垃圾邮件软件的典型行为。许多邮件服务器会检测到同时收到多个命令,然后停止一切。这些邮件服务器要求连接客户端严格遵守 SMTP 规则:发送一个命令,等待服务器的响应,然后发送下一个命令。如果它在回复第一个命令之前立即读取下一个命令,那么您就完蛋了。
此外,SMTP 要求行以 结尾,\r\n
而不是以 结尾\n
,一些 SMTP 服务器也会检测到此协议违规,并告诉您关闭。这可能是您尝试失败的另一个原因。
有一个名为 的 SMTP 扩展PIPELINING
,它允许 SMTP 发送者批量处理某些命令,并一次性将其发出,但它不适用于此处。
为了使其工作,您必须做更多的工作才能模拟 SMTP 发送者:发送一个命令,等待服务器回复,然后发送另一个命令。应该可以使用 shell 脚本制作类似的东西,棘手的部分是如何将 shell 脚本附加到 TLS 包装器,以将标准输入和输出重定向到它。这是可行的,但需要很多技巧。