UTL_SMTP 模块

UTL_SMTP 模块允许通过简单电子邮件传输协议(SMTP)发送电子邮件。

UTL_SMTP 模块包括下列例程。

表 1. 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 数据组成的电子邮件消息部分。
下表列示模块中可用的公用变量。
表 2. UTL_SMTP 模块中可用的内置类型
公用变量 数据类型 描述
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')@