利用Oracle 发送邮件(utl_smtp)

发送邮件的方法有很多,.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;

测试结果:

 

 分享共进步,谢谢阅读!

posted @ 2016-05-25 15:19  艾野草  阅读(2063)  评论(0编辑  收藏  举报