• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    如何使用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,需要重启服务,更高版本不需要。

    建议在数据库服务器上设置一个邮件转发,而不是直接连接到外部的邮件服务器。邮件转发配置非常简单,设置一个引用 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);

    这些参数的作用如下:

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

    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 程序包使用调用者权限,也就是说使用该程序的用户需要拥有访问外部邮件服务器的权限。

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

    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 发送电子邮件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • Oracle区别ADG与DG案例详解
    • oracle创建用户过程详解
    • Oracle rac案例讲解
    • Oracle存储过程案例详解
    • Oracle之TO_DATE用法详解
    • springboot+mybatis-plus+oracle实现逻辑删除
    • oracle+mybatis-plus+springboot实现分页查询的实例
    • Oracle中NEXTVAL案例详解
    上一篇:通过 plsql 连接远程 Oracle数据库的多种方法
    下一篇:Oracle之TO_DATE用法详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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