用oracle发送电子邮件

这篇博客介绍了一个Oracle存储过程`souchang_Send_Email`,用于通过Oracle数据库发送电子邮件。过程支持SMTP认证和多收件人,详细阐述了参数含义及邮件发送流程,并提供了一个示例执行。
oracle内部提供发送邮件的包,用它能给我们对数据库的监控带来很大用处。

create or replace procedure souchang_Send_Email(
p_txt varchar2,
p_sub Varchar2,
p_SendorAddress Varchar2,
p_ReceiverAddress varchar2,
p_EmailServer varchar2,
p_Port Number Default 25,
p_need_smtp Int Default 0,
p_user Varchar2 Default Null,
p_pass Varchar2 Default Null
)
IS
/*
作用:用oracle发送邮件,支持多收件人。
作者:suk
参数说明:
p_txt :邮件正文
p_sub: 邮件标题
p_SendorAddress : 发送人邮件地址
p_ReceiverAddress : 接收地址,可以同时发送到多个地址上,地址之间用","或者";"隔开
p_EmailServer : 邮件服务器地址,可以是域名或者IP
p_Port :邮件服务器端口
p_need_smtp:是否需要smtp认证,0表示不需要,1表示需要
p_user:smtp验证需要的用户名
p_pass:smtp验证需要的密码
*/

l_addr Varchar2(200) :='';
l_len Int;
l_ReceiverAddress Varchar2(4000);

--真正发送邮件的过程
procedure p_Email(p_txt varchar2,
p_sub Varchar2,
p_SendorAddress Varchar2,
p_ReceiverAddress varchar2,
p_EmailServer varchar2,
p_Port Number,
p_user Varchar2,
p_pass Varchar2
)
Is
l_conn UTL_SMTP.CONNECTION;--定义连接
l_crlf VARCHAR2( 2 ):= CHR( 13 ) || CHR( 10 );
l_mesg VARCHAR2( 4000 );

Begin
/*初始化邮件服务器信息,连接邮件服务器*/
l_conn:= utl_smtp.open_connection( p_EmailServer, p_Port );
utl_smtp.helo( l_conn, p_EmailServer );

/* smtp服务器登录校验 */
If p_need_smtp=1 Then
utl_smtp.command(l_conn, 'AUTH LOGIN','');
utl_smtp.command(l_conn, utl_encode.base64_encode(utl_raw.cast_to_raw(p_user)), '');
utl_smtp.command(l_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_pass))), '');
End If;

/*设置发送地址和接收地址*/
utl_smtp.mail( l_conn, p_SendorAddress);
utl_smtp.rcpt( l_conn, p_ReceiverAddress );

/*设置邮件头*/
l_mesg:=
'Content-Type: text/plain; Charset=GB2312' || l_crlf ||
'Date:' || TO_CHAR( SYSDATE, 'yyyy-mm-dd hh24:mi:ss' ) || l_crlf ||
'From:' || p_SendorAddress || l_crlf ||
'Subject: '||p_sub || l_crlf ||
'To: '|| p_ReceiverAddress || l_crlf ||
'Content-Type: text/plain; Charset=GB2312' || l_crlf ||
'' || l_crlf || p_txt || l_crlf ;

/*发送邮件*/
utl_smtp.data( l_conn, l_mesg );

/*关闭与邮件服务器的连接*/
utl_smtp.quit( l_conn );

/*异常处理*/
Exception
When Others Then
dbms_output.put_line(Sqlcode||':'||Sqlerrm);
--Raise;

End;


Begin
/*处理接收邮件地址列表,包括去空格、将;转换为,等*/
l_ReceiverAddress:=trim(rtrim(replace(Replace(p_ReceiverAddress,';',','),' ',''),','));
l_len:=length(l_ReceiverAddress);

/*处理邮件地址,根据逗号分割邮件*/
For i In 1..l_len Loop
If substr(l_ReceiverAddress,i,1)<>',' Then
l_addr:=l_addr||substr(l_ReceiverAddress,i,1);
Else
--调用邮件发送过程
p_Email(p_txt,p_sub,p_SendorAddress,l_addr,p_EmailServer,p_Port,p_user,p_pass);
l_addr:='';
End If;
If i=l_len Then
--调用邮件发送过程
p_Email(p_txt,p_sub,p_SendorAddress,l_addr,p_EmailServer,p_Port,p_user,p_pass);
End If;
End Loop;

END;

执行:

SQL> exec souchang_send_email('sssss','ttttt','space6212@gmail.com','space6212@163.com','218.249.xx.xxx',25);

PL/SQL procedure successfully completed

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63718/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/231499/viewspace-63718/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值