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

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

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;

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

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