- 浏览: 884528 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1096)
- 大数据存储 (76)
- 编程语言(Java&Scala) (46)
- 大数据建模 (33)
- 开发与管理 (8)
- 操作系统 (13)
- 实用代码集合 (25)
- 新技术研究 (15)
- 前端技术研究 (22)
- 物联网 (18)
- 兴趣探索 (15)
- 编程语言(Groovy&Grails) (92)
- 编程语言(RubyOnRails) (153)
- 个人收藏 (153)
- 技术管理 (12)
- 编程语言(Flex) (8)
- 架构和框架(GWT) (4)
- 数学和算法 (6)
- 人工智能(TensorFlow) (11)
- 编程语言(Python) (6)
- 移动开发 (4)
- 软件工程实践 (54)
- 个人感悟 (6)
- 职场感悟 (5)
- 行业经验 (23)
- 产品和运营 (10)
- 生活与随想 (155)
- 简单生活 (70)
- 天空的云 (53)
- 秋月春风 (14)
- 东逝水 (59)
- 浪花淘 (35)
- 白发渔樵 (4)
最新评论
-
cljhyjs:
今天看看在研究,已经安装好了,请问怎么一步一步使用呢?
Thingsboard -
yx200404:
说一下十维空间 -
Clear_Love:
设置了也报错
Xcode 7遇到 App Transport Security has blocked a cleartext HTTP 错误 -
wang263574375:
我想问的是,如果防火墙的设置不能改变,那么要怎么处理呢?
ORA-12571:TNS包写入程序失败 -
ralflsb:
SmartSVN 8.6
SmartSVN破解包
在 Oracle 的存储过程执行中,我们可能希望它本身能完成邮件发送执行的结果,特别是在捕获到了异常时。不能总是依赖于调用存储过程的外部程序--调用后,根据出口参 数,发送执行结果。这一需求更迫切的表现在非人工参与的 Oracle Job 调用存储过程的情况下。
所幸,Oracle 为我们提供了发送邮件的工具包 UTL_SMTP,它最早出现在 Oracle 8.1.7 版本中。下面是我从网络上搜索相关资料后、综合整理、多处修正、数次调试、排除万难而写出的一个发送邮件的存储过程。可支持需用户验证的邮件服务器,中文 标题和中文内容无乱码,只还未支持附件的发送,相信这方面应用较少,需要的话再 Google 一下,且文后参考中有相应的链接。
view source
< id="highlighter_863820_clipboard" title="copy to clipboard" type="application/x-shockwave-flash" width="16" height="16" src="http://www.blogjava.net/Files/framework/clipboard.swf.zip" id="highlighter_863820_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_863820" menu="false" src="http://www.blogjava.net/Files/framework/clipboard.swf.zip" width="16" height="16">
print ?
01. CREATE OR REPLACE PROCEDURE send_mail(
02. p_recipient VARCHAR2, -- 邮件接收人
03. p_subject VARCHAR2, -- 邮件标题
04. p_message VARCHAR2 -- 邮件正文
05. )
06. IS
07.
08. --下面四个变量请根据实际邮件服务器进行赋值
09. v_mailhost VARCHAR2(30) := 'mail.xxx.com' ; --SMTP服务器地址
10. v_user VARCHAR2(30) := 'user' ; --登录SMTP服务器的用户名
11. v_pass VARCHAR2(20) := 'pass' ; --登录SMTP服务器的密码
12. v_sender VARCHAR2(50) := 'user@xxx.com' ; --发送都邮箱,一般与 ps_user 对应
13.
14. v_conn UTL_SMTP. connection ; --到邮件服务器的连接
15. v_msg varchar2(4000); --邮件内容
16.
17. BEGIN
18.
19. v_conn := UTL_SMTP.open_connection(v_mailhost, 25);
20. UTL_SMTP.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo() 函数
21. --否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
22.
23. UTL_SMTP.command(v_conn, 'AUTH LOGIN' ); -- smtp服务器登录校验
24. UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));
25. UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));
26.
27. UTL_SMTP.mail(v_conn, v_sender); --设置发件人
28. UTL_SMTP.rcpt(v_conn, p_recipient); --设置收件人
29.
30. -- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行
31. v_msg := 'Date:' || TO_CHAR(SYSDATE, 'dd mon yy hh24:mi:ss' )
32. || UTL_TCP.CRLF || 'From: ' || v_sender || '<' || v_sender || '>'
33. || UTL_TCP.CRLF || 'To: ' || p_recipient || '<' || p_recipient || '>'
34. || UTL_TCP.CRLF || 'Subject: ' || p_subject
35. || UTL_TCP.CRLF || UTL_TCP.CRLF -- 这前面是报头信息
36. || p_message; -- 这个是邮件正文
37.
38. UTL_SMTP.open_data(v_conn); --打开流
39. UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --这样写标题和内容都能用中文
40. UTL_SMTP.close_data(v_conn); --关闭流
41. UTL_SMTP.quit(v_conn); --关闭连接
42.
43. EXCEPTION
44.
45. WHEN OTHERS THEN
46. DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
47. DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
48.
49. END send_mail;
上面代码在 Oracle 9.2.0(Solaris 平台,数据库字符集是 ZHS16GBK) 中实际运行后通过,在 PL/SQL Developer 的 SQL Window 中用下面代码调用该存储过程:
begin
send_mail( 'fantasia@sina.com',' 中文标题','中文内容');
end;
而且在 PL/SQL Developer 的 Command Windows 或是 SQL *Plus 中执行:
send_mail( 'fantasia@sina.com',' 中文标题','中文内容');
都能正常发送,成功收到邮件,并且标题和内容的中文显示正常。
网络上直接拿下来的例子,多是没有很好的解决中文文题,有些不能支持邮件服务器的验证,当今时代要找个不需要用户验证的邮件服务器太难了。关键是有个致命问题是,一运行就报类似如下的错误:
ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
----- PL/SQL Call Stack -----
object line object
handle number name
38298bd60 45 procedure TCSM.SEND_MAIL
38a4efa40 2 anonymous block
原因是:若邮件服务器需要用户验证时,对邮件服务器打招呼的方式不对,不能写成
UTL_SMTP.helo(v_conn, v_mailhost);
而要写成:
UTL_SMTP.ehlo(v_conn, v_mailhost);
如果你的邮件中只用英文,那么上面代码中的三行:
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.DATA (mail_conn, v_msg);
也可以把邮件报头和正文信息分开来写入到连接中去,但这样做恐怕对于标题和正文的中文文题会顾此失彼了。
参考:1. 用utl_smtp发送邮件时的汉字解决方法
2. 实例讲解如何通过Oracle成功发送邮件
3. 用oracle发送邮件(功能很全) 介绍了附件的发送
4. Oracle UTL_SMTP
5. 用telnet发邮件(支持smtp认证)
附注:在 Oracle(8.1.7及以上版本) 中可以用下面语句获得字符串的 base64 编码,如:
select UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw('user'))) from dual;
select UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw('pass'))) from dual;
转自:http://blog.csdn.net/alex197963/archive/2009/08/06/4417033.aspx
所幸,Oracle 为我们提供了发送邮件的工具包 UTL_SMTP,它最早出现在 Oracle 8.1.7 版本中。下面是我从网络上搜索相关资料后、综合整理、多处修正、数次调试、排除万难而写出的一个发送邮件的存储过程。可支持需用户验证的邮件服务器,中文 标题和中文内容无乱码,只还未支持附件的发送,相信这方面应用较少,需要的话再 Google 一下,且文后参考中有相应的链接。
view source
< id="highlighter_863820_clipboard" title="copy to clipboard" type="application/x-shockwave-flash" width="16" height="16" src="http://www.blogjava.net/Files/framework/clipboard.swf.zip" id="highlighter_863820_clipboard" type="application/x-shockwave-flash" title="copy to clipboard" allowscriptaccess="always" wmode="transparent" flashvars="highlighterId=highlighter_863820" menu="false" src="http://www.blogjava.net/Files/framework/clipboard.swf.zip" width="16" height="16">
print ?
01. CREATE OR REPLACE PROCEDURE send_mail(
02. p_recipient VARCHAR2, -- 邮件接收人
03. p_subject VARCHAR2, -- 邮件标题
04. p_message VARCHAR2 -- 邮件正文
05. )
06. IS
07.
08. --下面四个变量请根据实际邮件服务器进行赋值
09. v_mailhost VARCHAR2(30) := 'mail.xxx.com' ; --SMTP服务器地址
10. v_user VARCHAR2(30) := 'user' ; --登录SMTP服务器的用户名
11. v_pass VARCHAR2(20) := 'pass' ; --登录SMTP服务器的密码
12. v_sender VARCHAR2(50) := 'user@xxx.com' ; --发送都邮箱,一般与 ps_user 对应
13.
14. v_conn UTL_SMTP. connection ; --到邮件服务器的连接
15. v_msg varchar2(4000); --邮件内容
16.
17. BEGIN
18.
19. v_conn := UTL_SMTP.open_connection(v_mailhost, 25);
20. UTL_SMTP.ehlo(v_conn, v_mailhost); --是用 ehlo() 而不是 helo() 函数
21. --否则会报:ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
22.
23. UTL_SMTP.command(v_conn, 'AUTH LOGIN' ); -- smtp服务器登录校验
24. UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_user))));
25. UTL_SMTP.command(v_conn,UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw(v_pass))));
26.
27. UTL_SMTP.mail(v_conn, v_sender); --设置发件人
28. UTL_SMTP.rcpt(v_conn, p_recipient); --设置收件人
29.
30. -- 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行
31. v_msg := 'Date:' || TO_CHAR(SYSDATE, 'dd mon yy hh24:mi:ss' )
32. || UTL_TCP.CRLF || 'From: ' || v_sender || '<' || v_sender || '>'
33. || UTL_TCP.CRLF || 'To: ' || p_recipient || '<' || p_recipient || '>'
34. || UTL_TCP.CRLF || 'Subject: ' || p_subject
35. || UTL_TCP.CRLF || UTL_TCP.CRLF -- 这前面是报头信息
36. || p_message; -- 这个是邮件正文
37.
38. UTL_SMTP.open_data(v_conn); --打开流
39. UTL_SMTP.write_raw_data(v_conn, UTL_RAW.cast_to_raw(v_msg)); --这样写标题和内容都能用中文
40. UTL_SMTP.close_data(v_conn); --关闭流
41. UTL_SMTP.quit(v_conn); --关闭连接
42.
43. EXCEPTION
44.
45. WHEN OTHERS THEN
46. DBMS_OUTPUT.put_line(DBMS_UTILITY.format_error_stack);
47. DBMS_OUTPUT.put_line(DBMS_UTILITY.format_call_stack);
48.
49. END send_mail;
上面代码在 Oracle 9.2.0(Solaris 平台,数据库字符集是 ZHS16GBK) 中实际运行后通过,在 PL/SQL Developer 的 SQL Window 中用下面代码调用该存储过程:
begin
send_mail( 'fantasia@sina.com',' 中文标题','中文内容');
end;
而且在 PL/SQL Developer 的 Command Windows 或是 SQL *Plus 中执行:
send_mail( 'fantasia@sina.com',' 中文标题','中文内容');
都能正常发送,成功收到邮件,并且标题和内容的中文显示正常。
网络上直接拿下来的例子,多是没有很好的解决中文文题,有些不能支持邮件服务器的验证,当今时代要找个不需要用户验证的邮件服务器太难了。关键是有个致命问题是,一运行就报类似如下的错误:
ORA-29279: SMTP 永久性错误: 503 5.5.2 Send hello first.
----- PL/SQL Call Stack -----
object line object
handle number name
38298bd60 45 procedure TCSM.SEND_MAIL
38a4efa40 2 anonymous block
原因是:若邮件服务器需要用户验证时,对邮件服务器打招呼的方式不对,不能写成
UTL_SMTP.helo(v_conn, v_mailhost);
而要写成:
UTL_SMTP.ehlo(v_conn, v_mailhost);
如果你的邮件中只用英文,那么上面代码中的三行:
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.DATA (mail_conn, v_msg);
也可以把邮件报头和正文信息分开来写入到连接中去,但这样做恐怕对于标题和正文的中文文题会顾此失彼了。
参考:1. 用utl_smtp发送邮件时的汉字解决方法
2. 实例讲解如何通过Oracle成功发送邮件
3. 用oracle发送邮件(功能很全) 介绍了附件的发送
4. Oracle UTL_SMTP
5. 用telnet发邮件(支持smtp认证)
附注:在 Oracle(8.1.7及以上版本) 中可以用下面语句获得字符串的 base64 编码,如:
select UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw('user'))) from dual;
select UTL_RAW.cast_to_varchar2(UTL_ENCODE.base64_encode(UTL_RAW.cast_to_raw('pass'))) from dual;
转自:http://blog.csdn.net/alex197963/archive/2009/08/06/4417033.aspx
评论
2 楼
yangf2008
2012-07-04
是oracle字符集的问题,已解决
1 楼
yangf2008
2012-07-03
你好,我试过了,发送邮件正常,但是发送时间不对.当前时间是select sysdate from dual --> 7/3/2012 1:43:46 PM 但是邮件上的sent :Wed 1/3/2007 9:44 PM,请问怎么解决?
发表评论
-
期货交易的秘密
2022-09-28 12:31 20期货交易盈利的逻辑,简单来说就是4个字:大赚小亏。 赚钱的时 ... -
一个未了的心结
2022-09-27 14:16 87我有一个未了的心结, 就是攻克癌症, 我后面不管做啥, 挣了钱 ... -
生是一场自我实现的预言
2022-03-15 15:21 0术力之限要靠道力突破, 道力之限要靠心力突破, 人生是一场自我 ... -
人生是一场自我实现的预言
2022-03-15 14:25 464术力之限要靠道力突破, 道力之限要靠心力突破, 人生是一场自我 ... -
物联网大数据平台
2021-01-28 15:29 294TDengine是专为物联网、车联网、工业互联网、IT运维等设 ... -
大数据平台CDH搭建指南
2021-01-28 15:26 270CDH和CM介绍及搭建 http://www.fblinux. ... -
使用Flume+Logstash+Kafka+Spark Streaming进行实时日志处理分析【公安大数据】
2018-09-20 16:53 1127使用Flume+Logstash+Kafka+Spark St ... -
Cloudera Hadoop运维管理与性能调优
2018-09-17 18:53 627Cloudera Hadoop运维管理与性能调优 -
CIO
2018-08-30 11:34 332一个企业的运营过程,不论其身处哪个行业,其实都是一个信 ... -
Hadoop与MPP是什么关系?有什么区别和联系?
2018-08-29 11:17 1586Hadoop与MPP是什么关系?有什么区别和联系? -
大数据资料
2018-05-25 09:44 232大数据资料 -
大数据相关的一些内容和知识
2018-04-22 20:38 347一、大数据通用处理平 ... -
难念的经
2018-03-27 12:13 385“笑你我枉花光心计 爱 ... -
办公室里面小屁就没有掌握自己命运的资格
2018-02-07 10:03 427办公室里面小屁就没有掌握自己命运的资格。 -
一个成熟的自动化运维系统具备什么功能?
2018-02-05 16:57 329一个成熟的自动化运维系统具备什么功能? -
我国“十三五”国家大数据战略离不开专业的数据中心基础设施运维服务
2017-11-21 15:35 459我国“十三五”国家大数据战略离不开专业的数据中心基础设施运维服 ... -
千万级记录的Discuz论坛导致MySQL CPU 100%的优化笔记
2016-07-08 12:15 811千万级记录的Discuz论坛导致MySQL CPU 100%的 ... -
Oralce表被锁了,咋办?
2015-11-02 10:27 6321.下面的语句用来查询哪些对象被锁: select objec ... -
id oracle
2013-11-21 13:14 672SQL> startup ORA-27125: una ... -
一个sql简单关于分组的sql
2013-05-14 16:36 757select * from ( select aa.pe ...
相关推荐
Oracle 发送邮件实现方法是指在 Oracle 数据库中使用 PL/SQL 语言编写的存储过程来发送电子邮件的实现方法。该方法可以实现多种功能,包括支持多收件人、支持中文、支持抄送人、支持大于 32K 的附件、支持多行正文、...
总结来说,这个Oracle存储过程`PROCSENDEMAIL`是一个功能强大的工具,能够帮助数据库管理员和开发者在Oracle环境中方便地发送邮件。通过理解和使用这个存储过程,你可以创建自己的通知系统,自动发送报告或触发事件...
【标题】"使用JSP和Oracle开发的站内邮件收发系统"是一个基于Web的通信应用,它结合了JavaServer Pages(JSP)技术和Oracle数据库,以实现用户在网站内部发送和接收邮件的功能。这样的系统通常包括用户界面、邮件...
UTL_SMTP是Oracle提供的一个实用程序包,它包含了一系列过程和函数,用于建立与SMTP服务器的连接,发送邮件头和邮件内容,以及关闭连接。在这个例子中,我们主要使用了`Open_Connection`、`Ehlo`、`Command`、`Mail...
1. **邮箱验证码的代码被屏蔽**:这表明源码中原本包含的邮箱验证功能可能已被禁用或注释掉,可能是出于安全考虑或者避免实际发送邮件。在实际应用中,邮箱验证码通常用于账户注册、密码找回等场景,以验证用户身份...
4. 创建用户和表空间:为不同角色的用户分配权限,并设置相应的存储空间。 5. 创建表:根据物理模型设计,创建各实体对应的表。 最后,为了提高数据库的效率和安全性,我们还需要创建视图、存储过程和触发器: 1. ...
7. **数据库管理**:邮件系统需要存储用户的账号信息、邮件内容等数据,因此很可能涉及到数据库的设计和使用,如MySQL、Oracle等。这部分可能涉及SQL查询、事务处理和安全性考虑。 8. **安全性**:邮件系统的安全性...
首先,我们需要定义一个名为`bsd_sendemail`的存储过程,它接受三个参数:`p_receiver`(收件人地址),`p_sub`(邮件标题)和`p_txt`(邮件内容,支持HTML)。下面是一段创建这个过程的PL/SQL代码: ```sql create...
文件名"mailtest"可能指的是项目的邮件测试部分,可能包含了一个测试邮件发送的功能,这可能涉及到Spring的邮件服务模块,用于发送验证邮件或其他通知。 总的来说,这个项目是一个很好的学习平台,涵盖了从前端展示...
【标题】"CBD-root-邮箱证书.rar"指出的主题是关于邮箱证书,这通常涉及到电子邮件的安全性和身份验证。邮箱证书,也称为SSL/TLS证书,是用来验证电子邮件服务器身份的数字证书,确保邮件传输过程中的信息安全。 在...
【标题】"CSDN.rar_csdn" 涉及的是CSDN网站的用户注册系统的源代码,这通常包括后端逻辑处理、前端界面展示以及数据存储等相关技术。CSDN(China Software Developer Network)是中国知名的IT技术交流平台,提供博客...
- 数据库操作:Coldfusion提供了丰富的数据库操作函数,如cfquery用于执行SQL查询,cfstoredproc调用存储过程,方便与MySQL、Oracle等数据库交互,实现用户信息、帖子数据的存取。 - 用户认证与会话管理:...
在JSP中,可以使用JavaMail API来实现邮件的发送和接收,同时数据库可以用来存储邮件模板、收件人列表等信息。 【标签】"java jsp MyEcLipse" 提示了开发环境是MyEclipse,这是一个集成开发环境(IDE),专为Java和...
本项目旨在设计并实现一个基于Java Web技术的新闻网站,该网站需具备良好的用户体验,支持用户注册、登录、浏览新闻等功能,并能够根据用户的操作习惯提供个性化的服务。 **1.2 系统需求** ##### 1.2.1 功能需求 ...
这通常需要集成SMTP服务,如使用JavaMail API来发送邮件。 此外,系统可能还包括了广告的发布、管理、统计等功能。广告主可以在后台上传广告,设置展示时间、频率等参数。系统可能还有广告点击统计模块,记录每个...
4. **数据库存储**:邮件数据通常会存储在数据库中,如MySQL或Oracle,以便持久化和检索。 5. **前端技术**:压缩包中的文件名如`index.html`、`toolbar.html`、`webmail.css`和`html_editor_script.js`暗示了前端...