我们从Siebel 7.8应用程序发送了大量电子邮件,并且我们想确定它们是否已成功发送。
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是否可以通过哪种方式处理这些“无法传递的邮件”。自动收到通知?
我们正在考虑为此编写自己的流程,但这似乎是一项艰巨的任务:我们必须解析传递失败通知,识别失败的收件人,搜索发送到该地址的所有最新消息,并以某种方式,猜猜哪一个失败了(如果我们很幸运,可以在Siebel中读取它,或者在主题上读取它)。
答案 0 :(得分:0)
问题在于,SMTP本质上既不是同步也不可靠的协议(即“为保证交付而设计”的意义)。您的Siebel应用服务器将连接到其分配的SMTP服务器,并要求它接受一条消息进行传递,此时可以执行一些高级别的验证(其中一些已经提到过,但也包括策略实施)例如检查您的(可能是匿名的)身份是否被授权将消息中继到外部域。一旦该会话结束,您就无法可靠地做到这一点,因为从那一点开始,所有内容都是异步的,并且无法保证交付(可以涉及任意数量的中间中继代理,每个代理都有自己的中断潜力,无论是否重试,每个人都有能力尊重或忽略交付请求或阅读收据或报告无效收件人,将您的邮件丢弃在垃圾文件夹中,等等。当然,您可以尝试使用您碰巧尝试将它们关联回发件人的任何退回通知,但这将超出您的发送代码的上下文。