首批通过分布式安全可靠测评,为关键业务系统打造
UTL_SMTP 概述
更新时间:2026-07-15 20:56:58
UTL_SMTP 是用于通过 SMTP(简单邮件传输协议)发送电子邮件的系统包。
UTL_SMTP 依赖于 UTL_TCP 系统包,需要保证 UTL_TCP 系统包有效。
功能适用性
该内容仅适用于 OceanBase 数据库 Oracle 模式。
UTL_SMTP 子程序概览
下表列出了 OceanBase 数据库当前版本所支持的 UTL_SMTP 子程序以及简要描述。
| 子程序 | 描述 |
|---|---|
| OPEN_CONNECTION | 用于打开并返回一个与 SMTP 服务的连接。 |
| CLOSE_CONNECTION | 关闭 SMTP 连接,从而导致 SMTP 操作终止,仅用于在 data session 过程中取消电子邮件。 |
| QUIT | 向服务器发送 QUIT 命令,终止 SMTP 会话,并断开与服务器的连接。 |
| AUTH | 向 SMTP 服务器发送身份验证的命令。 |
| COMMAND | 用于执行通用的 SMTP 命令。 |
| COMMAND_REPLIES | 用于执行通用的 SMTP 命令,接收多个回复行。 |
| HELO | 用于执行 HELO 命令,与 SMTP 服务进行初始握手。 |
| EHLO | 用于执行 EHLO 命令,与 SMTP 服务进行初始握手。 |
用于执行 MAIL 命令,与 SMTP 服务启动邮件事务,声明发件人邮箱。 |
|
| RCPT | 用于执行 RCPT 命令,指定电子邮件收件人。 |
| OPEN_DATA | 用于发送 DATA 命令,向服务器说明开始发送邮件内容,后续通过 write_data 和 write_raw_data 编写邮件内容。 |
| WRITE_DATA | 用于发送文本邮件内容,可以多次调用将数据追加到电子邮件中。 |
| WRITE_RAW_DATA | 用于发送 raw 数据邮件内容,可以多次调用将数据追加到电子邮件中。 |
| CLOSE_DATA | 用于发送一个 <CR><LF>.<CR><LF> 标识邮件文本发送完成。 |
| DATA | 用于指定电子邮件正文。 |
| VRFY | 发送 VRFY 命令,用于验证目标电子邮件地址的有效性。 |
| HELP | 发送 HELP 命令,获取帮助信息。 |
| NOOP | 发送 NOOP 命令,用于验证目标电子邮件地址的有效性。 |
| RSET | 发送 RSET 命令,用于终止当前电子邮件事务。 |
使用示例
DECLARE
-- 定义邮件服务器信息
l_mailhost VARCHAR2(100) := 'smtp.example.com'; -- SMTP服务器地址
l_mail_conn UTL_SMTP.connection; -- 连接对象
-- 邮件内容
l_from VARCHAR2(100) := 'sender@example.com'; -- 发件人邮箱
l_to VARCHAR2(100) := 'receiver@example.com'; -- 收件人邮箱
l_subject VARCHAR2(100) := '测试邮件'; -- 邮件主题
l_message VARCHAR2(4000) := '这是一封来自 OceanBase 数据库的测试邮件。'; -- 邮件正文
BEGIN
-- 开始连接到SMTP服务器
l_mail_conn := UTL_SMTP.open_connection(l_mailhost, 25); -- 25是SMTP服务的标准端口
-- 向服务器发送HELO命令
UTL_SMTP.helo(l_mail_conn, l_mailhost);
-- 设置邮件的发件人
UTL_SMTP.mail(l_mail_conn, l_from);
-- 设置邮件的收件人
UTL_SMTP.rcpt(l_mail_conn, l_to);
-- 开始数据传输
UTL_SMTP.open_data(l_mail_conn);
-- 添加邮件头部信息
UTL_SMTP.write_data(l_mail_conn, 'From: ' || l_from || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'To: ' || l_to || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Subject: ' || l_subject || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf); -- 空行分隔头和体
-- 写入邮件正文
UTL_SMTP.write_data(l_mail_conn, l_message || UTL_TCP.crlf);
-- 结束数据传输
UTL_SMTP.close_data(l_mail_conn);
-- 关闭连接
UTL_SMTP.quit(l_mail_conn);
DBMS_OUTPUT.PUT_LINE('邮件发送成功!');
EXCEPTION
WHEN OTHERS THEN
-- 如果发生错误,尝试关闭连接(如果已打开)
IF UTL_SMTP.is_open(l_mail_conn) THEN
UTL_SMTP.quit(l_mail_conn);
END IF;
-- 显示异常信息
RAISE;
END;
/