使用Bash脚本通过openssl s_client发送邮件失败求助
纯Bash下用openssl s_client发邮件的解决办法
问题可能的根因
手动执行命令能成功,脚本传参就失败,大概率踩了这几个坑:
- 变量没加双引号,导致邮箱、用户标识里的特殊字符(比如@、下划线)被Shell拆成多个参数
- 脚本里的SMTP命令序列没严格跟手动输入的流程一致,比如换行错误、命令顺序颠倒
- 脚本执行的环境变量和手动操作时不一致(比如PATH、编码设置)
可用的纯Bash脚本实现
下面是亲测有效的脚本,支持传入收件邮箱和用户标识参数,完全模拟手动交互的SMTP流程:
#!/bin/bash # 检查参数数量是否正确 if [ $# -ne 2 ]; then echo "用法: $0 <收件邮箱> <用户标识>" exit 1 fi # 接收参数,必须加双引号避免特殊字符拆分 RECIPIENT="$1" USER_ID="$2" # 替换为你自己的邮件服务器配置 SMTP_SERVER="smtp.example.com" SMTP_PORT="465" FROM_EMAIL="你的发件邮箱@example.com" SMTP_USER="你的发件邮箱@example.com" SMTP_PASS="你的SMTP授权密码" # 构建符合SMTP规范的邮件内容 EMAIL_CONTENT=$(cat <<EOF From: $FROM_EMAIL To: $RECIPIENT Subject: 用户$USER_ID的通知邮件 这是通过Bash脚本发送的测试邮件,用户标识:$USER_ID EOF ) # 执行openssl s_client发送邮件,严格遵循SMTP命令顺序 openssl s_client -connect "$SMTP_SERVER:$SMTP_PORT" -quiet <<EOF EHLO localhost AUTH LOGIN $(echo -n "$SMTP_USER" | base64) $(echo -n "$SMTP_PASS" | base64) MAIL FROM:<$FROM_EMAIL> RCPT TO:<$RECIPIENT> DATA $EMAIL_CONTENT . QUIT EOF
关键注意事项
- 变量必须加双引号:比如
"$RECIPIENT"、"$SMTP_SERVER:$SMTP_PORT",防止特殊字符被Shell误解析 - SMTP命令顺序不能乱:必须按
EHLO → 认证 → 发件人 → 收件人 → DATA → 内容 → . → QUIT的流程执行 - 邮件格式要合规:
DATA命令后必须包含完整的邮件头(From、To、Subject),最后单独一行的.是邮件内容结束标记,缺少则发送失败 - AUTH LOGIN需Base64编码:SMTP的LOGIN认证要求用户名和密码先转成Base64格式,用
echo -n避免额外换行符破坏编码结果
调试技巧
如果脚本仍失败,去掉-quiet参数查看完整SMTP交互日志,重点关注这些状态码:
- EHLO返回
250开头:服务器正常响应 - AUTH LOGIN后返回
235:认证成功 - MAIL FROM/RCPT TO返回
250:服务器接受发件人/收件人 - DATA后返回
354:允许发送邮件内容
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

