如何检查Siebel是否成功发送了电子邮件?

3
我们使用Siebel 7.8应用程序发送了大量电子邮件,我们想确定它们是否已成功传递。 根据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 user503 Must have sender and recipient first。Outbound Communications Manager会引发异常,我们将其捕获并处理。
然而,如果我们向不同域中不存在的账户发送消息,则我们的SMTP服务器无法知道它将失败,因此返回250 Queued,我们的代码成功完成。稍后(可能是几秒钟或几小时后),我们将收到“Message undeliverable”错误消息,但此时我们只知道一个出站消息发送失败了,我们不知道是哪个消息。 是否有任何方式使Siebel能够自动处理这些“Message undeliverable”通知? 我们正在考虑编写我们自己的进程来处理这个问题,但这似乎是一个巨大的任务:我们需要分析交付失败通知,确定失败的接收者,搜索所有最近发送到该地址的消息,然后根据Message-Id(如果我们幸运地可以在Siebel内部读取它)或主题(否则)猜测哪个失败了。
1个回答

0
问题在于SMTP本质上既不是同步的也不是可靠的协议(即“为保证传递而设计的协议”)。您的Siebel应用服务器将连接到其分配的SMTP服务器,并要求其接受待传递的消息,在那时可以执行一些高级验证(其中包括您提到的一些内容,但也可能包括策略执行,例如检查您(可能是匿名的)身份是否被授权中继消息到外部域)。一旦该对话结束,由于从那时起的所有操作都是异步的且无法保证传递,因此您可以可靠地执行的操作并不多(可能涉及任何数量的中间中继代理,每个代理都有出现故障或重试的可能性,每个代理都有能力遵守或忽略传递请求或读取回执请求,报告无效收件人,将您的消息放入垃圾文件夹或不放等)。当然,您可以尝试使用您确实获取的任何退信通知来尝试将其与发送者相关联,但这将超出您发送代码的范围。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接