使用shell发送邮件,方便快捷,体验速射的快感

码农公社  210.net.cn   210是何含义?10月24日是程序员节,1024 = 210、210既 210 之意。

前言

很多时候我们需要发送邮件,比如定时任务,比如邮件验证码等等。

各大编程语言都可以实现发送邮件功能,但还是太麻烦了,所以通过tcpdump抓包发现smtp发送邮件原理还是很简单嘛。

所以就想着能不能通过shell搞定,这样在Linux平台下就很通用,不必准备各种安装环境啥的。


鉴赏代码

该脚本需要安装sudo apt-get install expect telnet这两个工具,一个负责tcp连接到smtp服务器,一个负责收发指令。

执行./mail.sh xxx@163.com password yyy@qq.com sendMsg 123456命令即可发送一封邮件。

需要注意的是现在各大邮件服务器发送邮件的密码是授权码,而不是登录邮箱密码。

可以试着使用编程语言发送复杂邮件,通过tcpdump抓包分析发送邮件的具体机制,自行模拟一下就ok了。

#!/bin/bash   
user=$1 
pass=$2 
to=$3 
subject=$4 
data=$5   
username=$(echo -n $user | base64) 
password=$(echo -n $pass | base64)   
expect <<EOF 
spawn telnet smtp.163.com 25 
expect "220 163.com*"   
send "EHLO localhost
" 
expect "250 8BITMIME"   
send "AUTH LOGIN
" 
expect "334 dXNlcm5hbWU6"   
send "$username
" 
expect "334 UGFzc3dvcmQ6"   
send "$password
" 
expect "235 Authentication 
successful"   
send "MAIL FROM:<$user> BODY=8BITMIME
" 
expect "250 Mail OK"   
send "RCPT TO: <$to>
" 
expect "250 Mail OK"   
send "DATA
" 
expect "354 End data with <CR><LF>.<CR><LF>"   
send "Mime-Version: 1.0
" 
send "From: <$user>
" 
send "To: $to
" 
send "Subject: $subject
" 
send "Content-Type: text/plain; charset=UTF-8
" 
send "Content-Transfer-Encoding: quoted-printable

" 
send $data send "
.
" 
expect "250 Mail OK*"   
send "QUIT
" 
expect EOF 
EOF



总结

该脚本解决了我的发送邮件验证码的小需求,以前都是通过编程语言去实现,有些有依赖,各种准备环境也麻烦。

而使用上述脚本可以灵活的满足各种需求,需要改动时直接修改shell脚本就ok了。妈妈再也不用担心我发邮件麻烦了。


作者:janbar

出处:https://www.cnblogs.com/janbar


评论