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

 更新时间:2021年08月10日 09:21:46   作者:不剪发的Tony老师  
这篇文章主要介绍了Oracle PL/SQL 实现发送电子邮件功能,今天主要给大家介绍使用UTL_MAIL实现发送电子邮件功能,具体实例代码跟随小编一起看看吧

email

大家好,我是只谈技术不剪发的 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.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,需要重启服务,更高版本不需要。

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

发送邮件

完成安装和配置之后,我们可以使用存储过程 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);

这些参数的作用如下:

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

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

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 支持以下额外的参数:

  • ATTACHMENT:附件内容,数据类型为 RAW 或者 VARCHAR2
  • ATT_INLINE:指定附件是否在邮件正文中显式,默认为 TRUE
  • ATT_MIME_TYPE:附件的 MIME 类型,默认为 ‘application/octet' 或者 ‘text/plain; charset=us-ascii'
  • ATT_FILENAME:附件的文件名,默认为 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', -- 支持中文
                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 => '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 发送电子邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PowerDesigner15.1连接oracle11g逆向生成ER图

    PowerDesigner15.1连接oracle11g逆向生成ER图

    这篇文章主要为大家详细介绍了PowerDesigner15.1连接oracle11g逆向生成ER图的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Oracle ORA 07445 evaopn2()+128错误问题的解决方案

    Oracle ORA 07445 evaopn2()+128错误问题的解决方案

    这篇文章主要介绍了Oracle ORA 07445 evaopn2()+128错误问题的解决方案,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • Oracle 统计用户下表的数据量实现脚本

    Oracle 统计用户下表的数据量实现脚本

    这篇文章给大家分享Oracle 统计用户下表的数据量实现脚本,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-09-09
  • 一文解决ORA-01034: ORACLE not available报错

    一文解决ORA-01034: ORACLE not available报错

    这篇文章主要给大家介绍了关于ORA-01034: ORACLE not available报错解决的相关资料,这是oracle数据库启动经常会遇到的问题,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • 详解Oracle自定义异常示例

    详解Oracle自定义异常示例

    这篇文章主要介绍了详解Oracle自定义异常示例的相关资料,需要的朋友可以参考下
    2016-04-04
  • 查看oracle数据库的编码及修改编码格式的方法

    查看oracle数据库的编码及修改编码格式的方法

    本节主要介绍了如何查看oracle数据库的编码及修改编码格式,需要的朋友可以参考下
    2014-07-07
  • oracle ORA-01114、ORA-27067错误解决方法

    oracle ORA-01114、ORA-27067错误解决方法

    本文章总结了关于ORA-01114、ORA-27067错误解决方法,有需要学习的朋友可参考一下下哦
    2012-10-10
  • 详解Oracle中的隐含参数_disable_logging

    详解Oracle中的隐含参数_disable_logging

    之前看到过一篇文章是介绍Oracle的一个内部隐含参数_disable_logging,最近又看到有朋友论述这个参数,所以下面这篇文章就来给大家介绍下关于Oracle中隐含参数_disable_logging的相关资料,需要的朋友可以参考下。
    2017-02-02
  • Oracle Instr函数实例讲解

    Oracle Instr函数实例讲解

    instr函数为字符查找函数,其功能是查找一个字符串在另一个字符串中首次出现的位置,instr函数在Oracle/PLSQL中是返回要截取的字符串在源字符串中的位置,这篇文章主要介绍了Oracle Instr函数实例讲解,需要的朋友可以参考下
    2022-11-11
  • Oracle学习笔记之视图及索引的使用

    Oracle学习笔记之视图及索引的使用

    这篇文章主要介绍了Oracle学习笔记之视图及索引的使用,视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询
    2022-07-07

最新评论