如何将SQL结果导出为Excel并自动发送邮件

shell脚本:

#!/bin/bash
#通过shell查询数据信息并保存在excel中,并记录日志
#Data:2018-06-14
#Name:Zhang

#数据库连接地址
DBServer=
#数据库用户名
DBUserName=

#数据库密码
DBPasswd=
###########################################################
#选择数据库
Use_Cmd="use 数据库名称"
#查询数据库信息Sql语
Select_Cmd="select * from  ap_vb where ap='1';"
###########################################################
#保存路径
Payment_DataDir="/opt/dingshi/backup"
#日志保存路径
LogDir="/opt/dingshi/log"
#数据导出时间
backtime=`date +%Y%m%d%H%M`
#保存文件名称
DataName="申请"
###########################################################
MKDIR="/bin/mkdir"
#########################################################

echo "##################判断备份路径 #############################"
test ! -d $Payment_DataDir && $MKDIR -p $Payment_DataDir
test ! -w $Payment_DataDir && echo "Error: $Payment_DataDir is un-writeable." && exit 0
test ! -d $LogDir && $MKDIR -p  $LogDir
test ! -w $LogDir && echo "Error: $LogDir is un-writeable." && exit 0

echo "######################备份开始 #############################"
echo "" >> $LogDir/$DataName.log
echo -e "\033[44;32m-------------------------分割线-----------------------\033[0m \n" >> $LogDir/$DataName.log
echo "导出时间为$backtime,导出${DataName}文件开始" >> $LogDir/$DataName.log
/usr/bin/mysql(MySQL命令绝对路径) -u$DBUserName -h$DBServer -p$DBPasswd  -e "$Use_Cmd;$Select_Cmd" > $Payment_DataDir/$DataName-$backtime.xls
#sed -i 's/^/`&/g' $Payment_DataDir/$DataName-$backtime.xls
#使用iconv转换编码格式,把linux的utf8转换成windows的gbk
iconv -f "utf-8" -t "gbk" $Payment_DataDir/$DataName-$backtime.xls > $Payment_DataDir/Orders.xls
#因第一列数据超过18位,excel中使用了科学计数法,所以把第一列加了“`”转换成文本格式
sed -i 's/^/`&/g' $Payment_DataDir/Orders.xls
if [ "$?" == 0 ];then
    echo "导出时间为$backtime,导出$DataName文件结束!!!" >> $LogDir/$DataName.log
    echo "Mysql-$DataName数据导出成功!!!" >> $LogDir/$DataName.log
else
    echo "导出时间为$backtime,导出$DataName文件结束!!!" >> $LogDir/$DataName.log
    echo "Mysql-$DataName数据导失败!!!" >> $LogDir/$DataName.log
fi

echo "######################导出数据结束,时间为:$backtime#####"
注意:若提示脚本不能有MySQL密码  可以直接将错误提示重定向到系统文件中

/usr/bin/mysql(MySQL命令绝对路径) -u$DBUserName -h$DBServer -p$DBPasswd  -e "$Use_Cmd;$Select_Cmd" 

 2>/dev/null  > $Payment_DataDir/$DataName-$backtime.xls

---------------------------------------------------------------------------------------------------------------------

由于阿里云不开放25端口,所以使用加密端口对外发送邮件

1、关闭其它的邮件工具

1

2

3

4

service sendmail stop

chkconfig sendmail off

service postfix stop

chkconfig postfix off

2、安装mailx

1

yum install mailx

3、首先在邮箱中开启smtp,开启后会得到一个授权码,这个授权码就代替了密码(自行去邮箱开启)。

4、请求数字证书(这里用的qq邮箱,所以向qq请求证书)

1

2

3

4

5

6

mkdir -p /root/.certs/

echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ~/.certs/qq.crt

certutil -A -n "GeoTrust SSL CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt

certutil -A -n "GeoTrust Global CA" -t "C,," -d ~/.certs -i ~/.certs/qq.crt

certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt  

 ###执行这个命令后提示:Notice: Trust flag u is set automatically if the private key is present. (为了信任证书)

certutil -L -d /root/.certs

5、配置/etc/mail.rc

1

2

3

4

5

6

7

set [email protected] #之前设置好的邮箱地址

set smtp=smtps://smtp.qq.com:465 #邮件服务器

set [email protected] #之前设置好的邮箱地址

set smtp-auth-password=xxxx #授权码

set smtp-auth=login #默认login即可

set ssl-verify=ignore #ssl认证方式

set nss-config-dir=/root/.certs #证书所在目录

6、发送邮件测试

1

echo "邮件正文" | mail -s "邮件主题" [email protected]

注意:

centos6上没有certutil命令,从虚拟机上执行完后生成秘钥 把秘钥拷到centos6上即可

带附件发送:

mail -s "邮件主题" -a 附件路径 收件人邮箱 < 邮件正文路径

****如果在执行邮件发送命令后报(证书不被信任)

Error in certificate: Peer's certificate issuer is not recognized.

则优先执行certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ~/.certs/./ -i qq.crt  

 ###执行这个命令后提示:Notice: Trust flag u is set automatically if the private key is present. (为了信任证书)

如果执行以上命令还是失败,则在邮件发送语句后添加2>/dev/null(忽略错误)

eg:mail -s "job" -a /home/amp/jobs/data/$DataName-$time.xls ****@qq.com   2>/dev/null

mail -s "测试" -a /home/factory/factory-sqlsh/dingshi/backup/测试.xls [email protected] < /home/factory/factory-sqlsh/dingshi/111.txt

-------------------------------------------------------------------------------------------------------------------------

使用linux自带的定时任务crontab,添加到定时即可,这里不再多说。

 

 

你可能感兴趣的:(运维,自动化,运维,邮件,自动化)