我们使用Siebel 7.8应用程序发送了大量电子邮件,我们想确定它们是否已成功传递。 根据Bookshelf的说法,如果SMTP服务器已关闭,则通信出站管理器会重试稍后再发送该消息,因此这不是问题。 但是,仍有许多问题可能导致电子邮件无法传递,例如地址拼写错误,接收方已达到存储配额等。 我们是通过以下方式发送我们的消息:
使用
然而,如果我们向不同域中不存在的账户发送消息,则我们的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
,我们的代码成功完成。稍后(可能是几秒钟或几小时后),我们将收到“Message undeliverable”错误消息,但此时我们只知道一个出站消息发送失败了,我们不知道是哪个消息。
是否有任何方式使Siebel能够自动处理这些“Message undeliverable”通知?
我们正在考虑编写我们自己的进程来处理这个问题,但这似乎是一个巨大的任务:我们需要分析交付失败通知,确定失败的接收者,搜索所有最近发送到该地址的消息,然后根据Message-Id(如果我们幸运地可以在Siebel内部读取它)或主题(否则)猜测哪个失败了。