2017-02-20 46 views
2

我們從7.8的Siebel應用發送大量的電子郵件,我們想以確定它們是否已成功交付與否。如何檢查Siebel是否已成功發送電子郵件?

According to the Bookshelf,如果SMTP服務器關閉,通訊對外管理重試後發送信息,所以這不是一個問題。然而,仍然有很多的問題,這可能會導致電子郵件無法傳遞,例如在地址輸入錯誤,已經達到了它的接收存儲配額等

我們送的消息是這樣的:

var ps = TheApplication().NewPropertySet(); 
ps.SetProperty("ActivityId", outboundEmailActivityId); 
ps.SetProperty("CommProfile", commProfile); 
ps.SetProperty("ProcessMode", "Local"); 

var bs = TheApplication().GetService("Outbound Communications Manager"); 
bs.InvokeMethod("SendMessage", ps, psOut); 

使用ProcessMode = Local使我們能夠檢測一些錯誤。例如,如果我們試圖在我們的SMTP服務器的同一個域發送消息到一個不存在的帳戶,它返回550 Unknown user然後503 Must have sender and recipient first。 Outbound Communications Manager引發異常,我們捕獲並處理它。

但是,如果我們向其他域中的不存在帳戶發送消息,我們的SMTP服務器無法知道它會失敗,因此它返回250 Queued,我們的代碼成功完成。稍後(可能會在幾秒鐘到幾個小時之後),我們將收到「消息無法傳送」的錯誤消息,但此時我們只知道出站消息失敗,我們不知道該消息是哪一個。

有沒有什麼辦法,其中的Siebel可以自動處理這些「消息無法送達的」通知?

我們正在考慮爲此編寫我們自己的流程,但這似乎是一項艱鉅的任務:我們必須解析傳送失敗通知,識別失敗的收件人,搜索發送到該地址的所有最近消息,並以某種方式猜測哪一個失敗(基於Message-Id,如果我們很幸運並且可以在Siebel或其他主題中閱讀)。

回答

0

的問題是,SMTP是其性質既不是同步也不可靠的協議(即,在的「改造用於保證的遞送」的意義上)。您的Siebel應用程序服務器將連接到其分配的SMTP服務器,並要求其接受交付的消息,並且當時可以執行一些高級別驗證(其中一些您已經提到但可以包括策略實施例如檢查您的(可能是匿名的)身份是否被授權將消息中繼到外部域)。一旦對話結束,您就無法再可靠地做其他事情了,因爲再次,從這一點開始,所有事情都是異步的,並且不保證交付(可以涉及任意數量的中間中繼代理,每個代理都有自己的潛在中斷,無論是否重試,每個都有能力遵守或忽略傳送或閱讀回執的請求,或報告無效的收件人,將郵件投擲到垃圾文件夾中或沒有,等等)。當然,您可以嘗試使用任何反彈通知,以嘗試將它們關聯回發件人,但這會超出發送代碼的上下文範圍。

相關問題