You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

关键注意事项

  1. 变量必须加双引号:比如"$RECIPIENT"、"$SMTP_SERVER:$SMTP_PORT",防止特殊字符被Shell误解析
  2. SMTP命令顺序不能乱:必须按EHLO → 认证 → 发件人 → 收件人 → DATA → 内容 → . → QUIT的流程执行
  3. 邮件格式要合规:DATA命令后必须包含完整的邮件头(From、To、Subject),最后单独一行的.是邮件内容结束标记,缺少则发送失败
  4. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 13:43:42