网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  实例讲解如何通过oracle成功发送邮件     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:105次  录入:管理员--2008-04-10  
 

【赛迪网-it技术报道】linux as3+oracle 9.2||10.20.1从oracle成功发送邮件:

示例如下:

具体的测试环境:linux as3 , oracle 9.0.2.4

sql> select * from v$version;

banner

----------------------------------------------------------------

oracle9i enterprise edition release 9.2.0.4.0 - production

pl/sql release 9.2.0.4.0 - production

core 9.2.0.3.0 production

tns for linux: version 9.2.0.4.0 - production

nlsrtl version 9.2.0.4.0 - production

sql> select * from v$version;

oracle database 10g enterprise edition release 10.2.0.1.0 - prod

pl/sql release 10.2.0.1.0 - production

core 10.2.0.1.0 production

tns for linux: version 10.2.0.1.0 - production

nlsrtl version 10.2.0.1.0 - production

mail服务器为win2003,winmail

1.保证oracle服务器到mail服务器网络畅通,25端口打开

2.创建发送邮件的procedure如下:

---------------------------------------

create or replace procedure send_mail

(as_sender in varchar2, --邮件发送者

as_recp in varchar2, --邮件接收者

as_subject in varchar2, --邮件标题

as_msg_body in varchar2) --邮件内容

is

ls_mailhost varchar2(30) := 'mail server'; -- address or ip

lc_mail_conn utl_smtp.connection;

ls_subject varchar2(100);

ls_msg_body varchar2(20000);

ls_username varchar2(256) := 'usercode';

ls_password varchar2(256) := 'password';

begin

lc_mail_conn := utl_smtp.open_connection(ls_mailhost, 25);

utl_smtp.helo(lc_mail_conn, ls_mailhost);

utl_smtp.command(lc_mail_conn, 'auth login');

utl_smtp.command(lc_mail_conn, demo_base64.encode(utl_raw.cast_to_raw(ls_username)));

utl_smtp.command(lc_mail_conn, demo_base64.encode(utl_raw.cast_to_raw(ls_password)));

ls_subject := 'subject: [' || upper(sys_context('userenv', 'db_name')) || '] - ' || as_subject;

ls_msg_body := as_msg_body;

utl_smtp.mail(lc_mail_conn, '<'||as_sender||'>'); --这里的'<' 一定要写,不然会出现permanent error

utl_smtp.rcpt(lc_mail_conn, '<'||as_recp||'>');--这里的'<' 一定要写,不然会出现permanent error

utl_smtp.open_data(lc_mail_conn);

ls_msg_body := 'from: ' || as_sender || chr(13) || chr(10) || 'to: ' || as_recp || chr(13) || chr(10) || ls_subject ||

chr(13) || chr(10) || chr(13) || chr(10) || ls_msg_body;

utl_smtp.write_raw_data(lc_mail_conn, utl_raw.cast_to_raw(ls_msg_body)); --这样写subject可以支持中文但body内容不支持中文;

-- utl_smtp.write_data(lc_mail_conn, ls_msg_body); --这样写subject不支持中文

utl_smtp.close_data(lc_mail_conn);

utl_smtp.quit(lc_mail_conn);

exception

when utl_smtp.invalid_operation then

dbms_output.put_line('invalid operation');

when utl_smtp.transient_error then

dbms_output.put_line('transient error');

when utl_smtp.permanent_error then

dbms_output.put_line('permanent error');

when others then

dbms_output.put_line('others');

end send_mail;

3.执行发送邮件:

exec send_mail('heyu@163.net','admin@163.net','我我','this is a oracle test mail');

注意事项:上面的过程如果在编译中出现demo_base64.encode must be declared,请大家创建下面的包和包体;

---------------------------------

create or replace package demo_base64 is

-- base64-encode a piece of binary data.

--

-- note that this encode function does not split the encoded text into

-- multiple lines with no more than 76 bytes each as required by

-- the mime standard.

--

function encode(r in raw) return varchar2;

end;

------------------------------------

create or replace package body demo_base64 is

type vc2_table is table of varchar2(1) index by binary_integer;

map vc2_table;

-- initialize the base64 mapping

procedure init_map is

begin

map(0) :='a'; map(1) :='b'; map(2) :='c'; map(3) :='d'; map(4) :='e';

