我怎样才能从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 。

  1. 使用本地MTA(这给你多个应用程序的集中SMTPconfiguration)
  2. 有本地的MTA中继到你的真正的MTA(这本质上给你的asynchronous支持)
  3. 如果是Windows,请使用blat SMTP命令行客户端。 确保path是在PATH中
  4. 你应该使用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(取决于您的工作环境)。 这样,您可以将对数据库的多个更改聚合到一个电子邮件中,而不是每次发生更改时都发送通知。