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

split功能

  1. /*創建package STRING_FNC
  2. add by milo 20170308*/
  3. CREATE OR REPLACE PACKAGE STRING_FNC IS
  4. TYPE t_array IS TABLE OF VARCHAR2(500) INDEX BY BINARY_INTEGER;
  5. FUNCTION SPLIT(p_in_string VARCHAR2, p_delim VARCHAR2) RETURN t_array;
  6. END;
  7.  
  8. /*創建package body STRING_FNC
  9. add by milo 20170308*/
  10. CREATE OR REPLACE PACKAGE BODY STRING_FNC IS
  11. FUNCTION SPLIT(p_in_string VARCHAR2, p_delim VARCHAR2) RETURN t_array IS
  12. i number := 0;
  13. pos number := 0;
  14. lv_str varchar2(500) := p_in_string;
  15. strings t_array;
  16. BEGIN
  17. -- determine first chuck of string
  18. pos := instr(lv_str, p_delim, 1, 1);
  19.  
  20. --如果沒有拆分符號,則array第一個為p_in_string
  21. if pos = 0 then
  22. strings(1) := lv_str;
  23. RETURN strings;
  24. end if;
  25.  
  26. -- while there are chunks left, loop
  27. WHILE (pos != 0) LOOP
  28. -- increment counter
  29. i := i + 1;
  30. -- create array element for chuck of string
  31. strings(i) := substr(lv_str, 1, pos - 1);
  32. -- remove chunk from string
  33. lv_str := substr(lv_str, pos + 1, length(lv_str));
  34. -- determine next chunk
  35. pos := instr(lv_str, p_delim, 1, 1);
  36. -- no last chunk, add to array
  37. IF pos = 0 THEN
  38. strings(i + 1) := lv_str;
  39. END IF;
  40. END LOOP;
  41. -- return array
  42. RETURN strings;
  43. END SPLIT;
  44. END;
  45. /
  46.  
  47. /*
  48. 測試功能string_fnc
  49. */
  50. declare
  51. str string_fnc.t_array;
  52. begin
  53. str := string_fnc.SPLIT('milo@pll***.com;even@pll***.com', ';');
  54. for i in 1 .. str.count loop
  55. dbms_output.put_line(str(i));
  56. end loop;
  57. end;

