Oracle数据库里发邮件

背景

    最近由于kettle在同步Oracle数据的时候,时不时会有数据丢失,为了避免数据丢失的时候我们不能及时发现,领导要求在数据库里每天同步完数据之后,进行一次核对,并将核对结果通过邮件发送出来。并给出了一个Oracle发邮件的存储过程。

    那个存储过程确实写的很精妙,但是由于测试内网环境没有一个可以使用的邮箱服务器,所以最终程序没有报语法错误,就上生产了,结果生产部署的时候遇到了各种问题,不过还好都及时解决了,在此特做一个问题解决的记录。

0,发邮件功能的前置条件

a, 开发发邮件的代码

b, 具有一个可以访问DBMS、_NETWORK_ACL_ADMIN包的高权限用户

c, 用高权限用户给自己执行发邮件程序时候所用到的用户进行ACL授权

d, 网络上确保数据库所在的机器与邮箱SMTP服务器连通

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

原因:网络问题,连不上SMTP服务器

解决办法:检查SMTP服务配置是否正常,网络端口是否可正常访问,SMTP服务器是否正常服务

注:检查端口的指令

windows版:telnet ip port

Linux版:wget ip:port

或者ssh:如ssh -v -p port username@ip

-v代表打开调试模式,username可随意指定

 

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

原因:Oracle数据库端缺少对执行发邮件动作的用户进行相应的授权操作

解决办法:在Oracle里用高权限用户进行acl授权

 1 BEGIN
 2 
 3 --1.创建访问控制列表(ACL)
 4 
 5   dbms_network_acl_admin.create_acl(acl         => 'email_server_permissions.xml',
 6 
 7                                     description => 'Enables network permissions for the e-mail server',
 8 
 9                                     principal   => 'oracle_user', --授权用户,也即具体执行发邮件动作的Oracle数据库用户
10 
11                                     is_grant    => TRUE,
12 
13                                     privilege   => 'connect');
14 
15   --COMMIT;
16 
17   --2.将 ACL 与邮件服务器相关联
18 
19   dbms_network_acl_admin.assign_acl(acl        => 'email_server_permissions.xml',--每次执行该串儿脚本的时候,这里需要保持住不一致
20 
21                                     host       => '*.*.*.*', --主机名要做ip映射;SMTP服务器地址,这里要和调用的时候保持一致,我在具体实际中选用的ip,调用的时候只能用ip,用域名会报错
22 
23                                     lower_port => 25,
24 
25                                     upper_port => NULL);
26 
27   --COMMIT;
28 
29   --3.ACL 为用户授与连接邮件服务器的权限
30 
31   dbms_network_acl_admin.add_privilege(acl       => 'email_server_permissions.xml',
32 
33                                        principal => 'oracle_user', --授权用户
34 
35                                        is_grant  => TRUE,
36 
37                                        privilege => 'resolve');
38 
39   --COMMIT;
40 
41 END;

 3,PLS-00201:identifier 'XXX' must be declared

原因:执行上一步授权动作的用户不具有访问DBMS、_NETWORK_ACL_ADMIN包的权限

解决办法:找一个高权限的用户,给具体执行授权动作的用户附上该包的访问权限

grant execute on 包名 to 用户名;

注:如果不是当前用户:则调用要加名称:如ZUO.Proc

如果是当前用户:则直接调用即可:如Proc

 

4,ORA-44416: ACL无效:无法解析的主用户‘mgrdb’

原因:用户名大小写问题,acl授权的时候,用户名得大写

解决办法:在授权脚本中将用户名大写

参考链接:

https://blog.csdn.net/yuanyannan123/article/details/40182189

https://www.2cto.com/database/201404/290719.html

http://www.nazmulhuda.info/ora-44416-unresolved-principal

https://blog.csdn.net/u010678947/article/details/20702149

https://www.cnblogs.com/muhy/p/10567607.html

原文地址:https://www.cnblogs.com/hopeiscoming/p/12052342.html