Oracle 提供一個一個UTL_SMTP,可以發送email,結合oracle本身強大的schedule功能,比寫一隻排程效率高,且更簡單。

split功能

 /*創建package STRING_FNC
add by milo 20170308*/
CREATE OR REPLACE PACKAGE STRING_FNC IS
TYPE t_array IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
FUNCTION SPLIT(p_in_string VARCHAR2, p_delim VARCHAR2) RETURN t_array;
END; /*創建package body STRING_FNC
add by milo 20170308*/
CREATE OR REPLACE PACKAGE BODY STRING_FNC IS
FUNCTION SPLIT(p_in_string VARCHAR2, p_delim VARCHAR2) RETURN t_array IS
i number := 0;
pos number := 0;
lv_str varchar2(500) := p_in_string;
strings t_array;
BEGIN
-- determine first chuck of string
pos := instr(lv_str, p_delim, 1, 1); --如果沒有拆分符號,則array第一個為p_in_string
if pos = 0 then
strings(1) := lv_str;
RETURN strings;
end if; -- while there are chunks left, loop
WHILE (pos != 0) LOOP
-- increment counter
i := i + 1;
-- create array element for chuck of string
strings(i) := substr(lv_str, 1, pos - 1);
-- remove chunk from string
lv_str := substr(lv_str, pos + 1, length(lv_str));
-- determine next chunk
pos := instr(lv_str, p_delim, 1, 1);
-- no last chunk, add to array
IF pos = 0 THEN
strings(i + 1) := lv_str;
END IF;
END LOOP;
-- return array
RETURN strings;
END SPLIT;
END;
/ /*
測試功能string_fnc
*/
declare
str string_fnc.t_array;
begin
str := string_fnc.SPLIT('milo@pll***.com;even@pll***.com', ';');
for i in 1 .. str.count loop
dbms_output.put_line(str(i));
end loop;
end;

