如何检查 Siebel 是不是已成功发送电子邮件?

Posted

技术标签:

【中文标题】如何检查 Siebel 是不是已成功发送电子邮件?【英文标题】:How to check if Siebel has successfully delivered an email?如何检查 Siebel 是否已成功发送电子邮件? 【发布时间】:2017-07-09 12:08:10 【问题描述】:

我们从 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,并且我们的代码成功完成。稍后(可以从几秒到几小时后),我们会收到“Message undeliverable”的错误信息,但此时我们只知道一条出站消息失败,不知道是哪一条。

Siebel 有什么方法可以自动处理这些“邮件无法送达”通知?

我们正在考虑为此编写自己的流程,但这似乎是一项艰巨的任务:我们必须解析传递失败通知,识别失败的收件人,搜索所有最近发送到该地址的消息,以及不知何故,猜测哪一个失败了(如果我们幸运并且可以在 Siebel 中读取它,则基于 Message-Id,否则基于主题)。

【问题讨论】:

【参考方案1】:

问题在于 SMTP 在其本质上既不是同步协议也不是可靠协议(即在“为保证交付而设计”的意义上)。您的 Siebel 应用程序服务器将连接到其分配的 SMTP 服务器并要求它接受要传送的消息,届时可以执行一些高级验证(您已经提到其中一些,但也可能包括策略实施例如检查您的(可能是匿名的)身份是否被授权将消息中继到外部域)。一旦对话结束,您就没有什么可以可靠地做的了,因为从那时起,一切都是异步的,并且不能保证交付(可以涉及任意数量的中间中继代理,每个中继代理都有自己的中断可能性,无论是否重试,每个人都能够尊重或忽略递送或阅读回执的请求,或报告无效的收件人,将您的邮件扔到垃圾文件夹中,等等)。当然,您可以尝试使用您碰巧得到的任何退回通知,以尝试将它们关联回发件人,但这将超出您的发送代码的上下文。

【讨论】:

以上是关于如何检查 Siebel 是不是已成功发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

检查在 CakePHP 中发送电子邮件是不是成功/失败?

如何检查用户电子邮件是不是已验证?

在 Laravel 5 上检查邮件是不是发送成功

使用 Zend_Mail 时如何验证邮件是不是已发送?

如何在发送前检查 .Attachment.Add "filename" 是不是成功

如何敬酒说“邮件已发送成功”?