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

使用Bash脚本通过Telnet发送邮件时遇‘newline’意外令牌错误

解决Bash脚本发送邮件时的"unexpected token 'newline'"错误

问题背景

之前手动用telnet能发送邮件,现在写了个Bash脚本想简化操作,但执行时一直报"unexpected token 'newline'"错误,试过去掉括号结构、添加sleep延迟都没解决,目标是用脚本给自己发送邮件。

原脚本代码:

#!/bin/bash
echo 'Enter your email'
read email

echo 'Enter your password'
read password

echo 'Enter who you want to send an email to'
read recipient

echo 'Enter your subject'
read subject

echo 'Enter your message'
read message

newPassword=$(echo -ne $password | base64)
newEmail=$(echo -ne $email | base64)

(
telnet -z ssl smtp.gmail.com 465
echo 'Sleeping: about to run HELO'
sleep 2
HELO hellogoogle
echo 'Sleeping: about to run AUTH'
sleep 2
AUTH LOGIN
echo 'Sleeping: about to enter email'
sleep 2
newEmail
echo 'Sleeping: about to enter password'
sleep 2
newPassword
echo 'Sleeping: about to run FROM'
sleep 2
MAIL FROM:<email>
echo 'Sleeping: about to run TO'
sleep 2
RCPT TO:<recipient>
echo 'Sleeping: about to run DATA'
sleep 2
DATA
echo 'Sleeping: about to enter subject'
sleep 2
Subject: subject
echo 'Sleeping: about to enter message'
sleep 2
message
.
) | telnet

错误原因

  • SMTP命令被当成Bash命令执行:HELO、AUTH LOGIN这些是要发送给SMTP服务器的指令,直接写会被Bash当成系统命令,导致找不到命令报错。
  • 变量引用错误:MAIL FROM:<email>里的email是变量,必须用$email才能取到值;newEmail、newPassword等变量也需要用echo输出,否则Bash会把它们当成命令。
  • telnet用法错误:原脚本的管道方向和连接方式不对,且多数telnet版本不支持SSL连接465端口,建议用openssl s_client替代。
  • 多余的端口检查命令:telnet -z ssl是端口连通性检查,放在子shell里完全没必要。

修复后的脚本

#!/bin/bash
echo '输入你的邮箱'
read email

echo '输入你的密码(Gmail开启2FA后需用应用专用密码)'
read -s password  # 用-s隐藏密码输入

echo '输入收件人邮箱'
read recipient

echo '输入邮件主题'
read subject

echo '输入邮件内容(输入完按Ctrl+D结束)'
read -d '' message  # 支持多行内容输入

# 对邮箱和密码进行Base64编码
newPassword=$(echo -n "$password" | base64)
newEmail=$(echo -n "$email" | base64)

# 用openssl s_client连接Gmail的SMTP SSL端口,通过管道发送SMTP指令
{
    echo "HELO hellogoogle"
    sleep 1
    echo "AUTH LOGIN"
    sleep 1
    echo "$newEmail"
    sleep 1
    echo "$newPassword"
    sleep 1
    echo "MAIL FROM:<$email>"
    sleep 1
    echo "RCPT TO:<$recipient>"
    sleep 1
    echo "DATA"
    sleep 1
    echo "Subject: $subject"
    echo ""  # 主题和内容之间需要空行
    echo "$message"
    echo "."  # 结束邮件内容
    sleep 1
    echo "QUIT"
} | openssl s_client -connect smtp.gmail.com:465 -quiet

注意事项

  • Gmail设置:如果使用Gmail,未开启2FA需先开启「不太安全的应用访问」;开启2FA后要创建「应用专用密码」替代原密码。
  • 延迟调整:若指令发送不及时,可适当增大sleep的时间(比如改成sleep 2)。
  • 多行内容:修复后的脚本用read -d ''支持输入多行邮件内容,输入完成后按Ctrl+D即可。

内容的提问来源于stack exchange,提问作者Jordan Taylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 04:01:41