第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)

Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)

时间:2021-03-28 20:11:59

相关推荐

Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)

文章目录

安装 UTL_MAIL发送邮件发送附件注意事项

大家好,我是只谈技术不剪发的 Tony 老师。

我们在开发 Oracle 数据库程序时,如果想要通过 PL/SQL 存储过程实现发送邮件的功能,大概可以使用以下三种方法:

利用 UTL_TCP 程序包基于 TCP 协议发送邮件。这种方法比较原始,需要用户编写基础交换代码。利用 UTL_SMTP 程序包基于 SMTP 协议发送邮件。这种方法比编码 TCP 操作简单很多,支持发送电子邮件的各种操作,因此使用非常广泛。利用 UTL_MAIL 程序包发送邮件。这种方法最简单,支持常用的邮件功能,不需要了解 SMTP 协议。

今天我们要介绍的是第 3 种方法,也就是通过 UTL_MAIL 程序包在 PL/SQL 程序中实现发送邮件的功能。Oracle 10g 开始提供 UTL_MAIL 程序包。

安装 UTL_MAIL

默认情况下,系统没有安装 UTL_MAIL 程序包。因为它需要设置 SMTP_OUT_SERVER 配置参数,同时还会涉及到一些安全问题。

首先,执行以下语句安装 UTL_MAIL 程序包:

sqlplus sys/<pwd>SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sqlSQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb

然后设置 SMTP_OUT_SERVER 参数:

sqlplus sys/<pwd>SQL> ALTER SYSTEM SET smtp_out_server='' SCOPE=SPFILE;

如果使用 Oracle 10g R1,需要重启服务,更高版本不需要。

建议在数据库服务器上设置一个邮件转发,而不是直接连接到外部的邮件服务器。邮件转发配置非常简单,设置一个引用 SMTP_OUT_SERVER 参数的 localhost 的配置。任何连接外部邮件服务器的复杂配置都隐藏在邮件转发配置中。

发送邮件

完成安装和配置之后,我们可以使用存储过程 UTL_MAIL.SEND 发送邮件:

UTL_MAIL.SEND (senderIN VARCHAR2 CHARACTER SET ANY_CS,recipients IN VARCHAR2 CHARACTER SET ANY_CS,ccIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,subjectIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,messageIN VARCHAR2 CHARACTER SET ANY_CS,mime_type IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii',priority IN PLS_INTEGER DEFAULT 3,replytoIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

这些参数的作用如下:

SENDER:发送者的邮件地址RECIPIENTS:接收者的邮件地址,多个地址使用逗号分隔CC:抄送者的邮件地址,多个地址使用逗号分隔,默认为 NULLBCC:密送者的邮件地址,多个地址使用逗号分隔,默认为 NULLSUBJECT:邮件主题,默认为 NULLMESSAGE:邮件正文MIME_TYPE:邮件的 MIME 类型,默认为 text/plain; charset=us-asciiPRIORITY:邮件优先级,1 级最高,5 级最低,默认为 3REPLYTO:回复邮件发送的目标地址,Oracle 11g R2 开始支持该参数

以下是一个发送邮件的简单示例:

BEGINUTL_MAIL.send(sender=> 'myname@',recipients => 'zhangsan@,lisi@',cc => 'wangwu@',bcc => 'myboss@',subject => 'UTL_MAIL 测试',message => '邮件正文',mime_type => 'text/plain; charset=UTF-8'); -- 支持中文END;/

发送附件

除了发送文本邮件之外,UTL_MAIL 程序包还提供了两个支持附件的存储过程:SEND_ATTACH_RAW 以及 SEND_ATTACH_VARCHAR2 。它们分别可以用于发送 RAW 以及 VARCHAR2 格式的附件。

UTL_MAIL.SEND_ATTACH_RAW (sender IN VARCHAR2 CHARACTER SET ANY_CS,recipients IN VARCHAR2 CHARACTER SET ANY_CS,ccIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,subjectIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,messageIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,mime_type IN VARCHAR2 DEFAULT CHARACTER SET ANY_CSDEFAULT 'text/plain; charset=us-ascii',priority IN PLS_INTEGER DEFAULT 3,attachment IN RAW,att_inline IN BOOLEAN DEFAULT TRUE,att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',att_filenameIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,replytoIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);UTL_MAIL.SEND_ATTACH_VARCHAR2 (sender IN VARCHAR2 CHARACTER SET ANY_CS,recipients IN VARCHAR2 CHARACTER SET ANY_CS,ccIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,bccIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,message IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL,mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',priorityIN PLS_INTEGER DEFAULT 3,attachment IN VARCHAR2 CHARACTER SET ANY_CS, ,att_inline IN BOOLEAN DEFAULT TRUE,att_mime_typeIN VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii',att_filenameIN VARCHAR2CHARACTER SET ANY_CS DEFAULT NULL,replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL);

这两个存储过程比 UTL_MAIL.SEND 支持以下额外的参数:

ATTACHMENT:附件内容,数据类型为 RAW 或者 VARCHAR2ATT_INLINE:指定附件是否在邮件正文中显式,默认为 TRUEATT_MIME_TYPE:附件的 MIME 类型,默认为 ‘application/octet’ 或者 ‘text/plain; charset=us-ascii’ATT_FILENAME:附件的文件名,默认为 NULL

以下是一个发送文本附件的示例:

BEGINUTL_MAIL.send(sender=> 'myname@',recipients => 'zhangsan@,lisi@',cc => 'wangwu@',bcc => 'myboss@',subject => 'UTL_MAIL 测试',message => '邮件正文',mime_type => 'text/plain; charset=UTF-8', -- 支持中文attachment => '附件内容',att_mime_type => 'text/plain; charset=UTF-8', -- 支持中文att_filename => '附件.txt');END;/

注意事项

UTL_MAIL 程序包使用调用者权限,也就是说使用该程序的用户需要拥有访问外部邮件服务器的权限。

如果遇到以下错误,表示缺少相应的权限。

ORA-24247: network access denied by access control list (ACL)

此时我们可以通过以下语句授予指定用户(例如 scott)访问外部服务器上的 SMPT 服务权限:

BEGIN;DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(host => 'm',ace => xs$ace_type(privilege_list => xs$name_list('smtp'),principal_name => 'scott',principal_type => xs_acl.ptype_db)); END;/

详细内容可以参考官方文档。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。