目的:本项功能的目的是为了将数据库中某项内容监控的结果邮件出来提示给相关人员。
实现方式:将数据库监控结果存储到监控记录表当中,使用PL/python函数将记录表中的数据传入附件并将附件使用MUTT邮件发送给相关人员进行通知。
环境准备:
Linux: Release: 5.8 版本
Postgreqsl:9.5.1 版本
Python版本:2.7.12
Mutt 版本号:1.4.2.2i
一、安装postgresql
安装过程(略)
下载地址:https://www.postgresql.org/download/
注意:在编译./configure的时候记得加上 --with-python 这样在拓展python的时候 直接拓展就OK了
二、安装python 2.7.12
在官网上下载了python2.7.12
地址:https://www.python.org/getit/
将安装包上传到服务器中并解压 解压后会生成目录Python-2.7.12
进入目录编译安装
#./comfigure --prefix=/opt/python2.7.12 --enable-shared #注意这个参数一定要带
#make
#make install
---完成。
三、安装MUTT邮件发送工具
这里解释下为什么选择MUTT而不是linux的mail或者xmail?---因为在刚开始使用xmail向foxmail发送附件的时候 foxmail中接收不到附件 并且正文内容乱码,所以选用了更为简便的mutt 来进行发送邮件。
下载地址:http://www.mutt.org/download.html
安装mutt
#yum -y install mutt
四、在postgresql端用创建pl/python拓展
#su - postgres
#psql
#create extension plpythonu;
5.1首先是将监控记录表中信息通过copy命令传入到文件中 send_mail_info 表为监控记录表,自行创建即可。
CREATE OR REPLACE FUNCTION public.fc_copy_date(v text)
RETURNS text AS
$BODY$
try:
plpy.execute("copy send_mail_info to '/app/pgdata/pg951date/view_test.xls'")
plpy.execute("select fc_file_icon('%s')" % v)
except plpy.SPIError:
return "something went wrong"
else:
return "ok"
LANGUAGE plpythonu VOLATILE
COST 100;
ALTER FUNCTION public.fc_copy_date(text)
OWNER TO postgres;
5.2其中fc_file_icon函数是用来转换文件编码的,因为从数据库中copy出来的文件是utf-8的邮件出来后是乱码,所以转换成了gb2312的格式。
CREATE OR REPLACE FUNCTION public.fc_file_icon(v text)
import commands
strs = args[0] #接收函数传入命令
cmds ='iconv -f utf-8 -t gb2312 view_test.xls > %s' % v
(status,output) = commands.getstatusoutput(cmds)
return output
ALTER FUNCTION public.fc_file_icon(text)
OWNER TO postgres;
5.3这是由postgresql调用操作系统命令mutt的一个函数,
CREATE OR REPLACE FUNCTION public.fc_send_mail(text)
emadr ='xxxxx@xxx.com '
cmd1 = 'echo "正文:xxxxx" | mutt -a ' + strs -----strs为传入的文件名
emailx = ' -s "主题:xxx" '+ emadr
cmds = cmd1 + emailx
ALTER FUNCTION public.fc_send_mail(text)
-- Function: public.fc_sendmail_main(text)
-- DROP FUNCTION public.fc_sendmail_main(text);
CREATE OR REPLACE FUNCTION public.fc_sendmail_main(v text)
RETURNS text AS
$BODY$
try:
plpy.execute("select fc_copy_date('%s')" % v)
plpy.execute("select fc_send_mail('%s')" % v)
except plpy.SPIError:
return "something went wrong"
else:
return "OK"
$BODY$
LANGUAGE plpythonu VOLATILE
COST 100;
ALTER FUNCTION public.fc_sendmail_main(text)
OWNER TO postgres;
5.5当需要发邮件的时候只需要执行这条命令即可
Select fc_sendmail_main(‘xxxx.sss’) ; ----- xxxx.sss代表 文件名.文件类型
六、如若需要定时发送的话 可以使用postgresql的定时任务工具:pgAgent