Chinaunix首页 | 论坛 | 博客
  • 博客访问: 409502
  • 博文数量: 66
  • 博客积分: 1416
  • 博客等级: 上尉
  • 技术积分: 922
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-16 10:37
个人简介

高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優. 具有多年PL/SQL開發經驗.

文章分类

全部博文(66)

文章存档

2015年(9)

2014年(4)

2013年(5)

2010年(1)

2009年(3)

2008年(6)

2007年(30)

2006年(8)

我的朋友

分类: Oracle

2015-05-08 14:22:33

  erp自動報表類業務中, 一般都是後端package或過程,會動態生成一些html或是xls附檔表單,
  然後以email的方式發送給相關人員.

  在我的工作中,不定時的會出現.因為網絡或email server問題,或是email收件者拒絕問題造成投遞失敗,
  如何解決?

  方式1:  程序運行失敗,會有log記錄,重新運行該程序.
     缺點: 工作時間檢查重跑,oracle資源爭用, 程序中和時間相關的部份可能需要調整.
            且email時間會變化.

  方式2: 本地Oracle Server上架設postfix server,先發送到本地email server,再由它代理發送.
     需DBA協助解決.

  方式3: plsql的解決方法, 將發送失敗的,已經編碼好email存入對列, 檢查發現出錯後,重新發送.
     這是我們目前所使用的方法

   email發送部份, pkg_queue為對列封裝, msg為已經編碼好的email.

点击(此处)折叠或打开

  1.     utl_smtp.quit(l_conn);

  2.     dbms_lob.freetemporary(msg) ;
  3.     exception
  4.       when utl_smtp.permanent_error or utl_smtp.invalid_operation then
  5.         pkg_queue.enqueue(-1, m.v_subject, msg, dbms_utility.format_call_stack||sqlcode||sqlerrm) ;
  6.         utl_smtp.quit(l_conn);
  7.       when others then
  8.         pkg_queue.enqueue(-1, m.v_subject, msg, dbms_utility.format_call_stack||sqlcode||sqlerrm) ;
  9.  END send ;
Email重新發送部份, 用java寫的, pl/sql封裝.

点击(此处)折叠或打开

  1. /***********************
  2. Date: 2014/03/01
  3. // dbms_java.grant_permission( 'PCNDBA', 'SYS:java.net.SocketPermission', 'smtphost:25', 'connect,resolve');
  4. // send_eml: 直接發送已經編碼好的email
  5. *********************************/
  6.   public static void send_eml(oracle.sql.CLOB data,String smtphost, String smtpuser, String smtppass)
  7.   throws MessagingException, SQLException
  8.   {
  9.     GMailAuthenticator myauth = new GMailAuthenticator(smtpuser, smtppass);
  10.     Properties props = new java.util.Properties();
  11.     props.setProperty("mail.smtp.host", smtphost);
  12.     props.setProperty("mail.transport.protocol", "smtp");
  13.     
  14.     if ((smtpuser == null) || (smtpuser == "")) {
  15.       props.setProperty("mail.smtp.auth", "false");
  16.     }else {
  17.       props.setProperty("mail.smtp.auth", "true");
  18.     }
  19.     
  20.     Session sess = Session.getDefaultInstance(props, myauth);
  21.     MimeMessage eml = new MimeMessage(sess, data.asciiStreamValue());
  22.     eml.setSentDate(new java.util.Date());

  23.     javax.mail.Transport.send(eml);
  24.   }
pl/sql封裝

点击(此处)折叠或打开

  1. procedure send_eml_java(p_mail clob, mailhost varchar2, authuser varchar2, authpass varchar2)
  2.    is language java name 'utl.smtp.Sendmail.send_eml(oracle.sql.CLOB, java.lang.String, java.lang.String, java.lang.String)';

以上為我工作中的一點處理經驗.

阿飛
2015/05/08
阅读(1365) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~