2017-02-20 48 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服务器,并要求其接受交付的消息,并且当时可以执行一些高级别验证(其中一些您已经提到但可以包括策略实施例如检查您的(可能是匿名的)身份是否被授权将消息中继到外部域)。一旦对话结束,您就无法再可靠地做其他事情了,因为再次,从这一点开始,所有事情都是异步的,并且不保证交付(可以涉及任意数量的中间中继代理,每个代理都有自己的潜在中断,无论是否重试,每个都有能力遵守或忽略传送或阅读回执的请求,或报告无效的收件人,将邮件投掷到垃圾文件夹中或没有,等等)。当然,您可以尝试使用任何反弹通知,以尝试将它们关联回发件人,但这会超出发送代码的上下文范围。

相关问题