如何使用Oracle PL/SQL 实现发送电子邮件功能(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.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 发送电子邮件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Oracle 存储过程发送邮件实例学习

    复制代码 代码如下: CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT VARCHAR2, P_SUB VARCHAR2, P_SENDOR VARCHAR2, P_RECEIVER VARCHAR2, P_SERVER VARCHAR2, P_PORT NUMBER DEFAULT 25, P_NEED_SMTP INT DEFAULT 0, P_USER VARCHAR2 DEFAULT NULL, P_PASS VARCHAR2 DEFAULT

  • 详解PL/SQL Developer连接本地Oracle 11g 64位数据库

    1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files (x86)目录下,不然无法启动PL/SQL Developer. 奇怪这里为什么选择不到数据库的TNS呢?我是先安装数据库,再安装PL/SQL Developer.按理说安装PL/SQL Developer时,就已经识别到了Oracle Home和OCI Libaray了.管它呢?先以非登录方式登

  • 利用PL/SQL从Oracle数据库导出和导入数据

    本文实例为大家分享了使用PL/SQL从Oracle数据库导出和导入数据的方法,供大家参考,具体内容如下 1.导出数据: 方式一:工具->导出用户对象->导出.sql文件 注:这种方式导出的是建表语句和存储过程语句 方式二:工具->导出表 注: 这里是导出表的结构和数据 第一种方式导出.dmp格式的文件,.dmp是二进制文件,可跨平台,还能包含权限,效率不错,用的最为广泛. 第二种方式导出.sql格式的文件,可用文本编辑器查看,通用性比较好,效率不如第一种,适合小数据量导入导出.尤其注意的

  • 利用Oracle数据库发送邮件的实例代码

    --发送邮件的主过程如下所述: Procedure send_mail_ (p_From Varchar2, --邮件发送人 p_Fromuser Varchar2, --发件人昵称 p_Touser Varchar2, --接受人昵称 p_To Varchar2, --邮件接收人 p_Cc Varchar2, --邮件抄送人 p_Subject Varchar2, --邮件标题 p_Message Varchar2, --邮件内容 p_User Varchar2, --邮件验证用户 p_Mai

  • PL/SQL远程备份和恢复Oracle数据库

    在客户端远程备份的文件保存在数据库所在主机上,不会直接拷贝到客户端. ------------------------------------------ 首先无论你的Oracle服务器是Linux还是windows操作系统,Oracle的备份和恢复操作都是使用DBMS_DUMP来实现导入(备份)和导出(恢复).首先你要安装好PL/SQL,用PL/SQL来执行我下面提供的JOB就可以实现了.  一.Oracle的导出(备份) 1.用PLSQL连接Oracle数据库服务器,使用你需要导出的用户连接

  • Oracle中PL/SQL中if语句的写法介绍

    复制代码 代码如下: /*If语句:判断用户输入的数字.*/set serveroutput on --接收键盘输入accept num prompt '请输入一个数字:'; declare   --将屏幕输入的数字付给变量  pnum number := &num;begin  if pnum = 0 then dbms_output.put_line('您输入的是0');  end if; if pnum = 1 then dbms_output.put_line('您输入的是1');  e

  • oracle 发送邮件 实现方法

    CREATE OR REPLACE PROCEDURE PROCSENDEMAIL(P_TXT        VARCHAR2,                                           P_SUB        VARCHAR2,                                           P_SENDOR     VARCHAR2,                                           P_RECEIVER  

  • PL/SQL中编写Oracle数据库分页的存储过程

    其实 Oracle数据库的分页还是比较容易理解的.此文以oracle数据库中的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集. 由于需要返回查询出来的结果集,需要在PL/SQL中创建一个package,这个包里面定义一个refcursor类型,用于记录sql语句查询出来的结果集.创建包的代码如下: create or replace package pagingPackage

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

    大家好,我是只谈技术不剪发的 Tony 老师. 我们在开发 Oracle 数据库程序时,如果想要通过 PL/SQL 存储过程实现发送邮件的功能,大概可以使用以下三种方法: 利用 UTL_TCP程序包基于 TCP 协议发送邮件.这种方法比较原始,需要用户编写基础交换代码. 利用 UTL_SMTP 程序包基于 SMTP 协议发送邮件.这种方法比编码 TCP 操作简单很多,支持发送电子邮件的各种操作,因此使用非常广泛. 利用 UTL_MAIL 程序包发送邮件.这种方法最简单,支持常用的邮件功能,不需要

  • Oracle PL/SQL语言入门基础

    正在看的ORACLE教程是:Oracle PL/SQL语言入门基础.PL/SQL是ORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件.以及如何设计并执行一个PL/SQL程序. PL/SQL的优点 从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL

  • Oracle PL/SQL入门案例实践

    正在看的ORACLE教程是:Oracle PL/SQL入门案例实践. 前面已经了解了关于PL/SQL编程的基础,本文将结合一个案例来加深对这些知识点的理解. 一. 案例介绍 某数据库有两张表,是关于某公司员工资料.薪水和部门信息的,它们分别是emp表和dept表,两张表的结构如下: 要求如下: 1.按照上表结构建立相应的表,并每张表写入5组合法数据. 2.操纵相关表,使得"技术部"的员工的薪水上涨20%. 3.建立日志,追踪薪水变动情况. 4.建立测试包. 二. 案例的分析与实现 从前

  • Oracle PL/SQL入门慨述

    正在看的ORACLE教程是:Oracle PL/SQL入门慨述.一.PL/SQL出现的目的 结构化查询语言(Structured Query Language,简称SQL)是用来访问关系型数据库一种通用语言,它属于第四代语言(4GL),其执行特点是非过程化,即不用指明执行的具体方法和途径,而是简单的调用相应语句来直接取得结果即可.显然,这种不关注任何实现细节的语言对于开发者来说有着极大的便利. 然而,对于有些复杂的业务流程又要求相应的程序来描述,那么4GL就有些无能为力了.PL/SQL的出现正是

  • Oracle PL/SQL中异常高级特性示例解析

    PL/SQL(Procedural Language/SQL,过程语言/SQL)是结合了Oracel过程语言和结构化查询语言(SQL)的一种扩展语言. 优点: (1)PL/SQL具有编程语言的特点,它能把一组SQL语句放到一个模块中,使其更具模块化种序的特点. (2)PL/SQL可以采用过程性语言控制程序的结构. (3)PL/SQL有自动处理的异常处理机制. (4)PL/SQL程序块具有更好的可移植性,可移植到另一个Oracle数据库中. (5)PL/SQL程序减少了网络的交互,有助于提高程序性

  • 在Oracle PL/SQL中游标声明中表名动态变化的方法

    /*     小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记录的某一个字段的内容导入到另一个表中.     (     tabname in varchar     )     is     v_servicesname tabname.服务类型%type; --这个变量就是用来存放所要取得的字段内容,但不知该如何定义     cursor curSort1 is select 服务类型 from tabna

  • Oracle PL/SQL异常处理方法解析

    Oracle数据库中的异常:没有异常的转移,因为没有受检异常和非受检异常得区分. 1.异常的产生: 2.异常的处理: declare --变量定义,初始化赋值. begin --变量的赋值,函数调用,if,while等. exception --异常处理代码 when others then 异常处理语句. end: 3.异常的抛出:raise 4.多异常处理:Java的多异常是通过数据类型区分,Oracle数据库的多异常是通过异常编号区分. 区别不同的异常是实现多异常处理前提. declare

  • ORACLE PL/SQL 触发器编程篇介绍

    1.基本概念 两种功能:完成由数据库的完整性约束难以完成的复杂业务规则的约束:监视数据库的各种操作,实现审计功能. 触发器分为:DML触发器(对表或视图执行DML操作时触发),INSTEAD OF触发器(只定义在视图上,替代实际的操作语句),系统触发器(对数据库系统进行操作时触发,如DDL语句.启动或关闭数据库等) 触发事件: 上述触发器中括号内容都是触发事件. 触发条件: WHEN子句 触发对象:包括表.视图.模式.数据库. 触发操作:触发器自动执行的程序. 触发时机:触发器相对操作执行的时间

  • 使用JavaScript通过前端发送电子邮件

    你为什么不通过发送电子邮件传输信息? 不使用数据库就能接收到传入的消息,绝对是最佳选择,也是最方便用户的选择.但问题来了-如何实现呢?你可能认为需要使用某种后端语言. 实际上,你不必使用任何如 php 或 python 这种后端语言,你甚至不需要用到 node.js! 你需要的就是一个简单的EmailJS库. 本文将介绍下面两个重要功能: 配置 emailjs 帐户 使用 JS 发送电子邮件 请注意,在我的项目中,我使用了 gulp 和 webpack,我在 src 文件夹存放源码,dist 存

  • Oracle 10G:PL/SQL正规表达式(正则表达式)手册

    Oracle 的正规表达式的实施是以各种 SQL 函数和一个 WHERE 子句操作符的形式出现的.如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能.已经对正规表达式很熟悉的读者可以了解如何在 Oracle SQL 语言的环境中应用这种功能. 什么是正规表达式? 正规表达式由一个或多个字符型文字和/或元字符组成.在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式 cat.它被读作字母 c,接着是字母 a 和 t,这种模式匹配 cat.locati

随机推荐