如何从 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。