在postgres中使用sp_send_dbmail替代方法?发送Postgres电子邮件报告的简单方法?

时间:2018-08-31 11:36:23

标签: postgresql email

SQL Server在sp_send_dbmail(quick guide here)中具有一项很酷的功能,可让您通过电子邮件发送报告。 Postgres中是否存在类似的东西?我的postgres托管在Heroku中,因此我可以共享一个数据夹,但是我想知道是否有一种简单的方法来安排电子邮件发送报告。

2 个答案:

答案 0 :(得分:1)

您可以使用 pgMail 从PostgreSQL内部发送邮件。

先决条件:

在使用pgMail之前,必须安装TCL / u程序语言。 TCL / u是数据库可以在其存储功能中使用的TCL的不受限制的版本。在为所有数据库安装不受限制的TCL过程语言之前,请考虑到在向数据库中添加TCL / u语言时必须准备足够的安全预防措施!我不会为配置错误的服务器负责,这些服务器允许危险的用户做坏事!

要安装TCL / u程序语言,您必须已编译(或使用了二进制软件包)并安装了PostgreSQL的TCL扩展。确定完成此操作后,只需以数据库管理员的身份在unix shell提示符下键入以下内容即可。

# createlang pltclu [YOUR DATABASE NAME]

[YOUR DATABASE NAME]处,放置要向其添加存储过程的数据库的名称。如果要将其添加到所有新数据库中,请使用“ template1”作为数据库名称。

在向数据库添加新过程之前,先执行以下操作:

将文本<ENTER YOUR MAILSERVER HERE>替换为邮件服务器的完全限定域名。即mail.server.com。

将文本<ENTER YOUR DATABASESERVER HERE>替换为数据库服务器的完全限定域名。即db.server.com。

完成上述操作后,就可以开始了。

在此步骤之后,使用psql界面添加pgMail函数。只需复制pgmail.sql文件的内容并将其粘贴到您的窗口中即可。您也可以直接在命令行中输入以下内容来加载它:

# psql -e [YOUR DATABASE NAME] < pgMail.sql

一旦安装了存储的功能,只需按以下步骤调用即可。

select pgmail('Send From ','Send To ','Subject goes here','Plaintext message body here.');

select pgmail('Send From ','Send To ','Subject goes here','','HTML message body here.');

或者现在,多部分MIME!

select pgmail('Send From ','Send To ', 'Subject goes here','Plaintext message body here.', 'HTML message body here.');

在“发送自”和“发送至”字段中,您既可以仅包含电子邮件,也可以包含以纯文本名称包含在<>中的电子邮件。

测试安装

我提供了一个示例供您尝试。您必须首先用您的真实电子邮件地址替换example.execute.sql脚本中的字符串,然后像上面的pltclu一样安装plpgsql语言。您可以通过输入createlang [YOUR DATABASE NAME] plpgsql来做到这一点。

完成后,首先运行example.setup.sql。然后执行example.execute.sql脚本。如果一切正常,您将在邮箱中看到2封电子邮件。要删除此示例,请执行example.cleanup.sql脚本。

SMTP身份验证

pgMail不支持SMTP身份验证。使用它的大多数人要么在数据库服务器上设置本地邮件服务器以进行本地排队,然后将该设置用于所需的任何中继(使用auth)。或者,或者,通常在/ etc / mail / access(或等效文件)文件中制定一条特殊规则,以允许从数据库服务器使用的IP进行中继。显然,后一种选项不适用于GMail。

这背后的部分原因是,对于大型工作,auth在pgMail的事务性方面将是有问题的。理想的解决方案是将EXIM服务器放在数据库服务器上,并使该服务器作为智能中继服务器处理任何类型的身份验证。这是一个有关how to set SMTP server up的详细信息的链接。

文档:http://brandolabs.com/pgmail

答案 1 :(得分:1)

您还可以使用https://github.com/lcalisto/py_pgmail中的py_pgmail

  1. 通过运行py_pgmail.sql创建py_pgmail函数
  2. 创建函数后,您可以简单地从数据库中的任何位置调用该函数,如下所示:

    for file in files:
            fileName = os.path.splitext(file)[0]
            if fileName == 'fileNameA':
                df = pd.read_excel(file)
                list_dates = ['the string of the date i need' for dates in df['Date']]
                # Here what happend is 
                # that for every date it generates a list with dates
                print(list_dates)
                new_df = df.loc[np.repeat(df['Dates'], len(list_dates)]
                writer = pd.ExcelWriter('fileNameA1.xlsx', engine='xlsxwriter')
                new_df.to_excel(writer, 'Sheet 1')
                writer.save()
    except Exception as e:
        print(e)
    
    #Input data:
    Date
    01/12/2018
    02/12/2018
    03/12/2018
    04/12/2018
    
    #Output i want:
    Date
    01/12/2018
    02/12/2018
    03/12/2018
    04/12/2018
    01/12/2018
    02/12/2018
    03/12/2018
    04/12/2018
    

select py_pgmail('sentFromEmail', array['destination emails'], array['cc'], array['bcc'], 'Subject', '<USERNAME>','<PASSWORD>', 'Text message','HTML message', '<MAIL.MYSERVER.COM:PORT>') array['cc']可以是空数组,例如array['bcc']