Oracle 11g 环境下,利用utl_smtp创建发送邮件的存储过程

网上太多发邮件储存过程,我就不转发了,弄个简单的作为示例;

create or replace procedure Send_mail(mail_body varchar2) is
  smtp_conn  utl_smtp.connection;
  user_name  varchar2(20) := utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('[email protected]')));
  user_paswd varchar2(20) := utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw('password')));
  lv_mail_header varchar2(200):='From:[email protected]'||utl_tcp.CRLF||
                                'To:[email protected]'||utl_tcp.CRLF||
                                'Subject:Oracle数据库'||utl_tcp.CRLF;
  lv_mail_content varchar2(2000);
begin
  lv_mail_content := utl_tcp.CRLF||mail_body;  

  smtp_conn := utl_smtp.open_connection('smtp.email.com',25);
  utl_smtp.helo(smtp_conn,'smtp.email.com');
  utl_smtp.command(smtp_conn,'AUTH LOGIN');
  utl_smtp.command(smtp_conn,user_name); --邮件用户名
  utl_smtp.command(smtp_conn,user_paswd); --邮件密码
  utl_smtp.mail(smtp_conn,'<[email protected]>'); --发件人邮箱
  utl_smtp.rcpt(smtp_conn,'<[email protected]>'); --收件人邮箱
  utl_smtp.open_data(smtp_conn);
  utl_smtp.write_data(smtp_conn,utl_raw.cast_to_raw(lv_mail_header));
  utl_smtp.write_raw_data(smtp_conn,utl_raw.cast_to_raw(lv_mail_content));
  utl_smtp.close_data(smtp_conn);
  utl_smtp.quit(smtp_conn);
exception
  when others then
    utl_smtp.quit(smtp_conn);
end Send_mail;
/

--储存过程已创建

第二步直接测试函数;

begin
  send_mail('测试内容');
end;
/

ORA-29278: SMTP 临时性错误: 421 Service not available
ORA-06512: 在 "SYS.UTL_SMTP", line 21
ORA-06512: 在 "SYS.UTL_SMTP", line 97
ORA-06512: 在 "SYS.UTL_SMTP", line 139
ORA-06512: 在 "SYS.UTL_MAIL", line 405
ORA-06512: 在 "SYS.UTL_MAIL", line 594
ORA-06512: 在 line 2

话说我第一次看到这个错误非常震惊,因为整个邮件发送的存储过程是先用PL/SQL直接测试代码后,再封装到存储过程中的,后来经过搜索才知道为了更细致地控制网络权限,Oracle 11g中针对UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR的访问设置了单独的权限访问控制方式(ACL).

OK,第三步,设置ACL;

--ACL第一步,创建
BEGIN
        dbms_network_acl_admin.create_acl(acl         => 'httprequestpermission.xml',  --文件名,可以任意取名
                                          DESCRIPTION => 'Normal Access',
                                          principal   => 'CONNECT',  --角色
                                          is_grant    => TRUE,
                                          PRIVILEGE   => 'connect',
                                          start_date  => NULL,
                                          end_date    => NULL);
END;
/

commit; --必须要提交;

然后检查是否创建了该 ACL控制文件;

SQL> SELECT any_path FROM resource_view WHERE any_path like '/sys/acls/%.xml';

如果列表里出现刚才创建的文件httprequestpermission.xml,请继续ACL第二步

--ACL第二步,授权用户(示例用scott作为测试)
begin
        dbms_network_acl_admin.add_privilege(acl        => 'httprequestpermission.xml',
                                             principal  => 'SCOTT',  --用户,请按照实际变更
                                             is_grant   => TRUE,
                                             privilege  => 'connect',
                                             start_date => null,
                                             end_date   => null);
end;
/
--ACL第三步,添加主机或域名
    begin
        dbms_network_acl_admin.assign_acl(acl        => 'httprequestpermission.xml',
                                          host       => 'www.baidu.com',  --http网页地址
                                          lower_port => 80,  --http端口
                                          upper_port => NULL);
    end;
/

commit;

    begin
        dbms_network_acl_admin.assign_acl(acl        => 'httprequestpermission.xml',
                                          host       => 'smtp.sina.com.cn',  --smtp服务器地址
                                          lower_port => 25,  --smtp端口
                                          upper_port => NULL);
    end;
/
commit;

最后就是再次测试存储过程

SQL> begin
  2    send_mail(mail_body => 'afafagaga');
  3  end;
  4  /

PL/SQL procedure successfully completed

没有任何错误,邮件正确收到;(本文测试环境:Oracle 11.2.0.0,OS:Windows 2008 Server)

(作者测试过程中曾遇到过

ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝;

ORA-29278: SMTP 临时性错误: 421 Service not available;

ORA-44416: ACL 无效: 无法解析的主用户 ‘AGENT‘

这三个主要错误,按照上述步骤均能解决这些问题)

