欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用Oracle数据库发送邮件的实例代码

程序员文章站 2023-02-22 12:59:08
--发送邮件的主过程如下所述: procedure send_mail_ (p_from varchar2, --邮件发送人 p_fromuser varcha...

--发送邮件的主过程如下所述:

procedure send_mail_ (p_from varchar2, --邮件发送人
p_fromuser varchar2, --发件人昵称
p_touser varchar2, --接受人昵称
p_to varchar2, --邮件接收人
p_cc varchar2, --邮件抄送人
p_subject varchar2, --邮件标题
p_message varchar2, --邮件内容
p_user varchar2, --邮件验证用户
p_mailhost varchar2, --邮件的服务地址
p_psd varchar2 --邮件验证密码
) is
v_conn utl_smtp.connection; --到邮件服务器的连接
v_msg varchar2(32700); --邮件内容
psrc varchar2(4000);
psrc1 varchar2(4000);
v_touser1 varchar2(4000);
v_touser varchar2(500);
v_to varchar2(500);
i number := 1;
j number := 1;
m number := 1;
n number := 1;
str_error varchar2(20000);
begin
v_touser1 := '';
v_conn := utl_smtp.open_connection(p_mailhost, 25);
utl_smtp.ehlo(v_conn, p_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(p_user))));
utl_smtp.command(v_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_psd ))));
utl_smtp.mail (v_conn, '<' || p_from || '>'); --设置发件人
-- 设置收件人----------------
psrc := rtrim(ltrim(p_to , ';'), ';') || ';';
psrc1 := rtrim(ltrim(p_touser, ';'), ';') || ';';
if nvl(instr(psrc, ';', j), 0)>0 then
loop
i := nvl(instr(psrc , ';', j), 0);
m := nvl(instr(psrc1, ';', n), 0);
if i > 0 then
v_to := trim(substr(psrc , j, i - j));
v_touser := nvl(trim(substr(psrc1, n, m - n)),'1');
utl_smtp.rcpt(v_conn, v_to); --设置收件人
if v_touser = '1' then
v_touser := trim(substr(v_to,1,instr(v_to,'@')-1));
end if;
if j = 1 then
v_touser1 := v_touser1 || v_touser || '<' || v_to || '>';
else
v_touser1 := v_touser1 || ';'|| v_touser || '<' || v_to || '>';
end if;
j := i + 1;
n := m + 1;
end if;
exit when i = 0;
end loop;
else
utl_smtp.rcpt(v_conn, p_to); --设置收件人
v_touser1 := v_touser1 || p_touser || '<' || p_to || '>';
end if;
-- 设置抄送人----------------
i := 1;
j := 1;
if nvl(p_cc,'aa')<>'aa' then
psrc := rtrim(ltrim(p_cc, ';'), ';')|| ';';
if nvl(instr(psrc, ';', j), 0)>0 then
loop
i := nvl(instr(psrc, ';', j), 0);
if i > 0 then
v_to := trim(substr(psrc, j, i - j));
j := i + 1;
utl_smtp.rcpt(v_conn, v_to); --设置抄送人
end if;
exit when i = 0;
end loop;
else
if nvl(p_cc,'1') <> '1' then
utl_smtp.rcpt(v_conn, p_cc); --设置抄送人
end if;
end if;
end if;
-- 创建要发送的邮件内容注意报头信息和邮件正文之间要空一行
v_msg := 'date: ' || to_char(sysdate, 'dd mon yy hh24:mi:ss') || utl_tcp.crlf ||
'from: ' || p_fromuser || '<' || p_from || '>' || utl_tcp.crlf ||
'to: ' || v_touser1 || utl_tcp.crlf ||
'cc: ' || p_cc || 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(convert('content-type:text/html;charset=utf-8' ||
v_msg, 'zhs16gbk'))); --这样写标题和内容都能用中文
utl_smtp.close_data(v_conn); --关闭流
utl_smtp.quit(v_conn); --关闭连接
exception
when others then
str_error := dbms_utility.format_error_stack || dbms_utility.format_call_stack;
dbms_output.put_line(str_error);
end;

以上所述是小编给大家带来的利用oracle数据库发送邮件的实例代码,希望对大家有所帮助