分页: 1 / 1

写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-27 20:22
centerpoint

代码: 全选

#!/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字

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-27 20:47
wenjianhn
一个小bug

139信箱长短信支持后
邮件短信通知的题最多提醒字数至少可达130

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-27 21:04
ptpt52
mark :em11

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-27 21:44
centerpoint
刚换头像了,是不是很 哈瓦伊 呢??? :em05

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-28 10:20
wenjianhn
脸要露多点就好了,太朦胧

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-28 13:27
c\nc
mknod /dev/tcp c 30 36
这样不就有了吗

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-28 14:32
Strange
这个不错,可以mark一下

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-28 19:49
centerpoint
毕竟使用和/dev/tcp
建立连接只在bash上面有效,所以建立连接的部分可以改成用telnet的,利用telnet建立tcp通道可以在非bash的环境下面使用

Re: 写了个bash脚本的smtp邮件客户端

发表于 : 2010-04-28 21:12
eexpress
支持折腾,就是折腾得太复杂了。不利用现成的。