UTL_SMTP 包

UTL_SMTP包的功能是提供对smtp服务器的基本访问请求以及通过SMTP服务器发送邮件的功能。

使用UTL_SMTP包发送邮件的大致流程为:首先,声明连接,并开启连接;其次,遵照SMTP协议与服务器进行握手,并根据RFC821简单邮件传输协议进行命令和邮件内容等的发送;最后,关闭会话,关闭连接。

35.1 相关方法

下面对各个函数和过程进行详细说明。

  1. connection

定义connection为record类型,为下面的过程或函数使用。

语法如下:

type connection is record (

	remote_host varchar2(255),

	remote_port int,

	tx_timeout int,

	private_hndl bigint

);

参数详解

  • Remote_host,remote_port

为smtp服务器的地址及端口号,由open_connection过程传入。

  • tx_timeout

为等待响应时间,同样由open_connection过程传入。

  • private_hndl

为内部标识connection的id。

  1. OPEN_CONNECTION

用于开启并返回与SMTP服务器的连接。

语法如下:

FUNCTION OPEN_CONNECTION (

	host IN VARCHAR2,

	port IN PLS_INTEGER DEFAULT 25,

	tx_timeout IN PLS_INTEGER DEFAULT NULL)

RETURN connection;

参数详解

  • host

SMTP服务器地址。

  • port

SMTP服务器端口号。

  • tx_timeout

等待时间, NULL代表一直等待,0代表不等待。

  1. HELO/EHLO

用于向SMTP服务器打招呼。EHLO指令表示需要SMTP认证,HELO指令表示不需要SMTP认证。

语法如下:

PROCEDURE HELO (

	c IN OUT NOCOPY connection,

	r_domain IN VARCHAR2);

或者

PROCEDURE EHLO (

	c IN OUT NOCOPY connection,

	r_domain IN VARCHAR2);

参数详解

  • c

使用的SMTP连接。

  1. COMMAND

用于向smtp服务器发送命令。命令不由此程序判断正确性,发送错误命令,程序会报错。

语法如下:

PROCEDURE COMMAND (

	c IN OUT NOCOPY connection,

	cmd IN VARCHAR2,

	arg IN VARCHAR2 DEFAULT NULL);

参数详解

  • c

使用的连接。

  • cmd 命令名

准备登陆为AUTH LOGIN(AUTH LOGIN命令使用后,要分别再使用command发送用户名和密码);握手为HELO;更多的命令详见RFC821 简单邮件传输协议。

  • arg 命令参数

可选参数,不同的cmd使用不同的arg 。例如: AUTH LOGIN无参数,但必须接下来继续使用command发送用户名和密码;而HELO后面的参数为服务器地址。

  1. MAIL

用于告知服务器发件人。

语法如下:

PROCEDURE MAIL (

	c IN OUT NOCOPY connection,

	sender IN VARCHAR2,

	m_parameters IN VARCHAR2 DEFAULT NULL);

参数详解

  • c

使用的SMTP连接。

  • sender

发件人邮箱。

  • m_parameters

可选参数。公认的几种SMTP的扩展将会用到MAIL FROM 和RCPT TO的额外参数,详见RFC1869第6部分,格式要求必须符合 "XXX=XXX (XXX=XXX
....)"。

  1. RCPT

用于告知SMTP服务器收件人信息。

语法如下:

PROCEDURE RCPT (

	c IN OUT NOCOPY connection,

	recipients IN VARCHAR2,

	r_parameters IN VARCHAR2 DEFAULT NULL);

参数详解

  • c

使用的SMTP连接。

  • recipients

收件人邮箱。

  • r_parameters

可选参数。公认的几种SMTP的扩展将会用到MAIL FROM 和RCPT TO的额外参数,详见RFC1869第6部分,格式要求必须符合 "XXX=XXX (XXX=XXX
....)"。

  1. OPEN_DATA

用于告知SMTP服务器开始发送数据。只有使用过该过程才可以发送数据。

语法如下:

PROCEDURE OPEN_DATA (

c IN OUT NOCOPY connection);

参数详解

  • c

使用的SMTP连接。

  1. WRITE_DATA

用于发送邮件内容(varchar类型)。

语法如下:

PROCEDURE WRITE_DATA (

c IN OUT NOCOPY connection,

data IN VARCHAR2);

