如何从 IBM iSeries DB2 v7.1 发送电子邮件
How to send an email from IBM iSeries DB2 v7.1
我正在尝试创建一个触发器,它根据数据库事件发送电子邮件,具体来说,当在某个 table 中插入记录时,我想要一封说明该事实的电子邮件发送给系统管理员.
我可以通过 iSeries Navigator 中的 SQL window 成功执行以下操作:
CL:SNDDST TYPE(*LMSG)
TOINTNET(('sysadmin@mycompany.com'))
DSTD('this is the Subject Line')
LONGMSG('This is an Email sent from iSeries box via Navigator')
...并发送了一封电子邮件。这意味着必要的 SMTP 东西已经存在并且可以正常工作。
所以我想做的就是封装这段代码,也许有一些数据更改(例如 "A record has been added to the XYZ table on whatever-the-sysdate-is")。 Navigator 有一些诱人的例子,调用 CL 来做一些普通的事情,但不知道如何让它在触发器中工作。我知道如何编写执行 "database stuff" 的触发器,但不知道这个 CL 东西。这是 iSeries DB2,所以我无权访问 UTL_MAIL.
我对 CL、DDS 或其他 iSeries 内部结构几乎一无所知...我宁愿不必创建外部 Java 程序,但作为最后的手段会这样做...但是即便如此,我也很难找到直接的例子。
提前致谢。
首先,请注意 SNDDST 不是 IBM i 互联网邮件的最佳选择。基本上,SNDDST 是 SNADS 网络时代的遗物,IBM 侵入该网络以支持 SMTP 电子邮件。有免费的替代品,或者如果您对 7.1 的修复相当最新,那么您应该可以使用发送 SMTP 电子邮件 (SNDSMTPEMM) 命令。
iNav 的 运行 SQL 脚本 window 确实支持使用 CL: 前缀的 CL 命令。但这与让查询引擎本身理解 CL 不同。
CL: 前缀在 SQL 触发器中不起作用。
但是,您可以use the QCMDEXC stored procedure调用 CL 命令。但我不一定认为这是最好的选择。
IBM i 支持使用 "external" 存储过程和触发器。理论上,您可以使用直接调用 SNDSMTPEMM 命令的 CL 程序。但是鉴于您希望包含来自 table 的数据,我不会推荐这种方法,因为您会被绑定到 table 结构。
相反,创建您自己的调用 SNDSMTPEMM 的 UTLMAILSND CL 程序。然后将 UTLMAILSND 程序定义为 external stored procedure(你甚至可以给它一个更长的 SQL 名称 UTIL_MAIL_SEND)。
现在您可以从 SQL 触发器调用 UTIL_MAIL_SEND() 过程。
您需要尝试 SNDSMTPEMM 命令。与SNDDST TYPE(*LMSG)
相比,它就像切片面包它也支持HTML,这很有趣。
是的,我使用了 SNDSMPTEMM(暂时跳过 html...)。
然而,一个重要的注意事项是:在从 SQL 调用时,在 CL 程序中使用此命令不起作用。我不得不将其更改为 CLLE 程序。
所以最终的答案如下:a) 有问题的 table 上的 INSERT 触发器,它调用:b) 在数据库中创建的(外部)PROCEDURE,它又调用:c)已编译的 CLLE 程序对象。很有魅力。
p.s。我在 INSERT 触发器中创建了整个电子邮件正文,并将其传递给 CLLE 程序。这使我可以只用一个 CLLE 程序来报告数据库中任何地方的任何 INSERT/UPDATE/DELETE。
我正在尝试创建一个触发器,它根据数据库事件发送电子邮件,具体来说,当在某个 table 中插入记录时,我想要一封说明该事实的电子邮件发送给系统管理员.
我可以通过 iSeries Navigator 中的 SQL window 成功执行以下操作:
CL:SNDDST TYPE(*LMSG)
TOINTNET(('sysadmin@mycompany.com'))
DSTD('this is the Subject Line')
LONGMSG('This is an Email sent from iSeries box via Navigator')
...并发送了一封电子邮件。这意味着必要的 SMTP 东西已经存在并且可以正常工作。
所以我想做的就是封装这段代码,也许有一些数据更改(例如 "A record has been added to the XYZ table on whatever-the-sysdate-is")。 Navigator 有一些诱人的例子,调用 CL 来做一些普通的事情,但不知道如何让它在触发器中工作。我知道如何编写执行 "database stuff" 的触发器,但不知道这个 CL 东西。这是 iSeries DB2,所以我无权访问 UTL_MAIL.
我对 CL、DDS 或其他 iSeries 内部结构几乎一无所知...我宁愿不必创建外部 Java 程序,但作为最后的手段会这样做...但是即便如此,我也很难找到直接的例子。
提前致谢。
首先,请注意 SNDDST 不是 IBM i 互联网邮件的最佳选择。基本上,SNDDST 是 SNADS 网络时代的遗物,IBM 侵入该网络以支持 SMTP 电子邮件。有免费的替代品,或者如果您对 7.1 的修复相当最新,那么您应该可以使用发送 SMTP 电子邮件 (SNDSMTPEMM) 命令。
iNav 的 运行 SQL 脚本 window 确实支持使用 CL: 前缀的 CL 命令。但这与让查询引擎本身理解 CL 不同。
CL: 前缀在 SQL 触发器中不起作用。
但是,您可以use the QCMDEXC stored procedure调用 CL 命令。但我不一定认为这是最好的选择。
IBM i 支持使用 "external" 存储过程和触发器。理论上,您可以使用直接调用 SNDSMTPEMM 命令的 CL 程序。但是鉴于您希望包含来自 table 的数据,我不会推荐这种方法,因为您会被绑定到 table 结构。
相反,创建您自己的调用 SNDSMTPEMM 的 UTLMAILSND CL 程序。然后将 UTLMAILSND 程序定义为 external stored procedure(你甚至可以给它一个更长的 SQL 名称 UTIL_MAIL_SEND)。
现在您可以从 SQL 触发器调用 UTIL_MAIL_SEND() 过程。
您需要尝试 SNDSMTPEMM 命令。与SNDDST TYPE(*LMSG)
相比,它就像切片面包它也支持HTML,这很有趣。
是的,我使用了 SNDSMPTEMM(暂时跳过 html...)。
然而,一个重要的注意事项是:在从 SQL 调用时,在 CL 程序中使用此命令不起作用。我不得不将其更改为 CLLE 程序。
所以最终的答案如下:a) 有问题的 table 上的 INSERT 触发器,它调用:b) 在数据库中创建的(外部)PROCEDURE,它又调用:c)已编译的 CLLE 程序对象。很有魅力。
p.s。我在 INSERT 触发器中创建了整个电子邮件正文,并将其传递给 CLLE 程序。这使我可以只用一个 CLLE 程序来报告数据库中任何地方的任何 INSERT/UPDATE/DELETE。