19

我使用 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;
4

6 回答 6

49

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

直接从数据库发送电子邮件可能不是一个好主意。如果 DNS 解析很慢并且一切都挂起 30 秒然后超时怎么办?如果您的邮件服务器出现问题并需要 5分钟才能接收邮件怎么办?您将在触发器中挂起数据库会话,直到您max_connections突然间您什么也做不了,只能等待或开始手动取消事务。

我建议让您的触发器保持永久运行并连接到数据库(但不在事务中)NOTIFYLISTENing帮助程序脚本。

您的触发器所要做的就是INSERT将一行放入队列表并发送一个NOTIFY. 您的脚本会收到该NOTIFY消息,因为它已为其注册LISTEN,检查队列表,然后完成其余的工作。

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

该脚本可以根据它在数据库中找到的信息发送电子邮件。您不必在 PL/PgSQL 中进行所有丑陋的文本格式化,您可以用更强大的脚本语言将内容替换为模板,并在出现时从数据库NOTIFY中获取可变数据。

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

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

于 2012-08-17T09:51:04.027 回答
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
);

...

~ 60 毫秒

于 2014-08-17T01:42:05.813 回答
1

您可以使用 plperlu 发送邮件。

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

于 2012-08-17T08:55:06.813 回答
1

您可以使用 pgMail(如果您被允许安装它):

如果您按照brandolabs.com上的说明进行操作,可以归结为

pgmail('Send From ','Send To ','Subject goes here','Message body here.')
于 2012-08-17T09:00:03.927 回答
0

我同意@Craig Ringer。你可以用 Python 编写不到 100 行代码的东西。我建议使用以下 Python 库:psycopg2、smtplib。根据您希望收到更改通知的频率,您可以运行 cronjob(取决于您的工作环境)。这样,您可以将数据库的多项更改汇总到一封电子邮件中,而不是每次发生更改时都发送通知。

于 2016-02-05T12:07:45.313 回答
0

如果你使用 TypeScript/Node,那么使用久经考验的 graphile-worker 代码库从 Postgres 到 Node 进行通信。然后,您可以轻松地使用 Node 中的标准电子邮件逻辑来发送电子邮件。

于 2022-01-04T18:51:45.477 回答