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

问题描述 投票:0回答:7

我使用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;
sql database postgresql pgadmin
7个回答
58
投票

请参阅 一如既往的优秀 depesz 文章,以及 pg-message-queue

直接从数据库发送电子邮件可能不是一个好主意。如果 DNS 解析速度很慢并且一切都挂起 30 秒然后超时怎么办?如果您的邮件服务器不稳定并且需要 5 分钟 才能接受邮件怎么办?您将在触发器中挂起数据库会话,直到您处于

max_connections
状态,突然间您除了等待或开始手动取消事务之外无法执行任何操作。

我建议您使用触发器

NOTIFY
一个
LISTEN
ing
帮助程序脚本,该脚本保持永久运行并连接到数据库(但不在事务中)。

您的触发器所要做的就是将一行放入队列表中并发送一个

INSERT
。您的脚本会收到
NOTIFY
消息,因为它已注册到
NOTIFY
,检查队列表,然后执行其余操作。

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

LISTEN


该脚本可以根据在数据库中找到的信息发送电子邮件。您不必在 PL/PgSQL 中完成所有丑陋的文本格式化,您可以将内容替换为更强大的脚本语言的模板,并且只需在

psycopg2

出现时从数据库中获取变量数据即可。


通过这种方法,您的助手可以发送每条消息,然后才从队列表中删除该信息。这样,如果您的邮件系统出现暂时性问题导致发送失败,您不会丢失信息,并且可以继续尝试发送,直到成功为止。

如果您确实必须在数据库中执行此操作,请参阅

PgMail


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

NOTIFY

~ 60 毫秒 


1
投票

链接显示了如何在触发器上使用它的示例。


1
投票

如果您按照

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 ); ...



0
投票


0
投票
graphile-worker 代码库

从 Postgres 到 Node 进行通信。然后您可以轻松地使用 Node 中的标准电子邮件逻辑来发送电子邮件。


0
投票

https://dincosman.com/2024/10/06/send-mail-postgresql/

© www.soinside.com 2019 - 2024. All rights reserved.