参数详解

  • c

使用的SMTP连接。

  • data

发送的内容,varchar类型。

  1. WRITE_RAW_DATA

用来发送邮件内容(varbinary类型)。

语法如下:

PROCEDURE WRITE_RAW_DATA (

	c IN OUT NOCOPY connection,

	data IN varbinary);

参数详解

  • c

使用的SMTP连接。

  • data

邮件内容,varbinary类型。

  1. CLOSE_DATA

关闭数据流,告知服务器数据发送完毕。

语法如下:

PROCEDURE CLOSE_DATA (

c IN OUT NOCOPY connection);

参数详解

  • C

所使用SMTP连接。

  1. QUIT

用来结束会话。

语法如下:

PROCEDURE QUIT (

	c IN OUT NOCOPY connection);

参数详解

  • c

使用的SMTP连接。

  1. CLOSE_CONNECTION

关闭SMTP连接。

语法如下:

PROCEDURE CLOSE_CONNECTION (

	c IN OUT NOCOPY connection);

参数详解

  • c

所需要关闭的SMTP连接。

35.2 应用实例

使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES(1, 'UTL_SMTP');

SP_CREATE_SYSTEM_PACKAGES(1, 'UTL_TCP');

SP_CREATE_SYSTEM_PACKAGES(1, 'UTL_RAW');

举一个使用UTL_SMTP包发邮件的例子。发件人yhx@dameng.shanghai,收件人gyf@dameng.shanghai,发送内容为邮件头部信息(收件人、发件人、发送时间、主题、编码等),重复10次的 “达梦数据库第i行”。

DECLARE

	C UTL_SMTP.CONNECTION; --声明连接

	MSG VARCHAR2(4000);

BEGIN

	C := UTL_SMTP.OPEN_CONNECTION('192.168.0.212'); --开启连接

	UTL_SMTP.HELO(C, '192.168.0.212'); --握手

	UTL_SMTP.COMMAND(C, 'AUTH LOGIN'); --准备登陆

UTL_SMTP.COMMAND(C,UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('yhx\@DAMENG.SHANGHAI'))));
--用户名

UTL_SMTP.COMMAND(C,UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW('888888'))));
--密码

	UTL_SMTP.MAIL(C, 'yhx\@DAMENG.SHANGHAI'); --发件人

	UTL_SMTP.RCPT(C, 'GYF\@DAMENG.SHANGHAI'); --收件人

	UTL_SMTP.OPEN_DATA(C); --开始发送邮件内容

	MSG := 'CONTENT-TYPE: TEXT/PLAIN; CHARSET=GB2312' || UTL_TCP.CRLF || 'DATE:'
||

	TO_CHAR(SYSDATE, 'MM DD YYYY HH24:MI:SS') || UTL_TCP.CRLF || 'FROM:' ||

	'YHX@DAMENG.SHANGHAI' || UTL_TCP.CRLF || 'SUBJECT: HOW TO USE SMTP' ||UTL_TCP.CRLF ||

	'TO: ' || 'GYF@DAMENG.SHANGHAI' || UTL_TCP.CRLF ||

	'CONTENT-TYPE: TEXT/PLAIN; CHARSET=GB2312' || UTL_TCP.CRLF ;

--MSG为邮件头信息, 邮件头信息需要与正文信息, 通过UTL_TCP.CRLF来分隔开

	UTL_SMTP.WRITE_RAW_DATA(C, UTL_RAW.CAST_TO_RAW(MSG)); --发送邮件头信息

	UTL_SMTP.WRITE_DATA(C, UTL_TCP.CRLF ||'达梦数据库SMTP包邮件示例:' ||	UTL_TCP.CRLF); --发送邮件正文信息

FOR I IN 1 .. 10 LOOP

	UTL_SMTP.WRITE_DATA(C, '达梦数据库DM 第' || i || '行' || UTL_TCP.CRLF);

END LOOP;

UTL_SMTP.CLOSE_DATA(C); --邮件内容发送完毕

UTL_SMTP.QUIT(C); --结束会话

UTL_SMTP.CLOSE_CONNECTION(C); --关闭连接

END;

所收到的邮件内容(包含msg中所写的收件人,发件人,时间信息):

邮件内容

微信扫码
分享文档
扫一扫
联系客服