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

2023-10-19 03:40

本文主要是介绍Oracle PL/SQL 实现发送电子邮件功能(UTL_MAIL),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

email

文章目录

    • 安装 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 开始支持该参数

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

BEGINUTL_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_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_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

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

BEGINUTL_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)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/237055

相关文章

SpringBoot基于沙箱环境实现支付宝支付教程

《SpringBoot基于沙箱环境实现支付宝支付教程》本文介绍了如何使用支付宝沙箱环境进行开发测试,包括沙箱环境的介绍、准备步骤、在SpringBoot项目中结合支付宝沙箱进行支付接口的实现与测试... 目录一、支付宝沙箱环境介绍二、沙箱环境准备2.1 注册入驻支付宝开放平台2.2 配置沙箱环境2.3 沙箱

Mysql中InnoDB与MyISAM索引差异详解(最新整理)

《Mysql中InnoDB与MyISAM索引差异详解(最新整理)》InnoDB和MyISAM在索引实现和特性上有差异,包括聚集索引、非聚集索引、事务支持、并发控制、覆盖索引、主键约束、外键支持和物理存... 目录1. 索引类型与数据存储方式InnoDBMyISAM2. 事务与并发控制InnoDBMyISAM

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

使用Python实现表格字段智能去重

《使用Python实现表格字段智能去重》在数据分析和处理过程中,数据清洗是一个至关重要的步骤,其中字段去重是一个常见且关键的任务,下面我们看看如何使用Python进行表格字段智能去重吧... 目录一、引言二、数据重复问题的常见场景与影响三、python在数据清洗中的优势四、基于Python的表格字段智能去重

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://