Email發送相關的設定

  1. /*
  2. add milo on 20170308
  3. ORA-24247: network access denied by access control list (ACL) appears next to the email and it is never sent.
  4. 新增ACL,否則會出現以上的錯誤。
  5. */
  6. BEGIN
  7. -- Only uncomment the following line if ACL "network_services.xml" has already been created
  8. DBMS_NETWORK_ACL_ADMIN.DROP_ACL('network_services.xml');
  9.  
  10. --新增名稱為network_services.xml
  11. DBMS_NETWORK_ACL_ADMIN.CREATE_ACL(
  12. acl => 'network_services.xml',
  13. description => 'NETWORK ACL',
  14. principal => 'SCOTT',
  15. is_grant => true,
  16. privilege => 'connect');
  17.  
  18. --給SCOTT加權限
  19. DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
  20. acl => 'network_services.xml',
  21. principal => 'SCOTT',
  22. is_grant => true,
  23. privilege => 'resolve');
  24.  
  25. --將ACLspam.****.com 25關聯起來。
  26. DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
  27. acl => 'network_services.xml',
  28. host => 'spam.****.com',lower_port => 25,upper_port => 25);
  29.  
  30. COMMIT;
  31.  
  32. END;
  33. /
  34.  
  35. /*給其它賬戶(PLOEC)設置權限
  36. add milo on 20170308
  37. */
  38. begin
  39. -- Adding Connect Privilege to PLOEC
  40. dbms_network_acl_admin.add_privilege(
  41. acl => 'network_services.xml',
  42. principal => 'PLOEC',
  43. is_grant => TRUE,
  44. privilege => 'connect'
  45. );
  46. -- Adding Resolve Privilege to PLOEC
  47. dbms_network_acl_admin.add_privilege(
  48. acl => 'network_services.xml',
  49. principal => 'PLOEC',
  50. is_grant => TRUE,
  51. privilege => 'resolve'
  52. );
  53. commit;
  54. end;
  55. /
  56.  
  57. --測試是否可以訪問,不過預設的是80port
  58. select utl_http.request('spam.****.com') from dual;
  1. /*
  2. 發送email功能
  3. written by milo 2017-03-08
  4. */
  5. CREATE OR REPLACE PROCEDURE send_mail(p_to IN VARCHAR2,--可以多個接收人,例如 milo@pllink.com;others@pllink.com
  6. p_from IN VARCHAR2,--發送人
  7. p_subject IN VARCHAR2,--email主旨
  8. p_text_msg IN VARCHAR2 DEFAULT NULL,
  9. p_html_msg IN VARCHAR2 DEFAULT NULL,--emailHTML內容
  10. p_smtp_host IN VARCHAR2,--伺服器網域或者IP
  11. p_account IN VARCHAR2,--郵箱賬號
  12. p_password IN VARCHAR2,--郵箱登錄密碼
  13. p_smtp_port IN NUMBER DEFAULT 25) AS --預設port25
  14. l_mail_conn UTL_SMTP.connection;
  15. l_boundary VARCHAR2(50) := '----=*#abc1234321cba#*=';
  16. v_email_recipient_list string_fnc.t_array;
  17. BEGIN
  18. l_mail_conn := UTL_SMTP.open_connection(p_smtp_host, p_smtp_port);
  19. --UTL_SMTP.helo(l_mail_conn, p_smtp_host);
  20. UTL_SMTP.ehlo(l_mail_conn, p_smtp_host);
  21.  
  22. --驗證用戶
  23. UTL_SMTP.command(l_mail_conn, 'AUTH LOGIN');
  24. --需要改用UTL_RAW.cast_to_varchar2,否則會有錯誤:ORA-29279 smtp 535 5.7.3 Authentication unsuccessful
  25. --UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw(p_account)));
  26. --UTL_SMTP.command(l_mail_conn,utl_encode.base64_encode(utl_raw.cast_to_raw(p_password)));
  27. UTL_SMTP.command(l_mail_conn,
  28. UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(p_account))));
  29. UTL_SMTP.command(l_mail_conn,
  30. UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(p_password))));
  31.  
  32. UTL_SMTP.mail(l_mail_conn, p_from);
  33. --將多組接收人按;拆分成Array
  34. v_email_recipient_list := string_fnc.SPLIT(p_to, ';');
  35. for i in 1 .. v_email_recipient_list.count loop
  36. --dbms_output.put_line(v_email_recipient_list(i));
  37. --分別添加收件人
  38. UTL_SMTP.rcpt(l_mail_conn, v_email_recipient_list(i));
  39. end loop;
  40.  
  41. UTL_SMTP.open_data(l_mail_conn);
  42.  
  43. UTL_SMTP.write_data(l_mail_conn,
  44. 'Date: ' ||
  45. TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') ||
  46. UTL_TCP.crlf);
  47. UTL_SMTP.write_data(l_mail_conn, 'To: ' || p_to || UTL_TCP.crlf);
  48. UTL_SMTP.write_data(l_mail_conn, 'From: ' || p_from || UTL_TCP.crlf);
  49. UTL_SMTP.write_data(l_mail_conn,
  50. 'Subject: ' || p_subject || UTL_TCP.crlf);
  51. UTL_SMTP.write_data(l_mail_conn, 'Reply-To: ' || p_from || UTL_TCP.crlf);
  52. UTL_SMTP.write_data(l_mail_conn, 'MIME-Version: 1.0' || UTL_TCP.crlf);
  53. UTL_SMTP.write_data(l_mail_conn,
  54. 'Content-Type: multipart/alternative; boundary="' ||
  55. l_boundary || '"' || UTL_TCP.crlf || UTL_TCP.crlf);
  56.  
  57. IF p_text_msg IS NOT NULL THEN
  58. UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
  59. UTL_SMTP.write_data(l_mail_conn,
  60. 'Content-Type: text/plain; charset="uft-8"' ||
  61. UTL_TCP.crlf || UTL_TCP.crlf);
  62.  
  63. UTL_SMTP.write_data(l_mail_conn, p_text_msg);
  64. UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
  65. END IF;
  66.  
  67. IF p_html_msg IS NOT NULL THEN
  68. UTL_SMTP.write_data(l_mail_conn, '--' || l_boundary || UTL_TCP.crlf);
  69. UTL_SMTP.write_data(l_mail_conn,
  70. 'Content-Type: text/html; charset="utf-8"' ||
  71. UTL_TCP.crlf || UTL_TCP.crlf);
  72.  
  73. --UTL_SMTP.write_data(l_mail_conn, p_html_msg);
  74. --解決中文亂碼問題
  75. UTL_SMTP.write_raw_data(l_mail_conn, utl_raw.cast_to_raw(UTL_TCP.CRLF || p_html_msg || UTL_TCP.CRLF));
  76.  
  77. UTL_SMTP.write_data(l_mail_conn, UTL_TCP.crlf || UTL_TCP.crlf);
  78. END IF;
  79.  
  80. UTL_SMTP.write_data(l_mail_conn,
  81. '--' || l_boundary || '--' || UTL_TCP.crlf);
  82. UTL_SMTP.close_data(l_mail_conn);
  83.  
  84. UTL_SMTP.quit(l_mail_conn);
  85. END;
  86. /
  1. /*僅作send_mail測試*/
  2. DECLARE
  3. l_html VARCHAR2(32767);
  4. BEGIN
  5. l_html := '<html>
  6. <head>
  7. <title>Test HTML message</title>
  8. </head>
  9. <body>
  10. <p>This is a <b>HTML</b> <i>version</i> of the test message.</p>
  11. <p><img src="http://oracle-base.com/images/site_logo.gif" alt="Site Logo" />
  12. </body>
  13. </html>';
  14.  
  15. send_mail(p_to => 'shipping@***.com;even@***.com',
  16. p_from => 'milo@***.com',
  17. p_subject => 'Test Message',
  18. p_text_msg => 'This is a test message.',
  19. p_html_msg => l_html,
  20. p_smtp_host => 'spam.***.com',
  21. p_account => 'milo@***.com',
  22. p_password => '***');
  23. END;
  24. /

