UTL_SMTP 模块
UTL_SMTP 模块允许通过简单电子邮件传输协议(SMTP)发送电子邮件。
UTL_SMTP 模块包括下列例程。
| 例程名称 | 描述 |
|---|---|
| CLOSE_DATA 过程 | 结束电子邮件消息。 |
| COMMAND 过程 | 执行 SMTP 命令。 |
| COMMAND_REPLIES 过程 | 在应该出现多行应答的位置执行 SMTP 命令。 |
| DATA 过程 | 指定电子邮件消息正文。 |
| EHLO 过程 | 与 SMTP 服务器进行初始信息交换并返回扩展信息。 |
| HELO 过程 | 与 SMTP 服务器进行初始信息交换。 |
| HELP 过程 | 发送 HELP 命令。 |
| MAIL 过程 | 启动邮件事务。 |
| NOOP 过程 | 发送 null 命令。 |
| OPEN_CONNECTION 函数 | 打开连接。 |
| OPEN_CONNECTION 过程 | 打开连接。 |
| OPEN_DATA 过程 | 发送 DATA 命令。 |
| QUIT 过程 | 终止 SMTP 会话并断开连接。 |
| RCPT 过程 | 指定电子邮件消息的接收方。 |
| RSET 过程 | 终止当前邮件事务。 |
| VRFY 过程 | 验证电子邮件地址。 |
| WRITE_DATA 过程 | 写入电子邮件消息的部分。 |
| WRITE_RAW_DATA 过程 | 写入由 RAW 数据组成的电子邮件消息部分。 |
下表列示模块中可用的公用变量。
| 公用变量 | 数据类型 | 描述 |
|---|---|---|
| connection | RECORD | SMTP 连接的描述。 |
| reply | RECORD | SMTP 应答行。 |
CONNECTION
记录类型提供 SMTP 连接的描述。
ALTER MODULE SYSIBMADM.UTL_SMTP PUBLISH TYPE connection AS ROW
(
/* name or IP address of the remote host running SMTP server */
host VARCHAR(255),
/* SMTP server port number */
port INTEGER,
/* transfer timeout in seconds */
tx_timeout INTEGER,
);REPLY
记录类型提供 SMTP 应答行的描述。REPLIES 是一组 SMTP 应答行。
ALTER MODULE SYSIBMADM.UTL_SMTP PUBLISH TYPE reply AS ROW
(
/* 3 digit reply code received from the SMTP server */
code INTEGER,
/* the text of the message received from the SMTP server */
text VARCHAR(508)
);示例
示例 1:以下过程使用 UTL_SMTP
模块构造并发送文本电子邮件消息。
CREATE OR REPLACE PROCEDURE send_mail(
IN p_sender VARCHAR(4096),
IN p_recipient VARCHAR(4096),
IN p_subj VARCHAR(4096),
IN p_msg VARCHAR(4096),
IN p_mailhost VARCHAR(4096))
SPECIFIC send_mail
LANGUAGE SQL
BEGIN
DECLARE v_conn UTL_SMTP.CONNECTION;
DECLARE v_crlf VARCHAR(2);
DECLARE v_port INTEGER CONSTANT 25;
SET v_crlf = CHR(13) || CHR(10);
SET v_conn = UTL_SMTP.OPEN_CONNECTION(p_mailhost, v_port, 10);
CALL UTL_SMTP.HELO(v_conn, p_mailhost);
CALL UTL_SMTP.MAIL(v_conn, p_sender);
CALL UTL_SMTP.RCPT(v_conn, p_recipient);
CALL UTL_SMTP.DATA(
v_conn,
'Date: ' || TO_CHAR(SYSDATE, 'Dy, DD Mon YYYY HH24:MI:SS') || v_crlf ||
'From: ' || p_sender || v_crlf ||
'To: ' || p_recipient || v_crlf ||
'Subject: ' || p_subj || v_crlf ||
p_msg);
CALL UTL_SMTP.QUIT(v_conn);
END@
CALL send_mail('bwayne@mycorp.com','pparker@mycorp.com','Holiday Party',
'Are you planning to attend?','smtp.mycorp.com')@示例 2:以下示例使用
OPEN_DATA、WRITE_DATA 和 CLOSE_DATA 过程而不是 DATA 过程。
CREATE OR REPLACE PROCEDURE send_mail_2(
IN p_sender VARCHAR(4096),
IN p_recipient VARCHAR(4096),
IN p_subj VARCHAR(4096),
IN p_msg VARCHAR(4096),
IN p_mailhost VARCHAR(4096)) SPECIFIC send_mail_2
LANGUAGE SQL
BEGIN
DECLARE v_conn UTL_SMTP.CONNECTION;
DECLARE v_crlf VARCHAR(2);
DECLARE v_port INTEGER CONSTANT 25;
SET v_crlf = CHR(13) || CHR(10);
SET v_conn = UTL_SMTP.OPEN_CONNECTION(p_mailhost, v_port, 10);
CALL UTL_SMTP.HELO(v_conn, p_mailhost);
CALL UTL_SMTP.MAIL(v_conn, p_sender);
CALL UTL_SMTP.RCPT(v_conn, p_recipient);
CALL UTL_SMTP.OPEN_DATA(v_conn);
CALL UTL_SMTP.WRITE_DATA(v_conn, 'From: ' || p_sender || v_crlf);
CALL UTL_SMTP.WRITE_DATA(v_conn, 'To: ' || p_recipient || v_crlf);
CALL UTL_SMTP.WRITE_DATA(v_conn, 'Subject: ' || p_subj || v_crlf);
CALL UTL_SMTP.WRITE_DATA(v_conn, v_crlf || p_msg);
CALL UTL_SMTP.CLOSE_DATA(v_conn);
CALL UTL_SMTP.QUIT(v_conn);
END@
CALL send_mail_2('bwayne@mycorp.com','pparker@mycorp.com','Holiday Party',
'Are you planning to attend?','smtp.mycorp.com')@