Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从PostgreSQL触发器发送电子邮件?_Sql_Database_Postgresql_Pgadmin - Fatal编程技术网

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

如何从PostgreSQL触发器发送电子邮件?,sql,database,postgresql,pgadmin,Sql,Database,Postgresql,Pgadmin,我在更新表数据集时使用pgsql设置触发器(将状态更改为Finished) 它将使用数据集电子邮件值自动向电子邮件帐户发送电子邮件,并将此电子邮件保存在服务器中 但我不知道如何编写触发器函数来发送电子邮件,以及如何在服务器中发送电子邮件。 先谢谢你 Pg版本为9.1,CentOS版本为5.8 CREATE OR REPLACE FUNCTION sss() RETURNS trigger AS $BODY$begin if(NEW.publisher== 'aaaa') then //send

我在更新表数据集时使用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;

您可以使用plperlu发送邮件


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

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

如果你按照上面的说明去做,那就归结为

pgmail('Send From ','Send To ','Subject goes here','Message body here.')
看,还有

直接从数据库发送电子邮件可能不是一个好主意。如果DNS解析很慢,所有内容都挂起30秒,然后超时,该怎么办?如果您的邮件服务器不稳定,需要5分钟才能接收邮件,该怎么办?您将在触发器中挂起数据库会话,直到您处于
max\u connections
时,突然您除了等待或开始手动取消事务外,什么也做不了

我建议您使用一个保持永久运行并连接到DB(但不在事务中)的帮助器脚本来触发触发器

触发器所要做的就是在队列表中插入一行,然后发送一个通知。您的脚本将获得
NOTIFY
消息,因为它已注册到
LISTEN
,检查队列表,并执行其余操作

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

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

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

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

  • 使用本地MTA(这将为多个应用提供集中的SMTP配置)
  • 让本地MTA中继到真正的MTA(这基本上为您提供了异步支持)
  • 如果是windows,请使用blat SMTP命令行客户端。确保blat的路径位于路径中
  • 您可能应该使用apachecamel或pgAgent来实现这一点,而不是直接在触发器中实现
  • 如果postgres是超级用户,这将在Windows上起作用。触发器函数应该是安全定义器。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毫秒

    我同意@Craig Ringer的观点。您可以在100行代码下用Python编写一些代码。我建议使用以下Python库:psycopg2、smtplib。根据您希望获得更改通知的频率,您可以运行cronjob(取决于您的工作环境)。通过这种方式,您可以将对数据库的多个更改聚合到一封电子邮件中,而不是在每次发生更改时发送通知。

    我可以使用其他方式而不安装pgmail吗?您可以使用此方式(安装程序)或使用下面帖子中的plperlu程序。谢谢,但语言是plpgsql,当我输入use Mail::Sendmail时;它显示语法error@JesseSiu你必须
    创建语言plperlu并使用
    语言“plperlu”。当我键入createlang plperlu mydb时。它说无法打开扩展控制文件。在扩展名文件夹中,它不包含plperlu.control文件?我怎么能do@JesseSiu这完全取决于您如何安装PostgreSQL。两天前我要求您添加Pg版本时,您仍然没有更新您的答案。也许你应该这样做,并解释一下你使用的是什么操作系统,以及你是如何安装Pg的?一旦这些信息可用,可能有人会帮助您。对不起,我忘记添加信息了。Pg版本是9.1,CentOS版本是5.8。在询问有关Pg的问题时,解释一下您的设置,特别是您的Pg版本,确实很有帮助。不同的版本有不同的功能,因此版本可能会影响答案。@JesseSiu您似乎是从一小时前发布在不同答案上的另一个版本复制并粘贴了此评论。这个答案与PL/Perl无关,我不建议您使用它,因为我的答案中解释了原因。使用数据库外运行的脚本发送邮件。@JesseSiu如果您不理解上述建议,或者它对您无效,请随时解释或要求澄清,我很乐意提供帮助。我只是觉得你采取了错误的方法。实际上,我专门编写了pg消息队列,因此它将是这个问题的答案。这正是我所寻找的解决方案,可惜“编程”仅在PostgreSQL 9.3之后才可用。