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.
-
utl_smtp.quit(l_conn);
-
-
dbms_lob.freetemporary(msg) ;
-
exception
-
when utl_smtp.permanent_error or utl_smtp.invalid_operation then
-
pkg_queue.enqueue(-1, m.v_subject, msg, dbms_utility.format_call_stack||sqlcode||sqlerrm) ;
-
utl_smtp.quit(l_conn);
-
when others then
-
pkg_queue.enqueue(-1, m.v_subject, msg, dbms_utility.format_call_stack||sqlcode||sqlerrm) ;
-
END send ;
Email重新發送部份, 用java寫的, pl/sql封裝.
-
/***********************
-
Date: 2014/03/01
-
// dbms_java.grant_permission( 'PCNDBA', 'SYS:java.net.SocketPermission', 'smtphost:25', 'connect,resolve');
-
// send_eml: 直接發送已經編碼好的email
-
*********************************/
-
public static void send_eml(oracle.sql.CLOB data,String smtphost, String smtpuser, String smtppass)
-
throws MessagingException, SQLException
-
{
-
GMailAuthenticator myauth = new GMailAuthenticator(smtpuser, smtppass);
-
Properties props = new java.util.Properties();
-
props.setProperty("mail.smtp.host", smtphost);
-
props.setProperty("mail.transport.protocol", "smtp");
-
-
if ((smtpuser == null) || (smtpuser == "")) {
-
props.setProperty("mail.smtp.auth", "false");
-
}else {
-
props.setProperty("mail.smtp.auth", "true");
-
}
-
-
Session sess = Session.getDefaultInstance(props, myauth);
-
MimeMessage eml = new MimeMessage(sess, data.asciiStreamValue());
-
eml.setSentDate(new java.util.Date());
-
-
javax.mail.Transport.send(eml);
-
}
pl/sql封裝
-
procedure send_eml_java(p_mail clob, mailhost varchar2, authuser varchar2, authpass varchar2)
-
is language java name 'utl.smtp.Sendmail.send_eml(oracle.sql.CLOB, java.lang.String, java.lang.String, java.lang.String)';
以上為我工作中的一點處理經驗.
阿飛
2015/05/08
阅读(1420) | 评论(0) | 转发(0) |