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

如何在Bash脚本中通过Telnet批量执行命令发送认证邮件?

用Telnet在Bash脚本中批量执行SMTP命令的解决方案

问题场景

我正在编写Bash脚本,想用Telnet发送经过认证的邮件,但Telnet连接建立后会进入交互提示符,后续命令没法自动执行。我想把以下SMTP命令整合成一行执行:

telnet 1.2.3.4 25
HELO 1.2.3.4
AUTH LOGIN
djwijdoawd
igjifidjei
MAIL FROM: user1@lab.com
RCPT TO: user2@lab.com
DATA
Hello world!
quit

我试过下面的写法,但完全没用:

telnet 1.2.3.4 25 && HELO 1.2.3.4 && AUTH LOGIN && djwijdoawd && igjifidjei && MAIL FROM: user1@lab.com && RCPT TO: user2@lab.com && DATA && This is a test! && quit

解决方案

你之前的写法错误在于,&&是让shell依次执行独立的命令,而不是把后续命令传给Telnet的交互会话。要把命令批量传给Telnet,有几种可行的方式:

方法1:使用管道(Pipe)

把所有SMTP命令通过管道传给telnet,用echo -e生成换行符分隔命令:

echo -e "HELO 1.2.3.4\nAUTH LOGIN\ndjwijdoawd\nigjifidjei\nMAIL FROM: user1@lab.com\nRCPT TO: user2@lab.com\nDATA\nHello world!\n.\nquit" | telnet 1.2.3.4 25

注意:SMTP的DATA命令结束必须单独发送一行.,你原来的命令里漏掉了,这会导致邮件无法正常提交。

方法2:使用Here-Document( heredoc)

这种方式可读性更强,适合命令较多的场景:

telnet 1.2.3.4 25 << EOF
HELO 1.2.3.4
AUTH LOGIN
djwijdoawd
igjifidjei
MAIL FROM: user1@lab.com
RCPT TO: user2@lab.com
DATA
Hello world!
.
quit
EOF

方法3:使用Expect工具(处理复杂交互)

如果Telnet连接有延迟,或者需要精准匹配服务器响应码,可以用Expect控制交互流程:

expect << 'EOF'
spawn telnet 1.2.3.4 25
expect "220"
send "HELO 1.2.3.4\r"
expect "250"
send "AUTH LOGIN\r"
expect "334"
send "djwijdoawd\r"
expect "334"
send "igjifidjei\r"
expect "235"
send "MAIL FROM: user1@lab.com\r"
expect "250"
send "RCPT TO: user2@lab.com\r"
expect "250"
send "DATA\r"
expect "354"
send "Hello world!\r.\r"
expect "250"
send "quit\r"
expect eof
EOF

这种方式能避免因网络延迟导致命令发送时机错误,稳定性更高。


内容的提问来源于stack exchange,提问作者Andrew Campi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:25:28