Oracle 11g 环境下,利用utl_smtp创建发送邮件的存储过程

时间: 2024-12-28 15:49:16

Oracle 11g 环境下,利用utl_smtp创建发送邮件的存储过程的相关文章

Oracle RAC环境下如何更新patch(Rolling Patch)

Oracle RAC数据库环境与单实例数据库环境有很多共性,也有很多异性.对于数据库补丁的更新同样如此,都可以通过opatch来完成.但RAC环境的补丁更新有几种不同的更新方式,甚至于可以在零停机的情况下对所有节点实现滚动升级.本文主要是转述了Doc 244241.1,描述RAC环境下的patch更新方式以及在不同的情形下选择何种更新方式. 1.RAC patch的几种方式 OPatch supports 3 different patch methods on a RAC environmen

Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效

崔华老师的文章!!! 这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load Balancing.Connect Time Connection Failover 和 Runtime Connection Failover,以及里面所涉及到的 TAF.ONS.FCF.FAN.LBA 等诸多知识点.本文主要是针对 Oracle RAC 11gR2 环境下的连接管理,但同时也会对

域环境下利用组策略实现统一管理

域环境下利用组策略实现统一管理 1)   组策略配置 准备工作: 域控---新建---组织单位 Network 添加账户hansongwei 新建组策略对象 注:win 2003与win 2008 的区别 Win 2003[管理工具][Directory Active 用户和计算机]选择整个域或者某个组织单位,右键单击,[属性]---[组策略] Win2008  [管理工具][组策略管理] 本实例以win 2003为例 新建---组策略对象 networkGPO 编辑 networkGPO 做相

JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误

问题一:出现控制台坏的响应错误一Bad request 控制台出现错误如下: Bad Request request: http://hostIP:8983/solr/update?wt=javabin&version=1 解决方法: 出现以上错误的原因是,solr服务器上配置的Field和javabean提交的Field不能对应, 导致solr服务器找不到域,拒绝访问. 打开SOLR_HOME下的conf文件夹找到schema.xml文件,在其中添加对应的域. 例如以下代码添加了:title,

Windows环境下利用github快速配置git环境

在windows环境下利用github客户端我们可以直接拥有可视化的界面来管理工程,当然你也可以选择你喜欢的命令行工具来做.今天我分享一个比较快速的方式来配置git环境. 先去下载github的windows客户端:https://windows.github.com/ 下载完安装后其实就搞定了一大半了.接下来我们把: C:\Users\[你的用户名]\AppData\Local\GitHub\PortableGit_c2ba306e一大串数字\bin C:\Users\[你的用户名]\AppD

Oracle RAC环境下配置statspack

Statspack是Oracle 9i时代的产物,对于监控与分析数据库性能有着跨里程碑的意义,是AWR的前身.在Oracle 10g后AWR取代了statspack.尽管如此,awr异常或者需要调试包license的情况下statpack依旧是不错的选择.然而在RAC环境中,statspack并不支持,需要单独的进行配置以及使用job来进行管理.本文描述的则是通过在RAC环境下创建service,以及job来达到各节点同时产生snapshot的效果. 一.演示环境 suse11a:oracle:

Oracle 11g新特性延迟段创建和truncate的增强

下面测试Oracle 11g开始的新特性truncate的增强和延迟段空间创建. Oracle从11g开始,当用户创建一张空表的时候不会先分配段和空间,只有当对这张表插入第一行数据的时候才分配段和空间. 这就解决了有很多表是空的但是占用大量的磁盘空间.   测试11g延迟段创建和truncate 用户下有一张新表 SQL> select * from tab; TNAME TABTYPE CLUSTERID ------------------------------ ------- -----

Oracle RAC环境下的应用连续性

传统企业比如银行业和电信业的数据库大多采用oracle rac+dataguard的高可用架构,在rac项目实施过程中,由于业务连续性的苛刻要求,高可用的实施和测试工作显得尤为重要. oracle在新版本12cR2的rac官方文档里单独列了一章叫Ensuring application Continuity,重视程度可见一斑.在以前的oracle10g以及11g的版本中,client为实现RAC failover(故障转移)特性,各类应用app以及db需要作各种配置调整工作,随着oracle的1

Oracle 11g 新特性:自动创建分区(Interval Partition)

分区(Partition)一直是Oracle数据库引以为傲的一项技术,正是分区的存在让Oracle高效的处理海量数据成为可能,在Oracle 11g中,分区技术在易用性和可扩展性上再次得到了增强.在10g的Oracle版本中,要对分区表做调整,尤其是对RANGE分区添加新的分区都需要DBA手动定期添加,或都使用存储过程进行管理.在11G的版本中的Interval Partition不再需要DBA去干预新分区的添加,Oracle会自动去执行这样的操作,减少了DBA的工作量.Interval Par