写了个bash脚本的smtp邮件客户端
发表于 : 2010-04-27 20:22
代码: 全选
#!/bin/bash
#我那破机器运行太慢了,平时发个电子邮件也不想用多复杂的软件,就自己写了一个bash脚本的发邮件客户端。我平时都用这个发文字邮件的。我用的126和139信箱都可以。其他的没试过.debian的bash貌似不支持/dev/tcp 通信,不能用。ubuntu都可以的。
#这段脚本只能发送smtp邮件而不能接收邮件。默认使用nano编辑邮件正文。您可自行换作偏爱的编辑器。只支持文本邮件。
#配置发件人信箱。注意发信信箱(即mail_from)要和smtpserver一致!!!注意!!!!
#你们配置一下smtp的服务器就可以用了。提示输入收件人代号时输入“)”前的代号。比如: zuozhe 。其他收件人条目自己添加。
#我是centerpoint 联系我:[email protected]
clear
#显示源代码的一部分作为收件人列表。方便把收件人直接添加到源代码的case语句中。
sed -n '/^#list_start/,/^#list_end/p' $0 | sed -n '1!p' | sed -n '$!p'
#配置默认smtp服务器
smtpserver="smtp.139.com" smtpserverport="25" user="XXXX" password="XXXX" mail_from="[email protected]"
#设置第二smtp服务器
[ "$1" = "126" ] && smtpserver="smtp.126.com" smtpserverport="25" user="XXXX" password="XXXX" mail_from="[email protected]"
#设置收件人信箱
read -p "请输入收件人代号:" shoujianren
case $shoujianren in
#list_start
#################收件人列表##################
zuozhe) #作者
mail_rcpt="[email protected]" ;;
oneleaf) #一叶大侠
mail_rcpt="[email protected]" ;;
囗囗囗) #囗囗囗
mail_rcpt="[email protected]" ;;
modi) #修改脚本
nano $0 & exit ;;
*) #直接回车手动输入
#list_end
read -p "请输入收件人:"
mail_rcpt="$REPLY" ;;
esac
clear
echo "发件邮箱是$mail_from"
echo -n "收件人:${mail_rcpt}" "--------> "
sed -n '/^mail_rcpt="'${mail_rcpt}'"/{g;1!p;};h' $0
#取得用户名和密码的base64编码
user_base64=`echo -e "${user}\c" |base64 `
password_base64=`echo -e "${password}\c" |base64 `
#初始化step变量
step="step1"
#写邮件
temp_mail="`mktemp`"
temp_mail_body="`mktemp`"
temp_mail_temp="`mktemp`"
echo "************写邮件*************"
read -p "输入邮件的主题: "
#统计主题汉字字数,但是汉字和英文混合时结果会错。
zishu=`echo "${REPLY}" | wc -c`
zishu=`expr ${zishu} - 1`
zishu=`expr ${zishu} / 3`
[ $zishu -ge 30 ] && echo "主题的字数为${zishu}, 移动信箱邮件短信通知的题最多提醒30字" #用139的新邮件短信提醒来发“短信”时这句有点用。
echo "subject: "${REPLY}"" > ${temp_mail}
echo >> ${temp_mail}
#read -p "输入邮件的正文(回车确认)" #提示你下一步只需输入邮件正文。此句可自行注释掉。
nano ${temp_mail_body}
read -p "确认发送给 ${mail_rcpt} 吗?(回车确认)" #如果你的编辑器是后台运行的,就是脚本不等编辑器关闭就继续执行,那么这句不可注释掉。
sed -i 's/^\.$//' ${temp_mail_body} #正文中如果出现单独的.(点号)占一行。则自动删除掉。
cat ${temp_mail_body} >> ${temp_mail}
echo >> ${temp_mail}
echo "." >> ${temp_mail}
#把邮件编码从utf8转换为gbk,因为某些信箱(比如139)主题不支持utf8
iconv -c -f utf-8 -t gbk ${temp_mail} > ${temp_mail_temp}
cp ${temp_mail_temp} ${temp_mail}
######################发送邮件#########################
echo "**********发送邮件*********"
#连接smtp服务器,把到smtp的tcp连接打开为文件描述符 3
echo "正在连接到 "${smtpserver}":"${smtpserverport}" ......"
#如果连接服务器失败就退出.否则提示成功
if ! exec 3<> /dev/tcp/"${smtpserver}"/"${smtpserverport}"; then
echo "无法连接到 "${smtpserver}":"${smtpserverport}",请检查网络。" && exit 1
else
echo "连接服务器成功 !"
fi
#先向服务器发送HELO消息。
echo "HELO server" 1>&3 && echo "HELO server"
######进入读写tcp的循环
while : ; do
read -t 0.1 SMTP_MSG 0>&3
SMTP_MSG="${SMTP_MSG%?}" #语句净化
#根据返回消息确定发送内容
[ "${SMTP_MSG}" != "" ] && echo "GET: ${SMTP_MSG}" #如果读tcp不为空则原样输出以供监视
if [ "${SMTP_MSG}" != "" ] ; then
#Esmtp发邮件需要身份验证。
echo "${SMTP_MSG:0:6}" | grep -q "250 OK" && echo "auth login" 1>&3 && echo "auth login"
echo "${SMTP_MSG:0:16}" | grep -q "334 dXNlcm5hbWU6" && echo "${user_base64}" 1>&3 && echo ${user_base64}
echo "${SMTP_MSG:0:16}" | grep -q "334 UGFzc3dvcmQ6" && echo "${password_base64}" 1>&3 && echo "${password_base64}"
#开始发送信封
echo "${SMTP_MSG:0:29}" | grep -q "235 Authentication successful" && echo "mail from:<${mail_from}>" 1>&3
echo "${SMTP_MSG:0:11}" | grep -q "250 Mail OK" && [ "${step}" = "step1" ] && echo "RCPT TO:<${mail_rcpt}>" 1>&3 && step="step2"
#开始发送邮件本身
echo "${SMTP_MSG:0:11}" | grep -q "250 Mail OK" && [ "${step}" = "step2" ] && echo "data" 1>&3 && step="step3"
echo "${SMTP_MSG:0:35}" | grep -q "354 End data with <CR><LF>.<CR><LF>" && cat ${temp_mail} 1>&3 && echo "cat done"
#俘获发送成功的返回信息
echo "${SMTP_MSG:0:21}" | grep -q "250 Mail OK queued as" && echo "quit" 1>&3 && rm ${temp_mail} ${temp_mail_temp} && echo "邮件发送成功!" && exit 0
fi
done
#139信箱邮件短信通知的题最多提醒30字