如何使用Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL) |
大家好,我是只谈技术不剪发的 Tony 老师 。 我们在开发 Oracle 数据库程序时,如果想要通过 PL/SQL 存储过程实现发送邮件的功能,大概可以使用以下三种方法:
今天我们要介绍的是第 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.sql SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb 然后设置 SMTP_OUT_SERVER 参数: sqlplus sys/<pwd> SQL> ALTER SYSTEM SET smtp_out_server='smtp.domain.com' SCOPE=SPFILE; 如果使用 Oracle 10g R1,需要重启服务,更高版本不需要 。
发送邮件完成安装和配置之后,我们可以使用存储过程 UTL_MAIL.SEND 发送邮件: UTL_MAIL.SEND ( sender IN VARCHAR2 CHARACTER SET ANY_CS, recipients IN VARCHAR2 CHARACTER SET ANY_CS, cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, bcc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, subject IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, message IN VARCHAR2 CHARACTER SET ANY_CS, mime_type IN VARCHAR2 DEFAULT 'text/plain; charset=us-ascii', priority IN PLS_INTEGER DEFAULT 3, replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL); 这些参数的作用如下:
以下是一个发送邮件的简单示例: BEGIN UTL_MAIL.send(sender => 'myname@domain.com', recipients => 'zhangsan@domain.com,lisi@domain.com', cc => 'wangwu@domain.com', bcc => 'myboss@domain.com', 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, cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, bcc IN 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 DEFAULT CHARACTER SET ANY_CS DEFAULT '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_filename IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, replyto IN 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, cc IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL, bcc IN 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', priority IN PLS_INTEGER DEFAULT 3, attachment IN VARCHAR2 CHARACTER SET ANY_CS, , att_inline IN BOOLEAN DEFAULT TRUE, att_mime_type IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT 'text/plain; charset=us-ascii', att_filename IN VARCHAR2CHARACTER SET ANY_CS DEFAULT NULL, replyto IN VARCHAR2 CHARACTER SET ANY_CS DEFAULT NULL); 这两个存储过程比 UTL_MAIL.SEND 支持以下额外的参数:
以下是一个发送文本附件的示例: BEGIN UTL_MAIL.send(sender => 'myname@domain.com', recipients => 'zhangsan@domain.com,lisi@domain.com', cc => 'wangwu@domain.com', bcc => 'myboss@domain.com', 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 程序包使用调用者权限,也就是说使用该程序的用户需要拥有访问外部邮件服务器的权限 。 如果遇到以下错误,表示缺少相应的权限 。
此时我们可以通过以下语句授予指定用户(例如 scott)访问外部服务器上的 SMPT 服务权限: BEGIN; DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'www.domain.comm', ace => xs$ace_type(privilege_list => xs$name_list('smtp'), principal_name => 'scott', principal_type => xs_acl.ptype_db)); END; / 详细内容可以参考官方文档 。 到此这篇关于如何使用Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL)的文章就介绍到这了,更多相关Oracle PL/SQL 发送电子邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! |