oracle通过UTL_SMTP包发送邮件
文章目录
- 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
解决方法:
- 检查SMTP服务器地址填写是否正确
- 检查防火墙是否有禁用【25】【465】等邮件发送相关端口
- 如果是服务器,有些服务器可能没配置上网功能,检查DNS等网络配置是否正常
本文来源:https://blog.csdn.net/Huay_Li/article/details/84423734
oracle通过UTL_SMTP包发送邮件相关推荐
- Oracle 利用 UTL_SMTP 包发送邮件
是这样子,上周末的时候逛了下itpub,看到个挺好玩的东西,通过Oracle的UTL_SMTP包的功能,用定时任务检查数据库状态并发送邮件,因为之前没用过这个包,不知道还有这么好玩的功能,特记录分享一 ...
- oracle utl_smtp,Oracle实时通信:UTL_SMTP包详解
建站学院(LieHuo.Net)文档由于Oracle不提供用于实时输出消息的工具,Oracle数据库开发者总是要面临实时监视他们的储备过程执行的挑战.他们必须使用dbms_output.put_lin ...
- 使用UTL_SMTP包发送邮件
最近想在Oracle中设置一个触发器,每天执行数据检测脚本之后,如果发现错误数据就自动发送邮件到我邮箱里,于是研究了一下在Oracle中发送邮件的方法.据说10g里可以使用UTL_MAIL包来简单得发 ...
- oracle强大的包,ORACLE 程序包
程序包由PL/SQL程序元素(变量,类型)和匿名PL/SQL(游标),命名PL/SQL 块(存储过程和函数)组成. 程序包可以被整体加载到内存中,这样可以大大加快程序包中任何一个组成部分的访问速度. ...
- oracle jdbc jar包_Oracle总结之plsql编程(基础七)
紧接基础六,对oracle角色和权限的管理之后,在接下来的几次总结中来就最近工作中用过的plsql编程方面的知识进行总结,和大家分享! 一.plsql块 1.只包括执行部分的plsql块 打开输出选项 ...
- Maven:导入Oracle的jar包时出现错误
QUESTION:Maven:导入Oracle的jar包时出现错误 目录 QUESTION:Maven:导入Oracle的jar包时出现错误 ANSWER: 一:问题分析 二:解决方案 ANSWER: ...
- Oracle dbms_random随机函数包
Oracle dbms_random随机函数包 dbms_random是oracle提供的一个随机函数包,以下是它的一些常用的功能: 1.dbms_random.value 作用:生成一个大于等于0, ...
- 检查oracle安装必须包,Linux安装oracle11gR2官方步骤
Linux环境下安装Oracle11gR2 下载安装介质 检查Linux环境 检查系统位数 uname -m1 检查内存(两条命令都可以) grep MemTotal /proc/meminfo fr ...
- 解决maven加载不了oracle jdbc驱动包的问题
由于Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到本地仓库. 手动添加到本地仓库需要本地有 ...
最新文章
- 使用Python,OpenCV和Hough圆检测图像中的圆
- spring 中读取properties 文件
- jquery 验证小数点后几位_利用jquery实现验证输入的是否是数字、小数,包含保留几位小数...
- 库卡机器人是s7编程_「西门子1200PLC教程」19.S7-1200入门实例
- java_IO总结(一)
- Servlet—简单的管理系统
- FPGA经典设计:再读正点原子SDRAM控制器
- GAN的量化评估方法——IS和FID,及其pytorch代码
- 注册gitLab时报错There was an error with the reCAPTCHA. Please solve the reCAPTCHA again.
- linux扩充home目录,扩大/home目录的空间(转)
- 【Matlab系列】Matlab信号添加噪声及信噪比SNR的计算
- 房租客手机端个人中心html页面
- android源码结构分析
- 快速扫盲 | 霍尔传感器的工作原理
- 3GPP TS 23501-g51 中英文对照 | 4.3.2 Roaming architecture
- 虚拟机VMware安装Ubuntu
- linux卸载mysql(完全卸载)
- 设备管理器设置了不允许鼠标唤醒电脑,但是鼠标还是会唤醒电脑的解决方法
- window10下安装Elasticsearch(es)和IK分词器
- 数据结构 堆 heap
热门文章
- java计算机毕业设计四川旅游网站源码+系统+数据库+lw文档+mybatis+运行部署
- spider test
- 快速提取过火区域,卫星影像评估西昌山火方法初探
- 计算机语言输入法,输入法不见了如何解决
- Tableau13——雷达图,凹凸图
- SpringBoot模拟数据库开发
- 弹窗代码大全window.open
- 2021ICPC欧洲东南部区域赛题解ACFGJKLN
- Android 调用相机拍照,适配到Android 10,2021必看
- 用DIV+CSS技术设计的西安旅游网站18页(web前端网页制作课作业)HTML+CSS旅游网站设计与实现