map(5) :='f'; map(6) :='g'; map(7) :='h'; map(8) :='i'; map(9):='j';

map(10):='k'; map(11):='l'; map(12):='m'; map(13):='n'; map(14):='o';

map(15):='p'; map(16):='q'; map(17):='r'; map(18):='s'; map(19):='t';

map(20):='u'; map(21):='v'; map(22):='w'; map(23):='x'; map(24):='y';

map(25):='z'; map(26):='a'; map(27):='b'; map(28):='c'; map(29):='d';

map(30):='e'; map(31):='f'; map(32):='g'; map(33):='h'; map(34):='i';

map(35):='j'; map(36):='k'; map(37):='l'; map(38):='m'; map(39):='n';

map(40):='o'; map(41):='p'; map(42):='q'; map(43):='r'; map(44):='s';

map(45):='t'; map(46):='u'; map(47):='v'; map(48):='w'; map(49):='x';

map(50):='y'; map(51):='z'; map(52):='0'; map(53):='1'; map(54):='2';

map(55):='3'; map(56):='4'; map(57):='5'; map(58):='6'; map(59):='7';

map(60):='8'; map(61):='9'; map(62):='+'; map(63):='/';

end;

function encode(r in raw) return varchar2 is

i pls_integer;

x pls_integer;

y pls_integer;

v varchar2(32767);

begin

-- for every 3 bytes, split them into 4 6-bit units and map them to

-- the base64 characters

i := 1;

while ( i + 2 <= utl_raw.length(r) ) loop

x := to_number(utl_raw.substr(r, i, 1), '0x') * 65536 +

to_number(utl_raw.substr(r, i + 1, 1), '0x') * 256 +

to_number(utl_raw.substr(r, i + 2, 1), '0x');

y := floor(x / 262144); v := v || map(y); x := x - y * 262144;

y := floor(x / 4096); v := v || map(y); x := x - y * 4096;

y := floor(x / 64); v := v || map(y); x := x - y * 64;

v := v || map(x);

i := i + 3;

end loop;

-- process the remaining bytes that has fewer than 3 bytes.

if ( utl_raw.length(r) - i = 0) then

x := to_number(utl_raw.substr(r, i, 1), '0x');

y := floor(x / 4); v := v || map(y); x := x - y * 4;

x := x * 16; v := v || map(x);

v := v || '==';

elsif ( utl_raw.length(r) - i = 1) then

x := to_number(utl_raw.substr(r, i, 1), '0x') * 256 +

to_number(utl_raw.substr(r, i + 1, 1), '0x');

y := floor(x / 1024); v := v || map(y); x := x - y * 1024;

y := floor(x / 16); v := v || map(y); x := x - y * 16;

x := x * 4; v := v || map(x);

v := v || '=';

end if;

return v;

end;

begin

init_map;

end;

--结束.

 
 
上一篇: 如何使用new_value将查询结果传递给变量    下一篇: 用一个存储过程实现分步删除数据表记录
  相关文档
循序渐进讲解oracle数据库的hash join (1) 04-30
如何在SQL Server中构建并利用UDF表格 07-07
如何处理oracle中temp表空间满的问题 03-03
通过意向锁多粒度封锁机制进行并发控制 (1) 04-11
exp的版本高于数据库版本导出时出现报错 03-03
将 Excel 数据导出到 Oracle 数据库中 01-15
关于Oracle数据库各种存储形式的概述 04-11
oracle数据库中日期时间的操作比较和加减 05-12
讲解oracle数据库的sysdba权限登录问题 (1) 06-05
怎样才能dump oracle数据库的内部结构 04-07
帮你完全了解 Oracle 标签安全测试 05-13
Oracle数据库异构服务原理及实例说明 04-11
用forall与bulk collect快速复制表数据 (1) 03-27
oracle中系统process与session的关系 04-07
Oracle数据库中Web分页方法详细介绍 04-11
oracle数据库内存参数调优技术个人总结 09-03
Oracle的恢复管理器及DBMS_JOB包分析 04-11
通过分析SQL语句的执行计划优化SQL(一) 08-05
oralce数据库定时执行存储过程的设置步骤 01-31
Oracle数据库中通过扩展SQL跟踪数据 04-11
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息