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