ORACLE mail傳送功能,增加使用者驗證功能

oracle_kai發表於2008-07-03

曾經寫過一個利用oracle smtp包發mail的procedure,但當時沒有增加使用者的密碼驗證功能,這次正好公司的smtp伺服器取消的匿名郵件傳送,就此機會,完善了該procedure。

 

CREATE OR REPLACE PROCEDURE send_mail(
                p_sender   In Varchar2  default  'xxx@xxx.com.cn',
                p_receiver IN Varchar2 default 'xxx@xxx.com.cn'
                p_message   IN Varchar2  Default 'ceshi') 
AS 
  mailhost  VARCHAR2(100) := '10.x.x.x;        --smtp mail 伺服器 
  mail_conn utl_smtp.connection; 
  p_user Varchar2(30) :='systemuser@xxx.com.cn';--定義驗證的mail帳號
  p_pass Varchar2(20) :='sysuser';--定義改帳號的密碼
  PROCEDURE send_header(conn  IN OUT NOCOPY utl_smtp.connection,  
                        name  IN VARCHAR2,  
                        value IN VARCHAR2)
   As  
   BEGIN  
     utl_smtp.write_data(conn,name || ': =?GB2312?B?' ||      --注意使用GB2312才能支援中文 
     utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(value))) || '?='|| utl_tcp.crlf);   
   END;  

BEGIN 
  mail_conn :=utl_smtp.open_connection(mailhost,25); 
  --utl_smtp.helo(mail_conn,mailhost);  --註釋掉此語句
 UTL_SMTP.COMMAND(mail_conn, 'AUTH LOGIN'); --用AUTH LOGIN選項啟用安全登入功能
 utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_user))));
 utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_pass))));     
  utl_smtp.mail(mail_conn,p_sender);    -- sender 
  utl_smtp.rcpt(mail_conn,p_receiver); -- receiver 
  utl_smtp.open_data(mail_conn); 
  send_header(mail_conn,'From',p_sender);--顯示 mail中的發件人
  send_header(mail_conn,'To', p_receiver);  --顯示mail中的 收件人 
  --send_header(mail_conn,'Cc', 'xxx@xxx.com.cn');--顯示抄送人地址
  --send_header(mail_conn,'Bcc', 'xxx@xxx.com.cn');--顯示祕送人地址
  send_header(mail_conn,'Subject', 'ETL 報錯 郵件');  --郵件主題 
  UTL_SMTP.write_data(mail_conn, 'Date: ' || TO_CHAR(SYSDATE, 'DD-MON-YYYY HH24:MI:SS') || Chr(13)|| chr(10)); 
  utl_smtp.write_data(mail_conn, 'MIME-Version: 1.0' || chr(13) || chr(10)); 
  utl_smtp.write_data(mail_conn, 'Content-type: text/plain;Charset=UTF8;' || chr(13) || chr(10)); 
  utl_smtp.write_data(mail_conn, 'Content-Transfer-Encoding: base64' || chr(13) || chr(10)); 
  utl_smtp.write_data(mail_conn, chr(13) || chr(10));   
  utl_smtp.write_data(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_message)))); 
  utl_smtp.close_data(mail_conn); 
  utl_smtp.quit(mail_conn); 
EXCEPTION 
  WHEN utl_smtp.transient_error OR utl_smtp.permanent_error THEN 
    utl_smtp.quit(mail_conn); 
    raise_application_error(-20000, 
      'Failed tosend mail due to the following error: ' || sqlerrm); 
  WHEN OTHERS THEN 
    raise_application_error(-20001, 
      'The following error has occured: ' || sqlerrm);    
End send_mail;

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10159839/viewspace-369046/,如需轉載,請註明出處,否則將追究法律責任。

相關文章