如何从PostgreSQL触发器发送电子邮件?

Ant*_*GMO 13 sql database postgresql pgadmin

我使用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;
Run Code Online (Sandbox Code Playgroud)

Cra*_*ger 37

请参阅优秀的depesz文章pg-message-queue.

直接从数据库发送电子邮件可能不是一个好主意.如果DNS解析速度很慢并且所有内容都会挂起30秒然后超时怎么办?如果您的邮件服务器出现抖动并需要5 分钟才能接受邮件,该怎么办?您将在触发器中挂起数据库会话,直到您处于此状态,max_connections并且突然您无法执行任何操作,只需等待或开始手动取消事务.

我会建议是具有您触发NOTIFY一个LISTEN荷兰国际集团是永久保持运行并连接到数据库(而不是在一个交易)辅助脚本.

您的所有触发器都要做的是INSERT进入队列表并发送一行NOTIFY.您的脚本获取NOTIFY消息,因为它已为其注册LISTEN,检查队列表,并完成其余的操作.

你可以用任何方便的语言编写帮助程序; 我通常使用Python psycopg2.

该脚本可以根据在数据库中找到的信息发送电子邮件.您不必在PL/PgSQL中执行所有丑陋的文本格式化,您可以使用更强大的脚本语言将事物替换为模板,而只是在进入时从数据库中获取变量数据NOTIFY.

使用此方法,您的帮助程序可以发送每条消息,然后从队列表中删除信息.这样,如果您的邮件系统出现导致发送失败的短暂问题,您就不会丢失信息,并且可以继续尝试发送,直到您成功为止.

如果您真的必须在数据库中执行此操作,请参阅PgMail.


Nei*_*gan 5

  1. 使用本地 MTA(这为您提供了多个应用程序的集中 SMTP 配置)
  2. 将本地 MTA 中继到您真正的 MTA(本质上,这为您提供了异步支持)
  3. 如果是 Windows,请使用 blat SMTP 命令行客户端。确保 blat 的路径在 PATH 中
  4. 您可能应该使用 Apache Camel 或 pgAgent 执行此操作,而不是直接在触发器中执行此操作

如果 postgres 超级用户,这将在 Windows 上工作。触发函数应该是 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
);

...
Run Code Online (Sandbox Code Playgroud)

~ 60 毫秒