–发送邮件的主过程如下所述:
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数据库发送邮件的实例代码,希望对大家有所帮助