更新:

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

2017/3/14

  1. --UTL_SMTP.mail(l_mail_conn, p_from);
  2. 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. Spring MVC起步

    1.1跟踪Spring MVC的请求 每当用户在Web浏览器中点击链接或提交表单的时候,请求就开始工作了.对请求的工作描述就像是快递投送员.与邮局投递员或FedEx投送员一样,请求会将信息从一个地方带 ...

  2. sql之分段统计

    sql之分段统计 需求:获取一个县所有家庭人数在1-2人,3-4人,5-6人,6人以上的家庭数的数组 思路:通过CASE WHEN 将 CBFCYSL分组,然后统计数据条数. 语句: SELECT T ...

  3. 用python3判断一个字符串 包含 中文

    在python中一个汉字算一个字符,一个英文字母算一个字符 用 ord() 函数判断单个字符的unicode编码是否大于255即可. s = '我xx们的88工作和生rr活168' n = 0 for ...

  4. JDK动态代理,此次之后,永生难忘

    出自:http://www.cnblogs.com/dreamroute/p/5273888.html#3839242 首先感谢"神一样的存在"的文章! 动态代理,这个词在Java ...

  5. EXPLAIN sql优化方法(2) Using temporary ; Using filesort

    优化GROUP BY语句   默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序.这与在查询中指定ORDER BY col1,col2...类似.因此,如果显式包括一 ...

  6. Django restframework Token拥有不过期的认证

    REST框架中的Token认证不像Session认证一样,它是没有办法设置过期时间的,但是有时我们需要对Token做过期验证,比如说用户在A设备登陆之后获取一个Token,如果用户在没有清空浏览器缓存 ...

  7. 什么是web资源????

    所谓 web 资源即放在 Internet 网上供外界访问的文件或程序,又根据它们呈现的效果及原理不同,将它们划分为静态资源和动态资源. 1. 什么是静态资源 静态资源是浏览器能够直接打开的,一个 j ...

  8. node模块示例

    来源于慕课网课程:http://www.imooc.com/video/6701 (视频) 模块的流程图如下: 做一个学校的模块示例 建一个学生的js studet.js function add(s ...

  9. centos7 yum 安装 mysql

    CentOS7默认数据库是mariadb,配置等用着不习惯,因此决定改成mysql,但是CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1 ...

  10. 让tomcat自动定位到项目

    在servelt.xml中添加粗体部分. <Host name="localhost" appBase="webapps" unpackWARs=&quo ...