Linux控制台发送邮件脚本卡顿求助:首命令阻塞后续无法执行
解决Linux控制台发送邮件脚本阻塞卡顿的问题
看起来你遇到的问题是脚本写法导致的——openssl s_client启动后进入了交互式等待状态,后面的SMTP命令根本没机会执行,直接卡住了。我来帮你拆解问题并给出修复方案:
问题根源
你的脚本把所有命令堆在一行,openssl s_client是一个交互式工具,启动后会等待你手动输入SMTP指令,所以整个进程会一直卡在这一步,后续命令完全无法触发。另外AUTH PLAIN的写法也不符合SMTP协议要求,直接写login:pass是无效的。
修复后的脚本示例
#!/bin/bash # 使用Here Document传递多行SMTP命令给openssl进程 openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587 << EOF # 生成符合PLAIN认证标准的base64编码字符串:格式为\0用户名\0密码 AUTH PLAIN $(echo -ne "\0test@gmail.com\0your_actual_password" | base64) MAIL FROM:<test@gmail.com> RCPT TO:<test2@gmail.com> DATA Subject: 测试邮件 这是我的测试邮件内容 . QUIT EOF
关键细节解释
- Here Document (
<< EOF):这是Shell传递多行输入给进程的标准方式,它会把EOF之间的所有内容自动发送给openssl s_client,避免了手动输入导致的阻塞。 - AUTH PLAIN 认证格式:SMTP的PLAIN认证要求输入是
\0用户名\0密码的base64编码,所以我们用echo -ne生成这个特殊格式的字符串,再通过base64编码后传递给服务器,这样才能通过认证。 - 邮件格式规范:
DATA命令后要编写邮件内容,最后必须单独一行写.来结束邮件正文,这是SMTP协议的强制要求。 - 命令换行:每个SMTP命令(AUTH、MAIL FROM、RCPT TO等)必须单独一行,否则服务器无法正确解析指令。
额外注意事项
- 如果你的Gmail账号开启了两步验证(2FA):不能使用普通密码,必须去Google账号设置里生成一个应用专用密码(App Password),用这个密码替换脚本里的
your_actual_password。 - 如果没开2FA:需要在Gmail设置中开启“允许低安全性应用访问”(Google现在默认关闭该选项,你需要手动调整)。
- 简化输出:可以给
openssl s_client添加-quiet参数,过滤掉冗余的SSL连接信息,让输出更简洁。 - 分步测试:如果还是有问题,可以先单独运行
openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587,手动输入SMTP命令验证流程正常后,再写成脚本,更容易定位问题。
内容的提问来源于stack exchange,提问作者Andrew Moskovets
相关产品推荐
相关产品推荐

