UTL_SMTP
功能描述
该内置包提供了发送邮件的功能。
注意事项
使用此功能发送邮件,需提前创建plpython3u插件。步骤参考python3环境配置。
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
子程序
函数 | 描述 |
---|---|
OPNE_CONNECTION | 与SMTP服务器建立连接。 |
AUTH | 向SMTP服务器发送AUTH命令进行身份验证。 |
HELO | 使用helo命令与SMTP服务器进行初始化握手。 |
设置与SMTP服务器发送的邮箱地址。 | |
RCPT | 指定接收邮箱地址。 |
OPNE_DATA | 发送DATA命令,后面调用write_data写入要发送的文本信息。 |
WRITE_DATA | 发送邮件文本内容,重复调用可以将数据附加到内容中。 |
CLOSE_DATA | 结束发送电子邮件。 |
QUIT | 断开与SMTP服务器的连接。 |
使用流程
1、安装python3。
此功能需使用python3(python3.8)的环境,且带有libpython3.8.so库文件(编译时指定--enable-shared可生成)。
若需要启用tls安全认证,需要安装openssl及openssl-devel,且python3编译时指定--with-ssl-default-suites=openssl,如安装完在python3命令行执行import ssl成功,则说明安装ssl模块成功。
麒麟系统import ssl如出现symbol SSLv3_method not defined的错误,是openssl的版本不支持SSLv3。可在python3源码修改Mudule/_ssl.c中的SSLv3_method()为DTLS_method(),保存后重新编译python3即可。
2、添加如下环境变量。
- PYTHONHOME:python3安装路径
- LD_LIBRARY_PATH:增加python3安装路径下的lib目录。
- PATH:增加python3安装路径bin目录。
3、创建plython3u扩展。
create extension plpython3u;
4、调用函数发送邮件。
--创建发送邮件函数:(v_sender填写企业邮箱发送邮箱地址,v_passwd填写邮箱密码)
CREATE OR REPLACE FUNCTION send_mail(recipient varchar, subject varchar, message varchar) returns void as
$$
declare
v_mailhost varchar := '119.147.3.176';
v_sender varchar := 'xxxx@vastdata.com.cn';
v_passwd varchar := 'xxxx';
v_conn utl_smtp.connection;
v_msg varchar;
crlf varchar(2) := CHR(10);
v_ret varchar;
err_context text;
begin
v_conn := utl_smtp.open_connection(v_mailhost, 587, 1000, true);
perform utl_smtp.auth(v_conn, v_sender, v_passwd, 'CRAM-MD5 PLAIN LOGIN');
perform utl_smtp.helo(v_conn, v_mailhost);
perform utl_smtp.mail(v_conn, v_sender);
perform utl_smtp.rcpt(v_conn, recipient);
v_msg := 'From: ' || v_sender || crlf ||
'To: ' || recipient || crlf ||
'Subject: ' || subject || crlf ||
crlf || message;
raise notice '%', v_msg;
perform utl_smtp.open_data(v_conn);
perform utl_smtp.write_data(v_conn, v_msg);
perform utl_smtp.close_data(v_conn);
perform utl_smtp.quit(v_conn);
exception
when others then
GET STACKED DIAGNOSTICS err_context = PG_EXCEPTION_CONTEXT;
RAISE INFO 'Error Name:%',SQLERRM;
RAISE INFO 'Error State:%', SQLSTATE;
RAISE INFO 'Error Context:%', err_context;
end;
$$ LANGUAGE plpgsql;
5、调用send_mail函数发送邮件,第一个参数填写接收邮箱地址:
select send_mail('xxx@qq.com', 'utl_smtp测试', '您好,这是测试邮件!');
open_connection函数
语法格式
UTL_SMTP.OPEN_CONNECTION (
host IN VARCHAR2,
port IN PLS_INTEGER DEFAULT 25,
c OUT connection,
tx_timeout IN PLS_INTEGER DEFAULT NULL,
wallet_path IN VARCHAR2 DEFAULT NULL,
wallet_password IN VARCHAR2 DEFAULT NULL,
secure_connection_before_smtp IN BOOLEAN DEFAULT FALSE,
secure_host IN VARCHAR2 DEFAULT NULL)
RETURN connection;
参数说明
host
SMTP服务器地址。
port
SMTP服务器端口,默认25。
c
SMTP连接。
tx_timeout
UTL_SMTP包在连接中的读或写操作超时等待的时间(秒),默认为NULL。
wallet_path
指定客户端钱包,默认为NULL(接口预留,暂不实现)。
wallet_password
打开钱包的密码,默认为NULL(接口预留,暂不实现)。
secure_connection_before_smtp
是否在smtp通信之间建立SSL/TLS的安全连接,默认为false。
secure_hos
使用安全连接的证书域名,默认为NULL(接口预留,暂不实现)。
auth函数
语法格式
UTL_SMTP.AUTH (
c IN OUT NOCOPY connection,
username IN VARCHAR2,
password IN VARCHAR2,
schemes IN VARCHAR2 DEFAULT NON_CLEARTEXT_PASSWORD_SCHEMES);
参数说明
c
open_connection返回的smtp连接。
username
发送邮件的用户名。
password
发送邮件用户的密码。
schemas
身份验证方案,默认为CRAM-MD5。
helo函数
语法格式
UTL_SMTP.HELO (
c IN OUT NOCOPY connection,
domain IN VARCHAR2);
参数说明
c
open_connection返回的smtp连接。
domain
发送邮件的域名或者主机地址。
mail函数
语法格式
UTL_SMTP.MAIL (
c IN OUT NOCOPY connection,
sender IN VARCHAR2,
parameters IN VARCHAR2 DEFAULT NULL);
参数说明
c
open_connection返回的smtp连接。
sender
发送邮件的邮箱地址。
parameters
定义邮箱命令的附加参数,默认为NULL(接口预留,暂不实现)。
rcpt函数
语法格式
UTL_SMTP.RCPT (
c IN OUT NOCOPY connection,
recipient IN VARCHAR2,
parameters IN VARCHAR2 DEFAULT NULL);
参数说明
c
open_connection返回的smtp连接。
recipient
接收电子邮件的地址。
parameters
定义邮箱命令的附加参数,默认为NULL(接口预留,暂不实现)。
open_data函数
语法格式
UTL_SMTP.OPEN_DATA (
c IN OUT NOCOPY connection);
参数说明
c:open_connection返回的smtp连接。
write_data函数
语法格式
UTL_SMTP.WRITE_DATA (
c IN OUT NOCOPY connection,
data IN VARCHAR2 CHARACTER SET ANY_CS);
参数说明
c
open_connection返回的smtp连接。
data
要发送消息文本,包括标题,采用RFC822格式。
quit函数
语法格式
UTL_SMTP.QUIT (
c IN OUT NOCOPY connection);
参数说明
c:open_connection返回的smtp连接。
close_data函数
语法格式
UTL_SMTP.CLOSE_DATA (
c IN OUT NOCOPY connection);
参数说明
c:open_connection返回的smtp连接。