当前位置: 首页 > 知识库问答 >
问题:

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

贺聪
2023-03-14

我使用pgsql设置触发器,当更新表dataset(将状态更改为Finished)时,它将使用dataset电子邮件值自动向电子邮件帐户发送电子邮件,并将此电子邮件保存在服务器中

但是我不知道如何在触发函数中写发送邮件,以及在服务器中发送邮件。先谢谢你了

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;

共有3个答案

鲜于勇
2023-03-14

您可以使用plperlu发送邮件。

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

云景焕
2023-03-14
    < li >使用本地MTA(这将为多个应用提供集中的SMTP配置) < li >让本地MTA中继到您的真实MTA(这实质上为您提供了异步支持) < li >如果是windows,请使用blat SMTP命令行客户端。确保blat的路径在路径中 < li >您可能应该使用Apache Camel或pgAgent来执行此操作,而不是直接在触发器中执行

这将在Windows上工作,如果postgres超级用户。触发函数应该是安全定义器。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毫秒

周龙光
2023-03-14

参见一如既往的优秀的depesz文章和pg-message-queue。

直接从数据库发送电子邮件可能不是一个好主意。如果DNS解析很慢,所有内容都挂起30秒,然后超时怎么办?如果您的邮件服务器不稳定,需要5分钟才能接收邮件,该怎么办?您将在触发器中挂起数据库会话,直到达到<code>max_connections

我建议让触发器 NOTIFY 一个侦听帮助程序脚本,该脚本将永久运行并连接到数据库(但不在事务中)。

您的触发器所要做的就是INSERT一行到队列表中并发送NOTIFY。您的脚本会收到NOTIFY消息,因为它已注册到LISTEN,检查队列表,然后执行其余操作。

您可以用任何方便的语言编写帮助程序;我通常将Python与<code>psycopg2</code>一起使用。

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

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

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

 类似资料:
  • 问题内容: 考虑一个表作为,我想补充一个在此表作为 有什么简单的方法可以在有评论的地方写东西吗?要将电子邮件发送到从table检索到的所有电子邮件ID中。 我在XAMPP(phpmyadmin)中使用MySQL。 问题答案: 我反对这种解决方案。将发送电子邮件的负担放在数据库服务器中可能会非常糟糕。 在我看来,您应该做的是创建一个表,将要发送的电子邮件排队,并有一个过程检查是否有要发送的电子邮件,

  • 问题内容: 我希望我的网站能够发送电子邮件而不刷新页面。所以我想使用Javascript。 这是我要调用的函数的方式,但是我不确定要在javascript函数中放入什么。通过研究,我发现了一个使用mailto方法的示例,但是我的理解是实际上并没有直接从站点发送邮件。 所以我的问题是,我在哪里可以找到要放在JavaScript函数中的内容,以便直接从网站发送电子邮件。 问题答案: 您不能直接使用ja

  • 问题内容: 当表格中插入新行时,我正在尝试向多个收件人发送电子邮件。收件人列表各不相同。我希望能够使用select语句设置此列表。我还安装了Navicat,它使我可以发送电子邮件通知,但仅发送给预定的人员。 谢谢。 问题答案: 我会非常担心将发送电子邮件的负担放在我的数据库服务器上(虽然可能很小)。我可能会建议以下替代方法之一: 让应用程序逻辑检测到发送和发送电子邮件的需要。 有一个MySQL触发

  • 问题内容: 我在寻找有关如何 从localhost WAMP发送电子邮件的 适当信息。以及如何获得从特定的授权电子邮件地址发送电子邮件的授权以发送任何其他电子邮件地址。 如何配置这整个步骤向我解释了细节,我已经在这里访问了一些Stack Overflow的答案以及博客文章,但是所有内容都很混乱且过时,因此可能无法正常工作。所以我需要Stack Overflow用户帮助。谢谢。 问题答案: 从配置工

  • 问题内容: 我正在尝试从PHP发送简单的HTML电子邮件。下面的代码仅导致GMail中的空白电子邮件。它还有一个名为“ noname”的空附件,这根本不是我想要的;尽管那可能只是它无法正常工作的症状。 我使用的代码是: 问题答案: 原来关键是编码类型。代替: 我需要使用: 它可能取决于您如何在自己的文本编辑器中保存PHP文件的细节。我没有研究它,但是PHP中的 iconv 函数可能也给我带来了一些

  • 问题内容: 我已经使用JMS在Web应用程序中成功发送了电子邮件,但是结果仅以纯文本显示。我希望内容能够显示html。我该怎么做?这大致就是我所拥有的: 问题答案: 根据Javadoc,在需要时,这些设置将默认的mime类型设置为。而是使用代替。