zoukankan      html  css  js  c++  java
  • 利用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;
    

    测试结果:

     

     分享共进步,谢谢阅读!

  • 相关阅读:
    shell基础
    函数属性
    this的使用
    循环
    正则表达式中的方法
    判断是不是数组
    ECMAScript5中数组方法
    ECMAScript3中数组方法
    break和continue、return的区别
    用来枚举属性的对象工具函数
  • 原文地址:https://www.cnblogs.com/imyao/p/5527131.html
Copyright © 2011-2022 走看看