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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:36:44