Email發送相關的設定

 /*
add milo on 20170308
ORA-24247: network access denied by access control list (ACL) appears next to the email and it is never sent.
新增ACL,否則會出現以上的錯誤。
*/
BEGIN
-- Only uncomment the following line if ACL "network_services.xml" has already been created
DBMS_NETWORK_ACL_ADMIN.DROP_ACL('network_services.xml'); --新增名稱為network_services.xml
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
acl => 'network_services.xml',
description => 'NETWORK ACL',
principal => 'SCOTT',
is_grant => true,
privilege => 'connect'); --給SCOTT加權限
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
acl => 'network_services.xml',
principal => 'SCOTT',
is_grant => true,
privilege => 'resolve'); --將ACL與spam.****.com 25關聯起來。
DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
acl => 'network_services.xml',
host => 'spam.****.com',lower_port => 25,upper_port => 25); COMMIT; END;
/ /*給其它賬戶(PLOEC)設置權限
add milo on 20170308
*/
begin
-- Adding Connect Privilege to PLOEC
dbms_network_acl_admin.add_privilege(
acl => 'network_services.xml',
principal => 'PLOEC',
is_grant => TRUE,
privilege => 'connect'
);
-- Adding Resolve Privilege to PLOEC
dbms_network_acl_admin.add_privilege(
acl => 'network_services.xml',
principal => 'PLOEC',
is_grant => TRUE,
privilege => 'resolve'
);
commit;
end;
/ --測試是否可以訪問,不過預設的是80port
select utl_http.request('spam.****.com') from dual;
/*
發送email功能
written by milo 2017-03-08
*/
CREATE OR REPLACE PROCEDURE send_mail(p_to IN VARCHAR2,--可以多個接收人,例如 milo@pllink.com;others@pllink.com
p_from IN VARCHAR2,--發送人
p_subject IN VARCHAR2,--email主旨
p_text_msg IN VARCHAR2 DEFAULT NULL,
p_html_msg IN VARCHAR2 DEFAULT NULL,--email之HTML內容
p_smtp_host IN VARCHAR2,--伺服器網域或者IP
p_account IN VARCHAR2,--郵箱賬號
p_password IN VARCHAR2,--郵箱登錄密碼
p_smtp_port IN NUMBER DEFAULT 25) AS --預設port為25
l_mail_conn UTL_SMTP.connection;
l_boundary VARCHAR2(50) := '----=*#abc1234321cba#*=';
v_email_recipient_list string_fnc.t_array;
BEGIN
l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
--UTL_SMTP.helo(l_mail_conn, p_smtp_host);
UTL_SMTP.ehlo(l_mail_conn, p_smtp_host); --驗證用戶
UTL_SMTP.command(l_mail_conn, 'AUTH LOGIN');
--需要改用UTL_RAW.cast_to_varchar2,否則會有錯誤:ORA-29279 smtp 535 5.7.3 Authentication unsuccessful
--UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw(p_account)));
--UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw(p_password)));
UTL_SMTP.command(l_mail_conn,
UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(p_account))));
UTL_SMTP.command(l_mail_conn,
UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(p_password)))); UTL_SMTP.mail(l_mail_conn, p_from);
--將多組接收人按;拆分成Array
v_email_recipient_list := string_fnc.SPLIT(p_to, ';');
for i in 1 .. v_email_recipient_list.count loop
--dbms_output.put_line(v_email_recipient_list(i));
--分別添加收件人
UTL_SMTP.rcpt(l_mail_conn, v_email_recipient_list(i));
end loop; UTL_SMTP.open_data(l_mail_conn); UTL_SMTP.write_data(l_mail_conn,
'Date: ' ||
TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') ||
UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn,
'Subject: ' || p_subject || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn,
'Content-Type: multipart/alternative; boundary="' ||
l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf); IF p_text_msg IS NOT NULL THEN
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn,
'Content-Type: text/plain; charset="uft-8"' ||
UTL_TCP.crlf || UTL_TCP.crlf); UTL_SMTP.write_data(l_mail_conn, p_text_msg);
UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF; IF p_html_msg IS NOT NULL THEN
UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
UTL_SMTP.write_data(l_mail_conn,
'Content-Type: text/html; charset="utf-8"' ||
UTL_TCP.crlf || UTL_TCP.crlf); --UTL_SMTP.write_data(l_mail_conn, p_html_msg);
--解決中文亂碼問題
UTL_SMTP.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(UTL_TCP.CRLF || p_html_msg || UTL_TCP.CRLF)); UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
END IF; UTL_SMTP.write_data(l_mail_conn,
'--' || l_boundary || '--' || UTL_TCP.crlf);
UTL_SMTP.close_data(l_mail_conn); UTL_SMTP.quit(l_mail_conn);
END;
/
/*僅作send_mail測試*/
DECLARE
l_html VARCHAR2(32767);
BEGIN
l_html := '<html>
<head>
<title>Test HTML message</title>
</head>
<body>
<p>This is a <b>HTML</b> <i>version</i> of the test message.</p>
<p><img src="http://oracle-base.com/images/site_logo.gif" alt="Site Logo" />
</body>
</html>'; send_mail(p_to => 'shipping@***.com;even@***.com',
p_from => 'milo@***.com',
p_subject => 'Test Message',
p_text_msg => 'This is a test message.',
p_html_msg => l_html,
p_smtp_host => 'spam.***.com',
p_account => 'milo@***.com',
p_password => '***');
END;
/

更新:

a. 支援寄送人的别名显示,直接用正则分组取邮件地址,例如 "Milo Xie" <milo@pllink.com>

2017/3/14

 --UTL_SMTP.mail(l_mail_conn, p_from);
UTL_SMTP.mail(l_mail_conn, REGEXP_REPLACE(p_from, '(.*)([<])(.*)([>])', '\3'));

