您的位置:首页 > 数据库 > Oracle

Oracle中用于发送邮件的存储过程

2013-02-19 15:33 411 查看
create or replace procedure sendmail(
p_To in varchar2,--目标
p_Subject in varchar2,--主题
p_content in varchar2--内容,可包含Html
) is

v_From varchar2(100);
v_Smtp_Host varchar2(100);
v_Smtp_Port varchar2(100);

v_Account varchar2(100);
v_Account_exchange varchar2(100);
v_PassWord varchar2(100);
v_PassWord_exchange varchar2(100);

v_Connection utl_smtp.connection;

v_Temp varchar2(32767) default null;
v_Boundary varchar2(256) default 'a1b2c3d4e3f2g1';

v_Body clob :=empty_clob();--邮件信息

v_Offset number;--正文偏移量
v_Amount number;--字符长度

begin
v_From:='test@163.com';--发件人地址
v_Smtp_Host:='smtp.163.com';--163邮箱
v_Smtp_Port:='25';--端口号,一般都是25
v_Account:='test@163.com';--登录账号
v_Account_exchange:=utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_Account)));--要转换
v_PassWord:='123456';--密码
v_PassWord_exchange:=utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_PassWord)));--要转换

--连接服务器
v_Connection:=utl_smtp.open_connection(host => v_Smtp_Host,port => v_Smtp_Port);
--utl_smtp.helo(v_Connection,v_Smtp_Host);--问候服务器
utl_smtp.ehlo(v_Connection,v_Smtp_Host);--问候服务器

-- 登录
utl_smtp.command(v_Connection,'Auth Login');--用AUTH LOGIN选项使用安全登录功能
--utl_smtp.command(v_Connection,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_Account))));
--utl_smtp.command(v_Connection,utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_PassWord))));
utl_smtp.command(v_Connection,v_Account_exchange);
utl_smtp.command(v_Connection,v_PassWord_exchange);

--设置发件人和收件人
utl_smtp.mail(v_Connection,'<'||v_From||'>');--发件人信息
utl_smtp.rcpt(v_Connection,'<'||p_To||'>');--收件人信息
--记得在两边加上<>,否则出错

--初始化Clob
dbms_lob.createtemporary(v_Body,true);--初始化Clob

--头信息
v_Temp:=v_Temp||'MIME-Version:1.0'||chr(13)||chr(10);
v_Temp:=v_Temp||'To: '||p_To||chr(13)||chr(10);
v_Temp:=v_Temp||'From: '||v_From||chr(13)||chr(10);
v_Temp:=v_Temp||'Subject: '||p_Subject||chr(13)||chr(10);
v_Temp:=v_Temp||'Reply-To: '||v_From||chr(13)||chr(10);
v_Temp:=v_Temp||'Content-Type: multipart/alternative; boundary= '||chr(34)||v_Boundary||chr(34)||chr(13)||chr(10);
dbms_lob.write(v_Body,length(v_Temp),1,v_Temp);--将v_Temp中信息写入v_body

--正文
v_Temp:=chr(13)||chr(10)||'--'||v_Boundary||'--'||chr(13)||chr(10);
v_Temp:=v_Temp||'Content-Type:text/plain;charset=us-ascii'||chr(13)||chr(10)||chr(13)||chr(10);
--v_Offset:=dbms_lob.getlength(v_Body)+1;
--dbms_lob.write(v_Body,length(v_Temp),v_Offset,v_Temp);或者
dbms_lob.writeappend(v_Body,length(v_Temp),v_Temp);

dbms_lob.writeappend(v_Body,length(p_content),p_content);

--末尾分界线
v_Temp:=chr(13)||chr(10)||chr(13)||chr(10)||'--'||v_Boundary||'--'||chr(13)||chr(10)||chr(13)||chr(10);
dbms_lob.writeappend(v_Body,length(v_Temp),v_Temp);

--发送邮件
v_Offset:=1;
v_Amount:=1900;
utl_smtp.open_data(v_Connection);

while v_Offset<dbms_lob.getlength(v_Body)+1
loop
utl_smtp.write_raw_data(v_Connection,utl_raw.cast_to_raw(dbms_lob.substr(v_Body,dbms_lob.getlength(v_Body),1)));
v_Offset:=v_Offset+v_Amount;
v_Amount:=least(1900,dbms_lob.getlength(v_Body)-v_Amount);
end loop;

--关闭连接
utl_smtp.close_data(v_Connection);
utl_smtp.quit(v_Connection);
--释放CLOB
dbms_lob.freetemporary(v_Body);

--成功写信息
dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh-mi-ss')||'发送成功!');

--捕获异常
Exception
when others then
dbms_output.put_line(dbms_utility.format_error_stack);
dbms_output.put_line(dbms_utility.format_call_stack);
dbms_output.put_line(sqlerrm);

end sendmail;


该存储过程在oracle 10g下编写,已测试通过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: