文章目录

  • oracle通过UTL_SMTP包发送邮件
    • 存储过程代码
    • 数据库服务器配置
    • 常见异常
      • 异常1-ORA-29278

oracle通过UTL_SMTP包发送邮件

Oracle的UTL_SMTP包可以实现邮件发送功能,需要高权限用户编译出来的才能运行

所需条件:

  • SMTP服务器地址
  • 登录SMTP服务器的用户名
  • 登录SMTP服务器的密码

存储过程代码

CREATE OR REPLACE PROCEDURE send_mail(p_recipient VARCHAR2, -- 邮件接收人p_subject   VARCHAR2, -- 邮件标题p_message   VARCHAR2  -- 邮件正文)IS--下面四个变量请根据实际邮件服务器进行赋值v_mailhost  VARCHAR2(30) := 'mail.xxxx.net';    --SMTP服务器地址v_user      VARCHAR2(30) := 'user@xxxx.net';    --登录SMTP服务器的用户名v_pass      VARCHAR2(20) := '******';           --登录SMTP服务器的密码v_sender    VARCHAR2(50) := 'user@xxxx.net';    --发送者邮箱,一般与 v_user 对应v_conn  UTL_SMTP.connection ; --到邮件服务器的连接v_msg varchar2(4000);  --邮件内容BEGINv_conn := UTL_SMTP.open_connection(v_mailhost, 25);-- 登录smtp服务器,use端口UTL_SMTP.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo() 函数--否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.UTL_SMTP.command(v_conn, 'AUTH LOGIN' );   -- smtp服务器登录校验UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));UTL_SMTP.mail(v_conn, '<'|| v_sender ||'>');     --设置发件人UTL_SMTP.rcpt(v_conn, '<'||p_recipient||'>');  --设置收件人-- 解决: utl_smtp.mail和utl_smtp.rcpt发送和接收的地址前后需要加上'<'和'>'  否则会报 ORA-29279: SMTP 永久性错误: 550 Invalid User-- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行v_msg := 'Date:' || TO_CHAR(SYSDATE, 'dd mon yy hh24:mi:ss' )|| UTL_TCP.CRLF || 'From: ' || '<' || v_sender || '>'|| UTL_TCP.CRLF || 'To: ' || '<' || p_recipient || '>'|| UTL_TCP.CRLF || 'Subject: ' || p_subject|| UTL_TCP.CRLF || UTL_TCP.CRLF  -- 这前面是报头信息|| p_message;    -- 这个是邮件正文UTL_SMTP.open_data(v_conn); --打开流UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --这样写标题和内容都能用中文UTL_SMTP.close_data(v_conn); --关闭流UTL_SMTP.quit(v_conn); --关闭连接EXCEPTIONWHEN OTHERS THENDBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);END send_mail;

数据库服务器配置

按上面的配置好并创建好存储过程之后,还需要配置一下Oracle的访问控制列表并和邮件服务器关联


--1.创建访问控制列表(aclemail_server_permissions),
begindbms_network_acl_admin.create_acl (acl          => 'email_server_permissions.xml', description  => 'Enables network permissions for the e-mail server',principal    => 'ICG',    -- 配置下使用的数据库用户is_grant     => true, privilege    => 'connect');
end;--1.1. 若已存在,可先删除再新建
begin dbms_network_acl_admin.drop_acl(acl => 'email_server_permissions.xml');
end;--2. 将此 acl 与邮件服务器相关联,
begin
dbms_network_acl_admin.assign_acl (acl         => 'email_server_permissions.xml',host        => 'mail.icgear.net', --smtp服务器地址lower_port  => 465,upper_port  => 465);commit;
end;--3.创建访问控制列表(acl)network_services,
begindbms_network_acl_admin.create_acl (acl          => 'network_services.xml', description  => 'Enables network permissions for the e-mail server',principal    => 'ICG',  -- 配置下使用的数据库用户is_grant     => true, privilege    => 'connect');
end;--3.1. 若已存在,可先删除再新建
begin dbms_network_acl_admin.drop_acl(acl => 'network_services.xml');
end;--4. 将此 acl 与邮件服务器相关联,
begin
dbms_network_acl_admin.assign_acl (acl         => 'network_services.xml',host        => 'mail.icgear.net', --smtp服务器地址lower_port  => null,upper_port  => null);commit;
end;--上面4个配置完成后可以查一下是否都能查到
select host, lower_port, upper_port, acl from dba_network_acls;select acl,principal,privilege,is_grant,to_char(start_date, 'DD-MON-YYYY') as start_date,to_char(end_date, 'DD-MON-YYYY') as end_date
from dba_network_acl_privileges;

正常情况下,数据库服务器配置好之后即可发送邮件了

   call send_mail('xxx@xxxx.net','test','邮件测试');

常见异常

