发送邮件的方法有很多,.NET前台也可以通过创建邮件类的形式,
通过微软提供的System.Net.Mail.dll 也可以简单的发送邮件。但是代码比较长,操作起来虽然很简单(很多细节忽略了)。
这里,我使用的是Oracle的UTL_SMTP包来发送邮件,在这里,代码还可以根据需要优化
(针对不同的服务可以在区分邮件的收件人,以及信息数据来源,和邮件信息体的划分,这一部分根据实际需要定制)
--以下定义变量 TYPE g_chr_tbl IS TABLE OF VARCHAR2(100) INDEX BY BINARY_INTEGER;
/*========================================================= Description: 获取发件人地址,这一部分也可以针对不同邮件功能进行复用 Input: 记录发件人的表格() output: g_chr_tbl FUNCTION Name: get_send_email_address Version: 1.00 2016-05-025 Creator: weiyao(8000123) 测试: OK ===========================================================*/ PROCEDURE get_send_email_address(mail_to_address OUT g_chr_tbl) IS i NUMBER := 1; BEGIN i := 1; FOR rec_mail IN (SELECT mv.meaning email_address, mv.* FROM mes_comm_lookup_types mt, mes_comm_lookup_values mv WHERE mt.lookup_type_id = mv.lookup_type_id AND mt.lookup_type = 'alarm__receiver') LOOP mail_to_address(i) := rec_mail.email_address; --获取了这些人的邮件地址 dbms_output.put_line('地址' || i || ': ' || mail_to_address(i)); i := i + 1; END LOOP; END get_send_email_address;
/*========================================================= Description: 发送邮件 Input: output: html 格式的邮件信息,以及调试的 发送了的地址 FUNCTION Name: send_email_to_wy Version: 1.00 2016-05-025 Creator: weiyao(8000123) 测试: OK ===========================================================*/ PROCEDURE send_email_to_wy IS --ORACLE发邮件 SenderAddress VARCHAR2(150) := '****@***.com'; --发送地址 PassWord VARCHAR2(150) := '******'; --服务器密码 --ReceiverAddress LONG := '****@**.com'; --接受地址 EmailServer VARCHAR2(30) := '192.168.*.*'; --服务器端口 Port NUMBER := 25; mail_to_address g_chr_tbl; --发送邮件的地址,存在数据表中,多人 conn UTL_SMTP.CONNECTION; v_start VARCHAR2(150); v_subject LONG; v_line LONG; v_body LONG; --crlf VARCHAR2(2) := CHR(13) || CHR(10); BEGIN get_send_email_address(mail_to_address); --获取发送多个地址 IF mail_to_address.count > 0 THEN conn := utl_smtp.open_connection(EmailServer, Port); utl_smtp.ehlo(conn, 'tcl.com'); --utl_smtp.helo(conn, EmailServer); --和上面一句效果相同 UTL_SMTP.COMMAND(conn, 'AUTH LOGIN'); UTL_SMTP.COMMAND(conn, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(SenderAddress)))); UTL_SMTP.COMMAND(conn, UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(UTL_RAW.CAST_TO_RAW(PassWord)))); utl_smtp.mail(conn, '<' || SenderAddress || '>'); --发件人 --utl_smtp.rcpt(conn, '<' || ReceiverAddress || '>'); --单个收件人 FOR i IN 1 .. mail_to_address.count LOOP utl_smtp.rcpt(conn, '<' || mail_to_address(i) || '>'); --多个收件人 END LOOP; --写内容 utl_smtp.open_data(conn); utl_smtp.write_data(conn, 'From: itpub@tcl.com' || utl_tcp.crlf); --发件人 --utl_smtp.write_data(conn, 'To:' || ReceiverAddress || utl_tcp.crlf); FOR i IN 1 .. mail_to_address.count LOOP utl_smtp.write_data(conn, 'To:' || mail_to_address(i) || utl_tcp.CRLF); --多个收件人 END LOOP; --- ---以下是发送邮件内容部分,可以单独分离出不同形式,已复用 -- v_subject := 'Subject:' || '预警信息邮件' || utl_tcp.crlf; utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(v_subject)); --body部分<HTML形式写> utl_smtp.write_data(conn, 'Content-Type: text/html; charset=GB2312' || utl_tcp.crlf); v_start := '<html><body>'; v_body := v_start || '您们好,现在时间是: ' || to_char(SYSDATE, 'yyyy/MM/DD hh24:mi:ss') || '<br>' || '该邮件为预警测试邮件,请不用回复!' || '<br>' || '<table>'; v_line := '<tr><td><table cellpadding="2" cellspacing="0" border="1" align="left"> <tr> <th>第一列</th> <th>第二列</th> <th>第三列</th> <th>第四列</th>'; /* FOR rec_email_data IN email_data LOOP --循环写入表内容 v_line := v_line || '<tr><td>' || rec_email_data.job || '</td><td>' || rec_email_data.schema_user || '</td><td>' || rec_email_data.what || '</td><td>' ||rec_email_data.failures || '</td></tr>'; END LOOP;*/ v_body := v_body || v_line || '</table></td></tr>'; v_body := v_body || '</table></body></html>'; dbms_output.put_line(v_body); --给自己看,可以复制到记事本中网页打开查看 utl_smtp.write_data(conn, utl_tcp.crlf); -- body 后面加上 utl_tcp.crlf utl_smtp.write_raw_data(conn, utl_raw.cast_to_raw(convert(v_body, 'ZHS16GBK'))); utl_smtp.close_data(conn); utl_smtp.quit(conn); END IF; EXCEPTION WHEN OTHERS THEN utl_smtp.quit(conn); RAISE; END send_email_to_wy;
测试结果:
分享共进步,谢谢阅读!