发送邮件加密附件

  最近家里有事,所以只能暂时用着笔记本(现在就是,不好用),还有接下来忙着复习考试,等考完试再慢慢补博客吧~~加班比较多,工作上也发生挺多事的,自己搞的生产故障也有2个,离监狱的大门只有一步之遥,哈哈哈(常在河边走,哪有不湿鞋)。

  说说需求,昨天经理临时给我任务:写个脚本,用email发送文件附件,因为有个同事天天需要查sql,导出为csv文件,然后加密文件发送,想我解放他的双手。

  单单一句话,有点懵,就发了文章跟领导确认,是否要实现这样的效果【使用shell脚本发送邮件带附件 】。他说是,所以下面步骤基本参考该文,今天算是完全搞掂了,已经放生产。

,纪念我的光辉历史

注意点:

(1)要使用脚本发送邮件,必须设置发送邮箱开启IMAP/SMTP服务。我这里用的是公司阿里云企业邮箱作为发送方,部署在公司内网虚拟机上的。本来想在ECS部署(想着可以内网连接RDS查询数据嘛,节省带宽~~),发现原来阿里云ECS实例25端口为了安全起见默认受限,需要申请,否则ECS是不通邮件服务器的(telnet 端口)。现在部署在公司虚拟机,所以只能使用RDS的外网数据库连接了,走公网就公网吧,反正查数据库的用户是只读权限的。163邮箱需要授权码,阿里的企业邮箱(免费版)不需要,直接登录密码就行。

(2)脚本整体思路:smtp ——》 查sql ——》制作邮件(标题、发送内容、附件文件)——》加密附件文件 ——》发送

其中查sql这里要注意表头长度限制,否则会出现显示不全问题,解决措施是将表头内容写入sql里面

java 邮件中附件中文乱码 java邮件附件加密_java 邮件中附件中文乱码

(3)比较坑爹的一个点,客户方那边用的是office,打开csv附件内容竟然是乱码,因为linux导出csv编码默认是utf-8,而office是ANSI编码,所以脚本里面有个iconv转码的操作,wps打开没这个问题。

java 邮件中附件中文乱码 java邮件附件加密_java 邮件中附件中文乱码_02

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

效果图:

java 邮件中附件中文乱码 java邮件附件加密_SQL_03

 

 

 注意:附件压缩用中文名的话会乱码(影响不大,就先不研究了,反正解压后csv文件的文件名中文显示正常),所以我改成result_年月.zip

java 邮件中附件中文乱码 java邮件附件加密_数据_04