如果上述配置完成后还是不可以正常发送邮件

异常1-ORA-29278

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

解决方法:

  1. 检查SMTP服务器地址填写是否正确
  2. 检查防火墙是否有禁用【25】【465】等邮件发送相关端口
  3. 如果是服务器,有些服务器可能没配置上网功能,检查DNS等网络配置是否正常

本文来源:https://blog.csdn.net/Huay_Li/article/details/84423734

oracle通过UTL_SMTP包发送邮件相关推荐

  1. Oracle 利用 UTL_SMTP 包发送邮件

    是这样子,上周末的时候逛了下itpub,看到个挺好玩的东西,通过Oracle的UTL_SMTP包的功能,用定时任务检查数据库状态并发送邮件,因为之前没用过这个包,不知道还有这么好玩的功能,特记录分享一 ...

  2. oracle utl_smtp,Oracle实时通信:UTL_SMTP包详解

    建站学院(LieHuo.Net)文档由于Oracle不提供用于实时输出消息的工具,Oracle数据库开发者总是要面临实时监视他们的储备过程执行的挑战.他们必须使用dbms_output.put_lin ...

  3. 使用UTL_SMTP包发送邮件

    最近想在Oracle中设置一个触发器,每天执行数据检测脚本之后,如果发现错误数据就自动发送邮件到我邮箱里,于是研究了一下在Oracle中发送邮件的方法.据说10g里可以使用UTL_MAIL包来简单得发 ...

  4. oracle强大的包,ORACLE 程序包

    程序包由PL/SQL程序元素(变量,类型)和匿名PL/SQL(游标),命名PL/SQL 块(存储过程和函数)组成. 程序包可以被整体加载到内存中,这样可以大大加快程序包中任何一个组成部分的访问速度. ...

  5. oracle jdbc jar包_Oracle总结之plsql编程(基础七)

    紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 一.plsql块 1.只包括执行部分的plsql块 打开输出选项 ...

  6. Maven:导入Oracle的jar包时出现错误

    QUESTION:Maven:导入Oracle的jar包时出现错误 目录 QUESTION:Maven:导入Oracle的jar包时出现错误 ANSWER: 一:问题分析 二:解决方案 ANSWER: ...

  7. Oracle dbms_random随机函数包

    Oracle dbms_random随机函数包 dbms_random是oracle提供的一个随机函数包,以下是它的一些常用的功能: 1.dbms_random.value 作用:生成一个大于等于0, ...

  8. 检查oracle安装必须包,Linux安装oracle11gR2官方步骤

    Linux环境下安装Oracle11gR2 下载安装介质 检查Linux环境 检查系统位数 uname -m1 检查内存(两条命令都可以) grep MemTotal /proc/meminfo fr ...

  9. 解决maven加载不了oracle jdbc驱动包的问题

    由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 手动添加到本地仓库需要本地有 ...

最新文章

  1. 使用Python,OpenCV和Hough圆检测图像中的圆
  2. spring 中读取properties 文件
  3. jquery 验证小数点后几位_利用jquery实现验证输入的是否是数字、小数,包含保留几位小数...
  4. 库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例
  5. java_IO总结(一)
  6. Servlet—简单的管理系统
  7. FPGA经典设计:再读正点原子SDRAM控制器
  8. GAN的量化评估方法——IS和FID,及其pytorch代码
  9. 注册gitLab时报错There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.
  10. linux扩充home目录,扩大/home目录的空间(转)
  11. 【Matlab系列】Matlab信号添加噪声及信噪比SNR的计算
  12. 房租客手机端个人中心html页面
  13. android源码结构分析
  14. 快速扫盲 | 霍尔传感器的工作原理
  15. 3GPP TS 23501-g51 中英文对照 | 4.3.2 Roaming architecture
  16. 虚拟机VMware安装Ubuntu
  17. linux卸载mysql(完全卸载)
  18. 设备管理器设置了不允许鼠标唤醒电脑,但是鼠标还是会唤醒电脑的解决方法
  19. window10下安装Elasticsearch(es)和IK分词器
  20. 数据结构 堆 heap

热门文章

  1. java计算机毕业设计四川旅游网站源码+系统+数据库+lw文档+mybatis+运行部署
  2. spider test
  3. 快速提取过火区域,卫星影像评估西昌山火方法初探
  4. 计算机语言输入法,输入法不见了如何解决
  5. Tableau13——雷达图,凹凸图
  6. SpringBoot模拟数据库开发
  7. 弹窗代码大全window.open
  8. 2021ICPC欧洲东南部区域赛题解ACFGJKLN
  9. Android 调用相机拍照,适配到Android 10,2021必看
  10. 用DIV+CSS技术设计的西安旅游网站18页(web前端网页制作课作业)HTML+CSS旅游网站设计与实现