发送邮件加密附件
最近家里有事,所以只能暂时用着笔记本(现在就是,不好用),还有接下来忙着复习考试,等考完试再慢慢补博客吧~~加班比较多,工作上也发生挺多事的,自己搞的生产故障也有2个,离监狱的大门只有一步之遥,哈哈哈(常在河边走,哪有不湿鞋)。
说说需求,昨天经理临时给我任务:写个脚本,用email发送文件附件,因为有个同事天天需要查sql,导出为csv文件,然后加密文件发送,想我解放他的双手。
单单一句话,有点懵,就发了文章跟领导确认,是否要实现这样的效果【使用shell脚本发送邮件带附件 https://blog.csdn.net/bingdianone/article/details/100879050】。他说是,所以下面步骤基本参考该文,今天算是完全搞掂了,已经放生产。
我讲下注意点,然后直接贴脚本,脚本注释写的很详细的,因为经理说要留存,纪念我的光辉历史
注意点:
(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="加一的邮箱@qq.com" 5 ## 发送人邮箱(阿里企业邮箱) 6 [email protected] 7 #发送人邮箱用户名 8 [email protected] 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 user -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 >mail.html 42 cat >mail.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 mail.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 user -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
效果图:
![](/i/l/?n=22&i=blog/520218/202211/520218-20221117220215137-1127651906.png)
注意:附件压缩用中文名的话会乱码(影响不大,就先不研究了,反正解压后csv文件的文件名中文显示正常),所以我改成result_年月.zip
标签:加密,+%,发送,date,附件,csv,EMAIL,邮件 From: https://www.cnblogs.com/windysai/p/16901176.html