Oracle發送email功能的更多相关文章

  1. Oracle定時email通知

    small_program_task 這張表的資料是待發送的email通知,再次之前已經有一個job會定時掃描固定時間內未接收到小程式回報狀態將其寫入到該表,send_flag為N,表示為寄過通知.e ...

  2. Linux發送郵件

    1.直接使用shell當編輯器 [root@phburdb1 mail]# mail -s "Hello World" juncai.chen@innolux.comHello j ...

  3. .NET中通過OUTLOOK發送附件內容

    最近碰到一個發送郵件附件的問題,隨便幾下來,方便以後學習. string[] files = System.IO.Directory.GetFiles(@"~/UploadData" ...

  4. 通过.NET实现后台自动发送Email功能的代码示例

    原文:通过.NET实现后台自动发送Email功能的代码示例 通过.NET实现后台自动发送邮件功能的代码,可以将一些基础信息放到web.config文件中进行保存: Web.config文件信息段: & ...

  5. html5 服務器發送事件

    html5允許頁面獲得來自服務器的更新. 單項消息傳送: 頁面獲得服務器的更新. 以前頁面也可以獲得服務器的更新,但必須詢問服務器是否有可用的更新,而服務器發送事件是單向自動發送. 使用服務器發送事件 ...

  6. .net發送郵件

    using System; using System.Collections.Generic; using System.Linq; using System.Net.Mail; using Syst ...

  7. Oracle解决索引碎片功能

    我们开始时向一个空的带索引的表中插入大量数据后,是不会产生碎片问题的,但是,数据库经过很长一段时间的增删改查后,难免会出现碎片问题,影响数据库的性能,Oracle对于这一问题有自己的解决方案. 下面介 ...

  8. oracle的闪回功能

    ORACLE的闪回功能: navicat 执行删改语句 不用提交直接执行? 感觉很恐怖? 今天一不下心手一滑 选错 结果把数据库的字段全改了 很慌 然后发现 oracle 有一个闪回功能 专门用来补天 ...

  9. Oracle 12c 的新功能:模式匹配查询

    模式匹配SQL 在一系列的数据行中辨识出某种模式是一种广泛需求的功能,但在以前的SQL中是不可能的.有许多解决方法,但这些都很难写,很难理解,而且执行效率低下.在Oracle数据库中,从12c开始,你 ...

随机推荐

  1. 自动化装配Bean

    一.Spring装配-自动化装配 @Component和@ComponentScan 通过spring注解(@Component)来表明该类会作为组件类,并告知Spring要为这类创建bean,不过组 ...

  2. [转] FTP主动模式和被动模式的区别

    转自原文FTP主动模式和被动模式的区别 基础知识: FTP只通过TCP连接,没有用于FTP的UDP组件.FTP不同于其他服务的是它使用了两个端口, 一个数据端口和一个命令端口(或称为控制端口).通常2 ...

  3. Nginx在Windows下的使用与配置

    前往官网下载对应的windows版本 官网 下载后进入安装目录,启动命令行窗口,输入: nignx -c conf\nginx.conf 则nginx服务器已经启动. 打开浏览器,在标题栏输入: lo ...

  4. 如何在ArcMap中监听键盘鼠标事件

    昨天有个朋友想要实现一个功能,就是在ArcMap中编辑数据的时候,能够通过快捷键自动设置预定义的属性,比如,选中若干要素,按A键,就自动填充属性,按B键,则又自动填充另外的属性字段. 单就这个功能而言 ...

  5. c3p0、dbcp和proxool比较

    现在常用的开源数据连接池主要有c3p0.dbcp和proxool三种,其中: hibernate开发组推荐使用c3p0; spring开发组推荐使用dbcp(dbcp连接池有weblogic连接池同样 ...

  6. 2018/4/26 python文件处理方式

    目录 2018/4/26总结 1. 如果有一天群内问题总结: 问题:python2和python3的默认编码是什么? 2. python学习总结: python的处理文件方式 2018/4/26总结 ...

  7. java 蓝桥杯基础练习 01字串 进制转换

    问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能.它们的前几个是: 请按从小到大的顺序输出这32种01串. 输入格式 本试题没有输入. 输出格式 输出32行,按从小到大的顺 ...

  8. java算法 蓝桥杯 摆花

    问题描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  9. 安装kali linux 2017.1 【二、安装VMware-tools 以及相关问题处理】

    一.基本步骤: 1.VMware Workstation菜单栏中,选择“虚拟机”,”安装VMware Tools...“. 2.挂载VMware Tools安装程序到/mnt/cdrom/. mkdi ...

  10. 监控磁盘IO

    一.添加userparameter_io.conf配置文件 在/etc/zabbix/zabbix_agentd.d下添加userparameter_io.conf, 文件内容如下: UserPara ...