发送邮件加密附件
最近家里有事,所以只能暂时用着笔记本(现在就是,不好用),还有接下来忙着复习考试,等考完试再慢慢补博客吧~~加班比较多,工作上也发生挺多事的,自己搞的生产故障也有2个,离监狱的大门只有一步之遥,哈哈哈(常在河边走,哪有不湿鞋)。
说说需求,昨天经理临时给我任务:写个脚本,用email发送文件附件,因为有个同事天天需要查sql,导出为csv文件,然后加密文件发送,想我解放他的双手。
单单一句话,有点懵,就发了文章跟领导确认,是否要实现这样的效果【使用shell脚本发送邮件带附件 】。他说是,所以下面步骤基本参考该文,今天算是完全搞掂了,已经放生产。
,纪念我的光辉历史
注意点:
(1)要使用脚本发送邮件,必须设置发送邮箱开启IMAP/SMTP服务。我这里用的是公司阿里云企业邮箱作为发送方,部署在公司内网虚拟机上的。本来想在ECS部署(想着可以内网连接RDS查询数据嘛,节省带宽~~),发现原来阿里云ECS实例25端口为了安全起见默认受限,需要申请,否则ECS是不通邮件服务器的(telnet 端口)。现在部署在公司虚拟机,所以只能使用RDS的外网数据库连接了,走公网就公网吧,反正查数据库的用户是只读权限的。163邮箱需要授权码,阿里的企业邮箱(免费版)不需要,直接登录密码就行。
(2)脚本整体思路:smtp ——》 查sql ——》制作邮件(标题、发送内容、附件文件)——》加密附件文件 ——》发送
其中查sql这里要注意表头长度限制,否则会出现显示不全问题,解决措施是将表头内容写入sql里面
(3)比较坑爹的一个点,客户方那边用的是office,打开csv附件内容竟然是乱码,因为linux导出csv编码默认是utf-8,而office是ANSI编码,所以脚本里面有个iconv转码的操作,wps打开没这个问题。
1 #!/bin/bash
2
3 #接收人邮箱
4 EMAIL_RECIVER="加一的邮箱"
5 ## 发送人邮箱(阿里企业邮箱)
6 EMAIL_SENDER=xxx@xxx.com
7 #发送人邮箱用户名
8 EMAIL_USERNAME=xxx@xxx.com
9
10 #发送人邮箱密码
11 EMAIL_PASSWORD=发送人邮箱用户密码
12
13 #smtp服务器地址
14 EMAIL_SMTPHOST=smtp.qiye.aliyun.com
15
16 #年月日
17 YMD=`date +%Y%m%d`
18 #邮件标题
19 EMAIL_TITLE="数据$YMD"
20
21 #运行sql时间
22 RUNSQL_BeginTIME=`date +%H:%M`
23 #邮件内容引用到的时间
24 Last_Time=`date -d '1 days ago' +%Y%m%d`
25 Month=`date -d '1 days ago' +%m`
26 Day=`date -d '1 days ago' +%d`
27 Send_Year=`date +%Y`
28 Send_Month=`date +%m`
29 Send_Day=`date +%d`
30
31 #统计sql条数,后面邮件内容要用到,后来我发现可以优化成:直接查下面的csv行数,再减1就行(去掉表头),不过懒得改
32 SQLCOUNT=count.sql
33 COUNT=`mysql -h RDS外网连接地址 -u 用户名 -p'密码' --default-character-set=utf8 < $SQLCOUNT`
#查出来的数量需要截取下,不然包含关键字count(1)或者 count(*)
34 SQL_COUNT=`echo $COUNT |awk '{print $2}'`
35
36 SQL_BeginMin=`date +%M`
37 SQL_BeginHour=`date +%H`
38
39
40 ## 制作邮件内容
41 >content.html
42 cat >content.html<<EOF
43 <div>
44 <p>你好!</p>
45 <p style="margin-left: 30px;">附件中为$Month月$Day日0点至$Send_Month月$Send_Day日$SQL_BeginHour点$SQL_BeginMin xxx的信息。</p>
46 <p style="margin-left: 30px;">条数:$SQL_COUNT</p>
47 <p> </p>
48
49 </div>
50 EOF
51
52 EMAIL_EXCEL=$(cat content.html)
53
54
55 ## 附件文件内容查询
56 ##年月日,附件文件名引用
57 time=`date +"%Y-%m-%d"`
58
59 runsql=query.sql
60 result=result/数据.csv
61 mysql -h RDS外网连接地址 -u 用户名 -p'密码'--default-character-set=utf8 < ${runsql} > ${result}
62
63
64 ## 删掉第一行表头
65 cd /root/mail/result
66 sed -i '1d' 数据.csv
67
68 ## 转编码,不然office打开为乱码
69 iconv -c -f utf-8 -t gb2312 数据.csv > 数据_${time}.csv
70
71 ## 对附件文件加密,注意不要拼接文件路径,不然解压缩的时候会把文件所在目录都显示出来,这样不够安全
72 Passwd=加密密码
73 zip -P ${Passwd} result_${time}.zip 数据_${time}.csv
74
75 #附件文件
76 FILE1_PATH=result_${time}.zip
77
78 ## 发邮件
79 sendEmail -f ${EMAIL_SENDER} -t ${EMAIL_RECIVER} -s ${EMAIL_SMTPHOST} -u ${EMAIL_TITLE} -xu ${EMAIL_USERNAME} -xp ${EMAIL_PASSWORD} -m ${EMAIL_EXCEL} -a ${FILE1_PATH} -o tls=no -o message-charset=utf-8 -o message-content-type=html
效果图:
注意:附件压缩用中文名的话会乱码(影响不大,就先不研究了,反正解压后csv文件的文件名中文显示正常),所以我改成result_年月.zip