我怎样才能从PostgreSQL触发器发送电子邮件?
我使用pgsql来设置一个触发器,当更新表数据集(将状态更改为Finished)时,它将使用数据集的电子邮件值自动发送电子邮件到电子邮件帐户,并将此电子邮件保存在服务器
但是我不知道如何在触发函数中写入发送邮件,并在服务器端发送邮件。 先谢谢你
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文章 ,和消息队列 。
直接从数据库发送电子邮件可能不是一个好主意。 如果DNSparsing速度很慢,一切都会持续30秒,然后超时? 如果你的邮件服务器摇摆不定,需要5 分钟的时间来接收邮件呢? 你会在你的触发器中挂上数据库会话,直到你处于max_connections
,突然之间你不能做任何事情,只能等待或者开始手动取消事务。
我build议的是让你的触发器NOTIFY
一个LISTEN
帮助器脚本,保持永久运行并连接到数据库(但不是在交易中)。
你的触发器所要做的就是将一行插入到一个队列表中并发送一个NOTIFY
。 你的脚本得到了NOTIFY
消息,因为它注册了LISTEN
,检查了队列表,剩下的事情就完成了。
你可以用任何方便的语言编写帮助程序; 我通常使用Python与psycopg2
。
该脚本可以基于它在数据库中find的信息发送电子邮件。 您不必在PL / PgSQL中执行所有难看的文本格式,您可以使用更强大的脚本语言将其replace为模板,而只需在NOTIFY
进入时从数据库获取variables数据。
通过这种方法,您的帮手可以发送每条消息,然后只从队列表中删除信息。 这样,如果您的邮件系统存在短暂的问题,导致发送失败,您还没有丢失信息,并可以继续尝试发送,直到您成功。
如果您确实必须在数据库中执行此操作,请参阅PgMail 。
- 使用本地MTA(这给你多个应用程序的集中SMTPconfiguration)
- 有本地的MTA中继到你的真正的MTA(这本质上给你的asynchronous支持)
- 如果是Windows,请使用blat SMTP命令行客户端。 确保path是在PATH中
- 你应该使用Apache Camel或者pgAgent来做,而不是直接在触发器中
这将在Windows上工作,如果postgres超级用户。 触发function应该是SECURITY DEFINER。 在Linux上与sendmail类似:
... copy ( select 'my email body' ) to program 'blat -to to@example.com -from from@example.com -subject "My Subject" -server localhost:25' with ( format text ); ...
〜60毫秒
您可以使用plperlu发送邮件。
这个链接显示了如何在触发器上使用它的例子。
你有可能使用pgMail(如果你被允许安装):
如果你按照brandolabs.com上的说明,可以归结为
pgmail('Send From ','Send To ','Subject goes here','Message body here.')
我同意@Craig Ringer。 你可以用100行代码在Python中编写一些东西。 我会build议使用以下Python库:psycopg2,smtplib。 根据您希望得到更改通知的频率,您可以运行一个cronjob(取决于您的工作环境)。 这样,您可以将对数据库的多个更改聚合到一个电子邮件中,而不是每次发生更改时都发送通知。