我使用pgsql设置触发器,当更新表数据集时(将状态更改为完成) 它将使用数据集电子邮件值自动向电子邮件帐户发送电子邮件,并将该电子邮件保存在服务器中
但我不知道如何编写触发函数来发送电子邮件,并在服务器中发送电子邮件。 先谢谢你了
Pg版本是9.1,CentOS 5.8
CREATE OR REPLACE FUNCTION sss()
RETURNS trigger AS
$BODY$begin
if(NEW.publisher== 'aaaa')
then
//send email and save to server 192.168.171.64
end if;
return NEW;
end
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION sss()
OWNER TO postgres;
GRANT EXECUTE ON FUNCTION sss() TO postgres;
请参阅 一如既往的优秀 depesz 文章,以及 pg-message-queue。
直接从数据库发送电子邮件可能不是一个好主意。如果 DNS 解析速度很慢并且一切都挂起 30 秒然后超时怎么办?如果您的邮件服务器不稳定并且需要 5 分钟 才能接受邮件怎么办?您将在触发器中挂起数据库会话,直到您处于
max_connections
状态,突然间您除了等待或开始手动取消事务之外无法执行任何操作。
NOTIFY
一个 LISTEN
ing 帮助程序脚本,该脚本保持永久运行并连接到数据库(但不在事务中)。
您的触发器所要做的就是将一行放入队列表中并发送一个
INSERT
。您的脚本会收到 NOTIFY
消息,因为它已注册到 NOTIFY
,检查队列表,然后执行其余操作。您可以用任何方便的语言编写帮助程序;我通常使用 Python 与
LISTEN
。
该脚本可以根据在数据库中找到的信息发送电子邮件。您不必在 PL/PgSQL 中完成所有丑陋的文本格式化,您可以将内容替换为更强大的脚本语言的模板,并且只需在
psycopg2
出现时从数据库中获取变量数据即可。
通过这种方法,您的助手可以发送每条消息,然后才从队列表中删除该信息。这样,如果您的邮件系统出现暂时性问题导致发送失败,您不会丢失信息,并且可以继续尝试发送,直到成功为止。
如果您确实必须在数据库中执行此操作,请参阅
PgMailNOTIFY
~ 60 毫秒
如果您按照
brandolabs.com 上的说明进行操作,则归结为
...
copy
( select 'my email body' )
to program
'blat -to [email protected] -from [email protected] -subject "My Subject" -server localhost:25'
with (
format text
);
...