如何在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
相关产品推荐
相关产品推荐

