删除未发送电子邮件的电子邮件地址

3
我个人无法想到一种方法来实现这一点,但我希望能有一个聪明的方法来使其工作。
我们需要定期向客户发送电子邮件,其中许多电子邮件已经过期并给我们带来了邮件投递失败。为了保持数据库的准确性和清洁度,当邮件未能成功发送给客户时,我希望从数据库中删除他们的记录。
因此,目前情况是这样的:
<cfloop query="rsCustomers">
<cftry>

<cfmail to="rsCustomers.Email" from="us@ourcompany.com" failto="fails@ourcompany.com" subject="Whatever">
[email text here]
</cfmail>

<cfcatch type="any">
<!--- just to skip this record when it fails to send --->
</cfcatch>
</cftry>

</cfloop>

当记录出现错误(例如,电子邮件地址格式不正确)时,我可以在catch区域内运行查询以删除记录。但是当邮件无法发送时,什么也不会发生。我会收到一个失败通知,但这些通知可能有几百个,因此手动从数据库中删除很困难。

有没有办法“捕捉”发送失败的电子邮件,然后将它们反馈到查询中以从数据库中删除?


1
我认为这将严重依赖于您特定的邮件服务器。如果有在CF中执行它的希望,几乎肯定需要关闭 spooling(从CF管理界面)。Spooling会异步地将事物发送到邮件服务器,因此错误不会报告回调用页面。 - Tim Jasko
我认为你不能通过在cfmail标签周围使用try/catch来实现它。我知道我们使用的其中一个电子邮件服务将向我们发送有关反弹电子邮件的API请求,然后我们可以从那里解析。但是您不会从cfmail结果中获得任何内容。 - beloitdavisja
但是,考虑到失败通常涉及发送到其他邮件服务器并等待其反弹回来,您可能需要在单独的进程中轮询收件箱以获取反弹的消息。 - Tim Jasko
3
您可能想查看类似MailGun的服务,它可以通过API发送电子邮件。然后可以查询该API以查找退信等问题,您可以利用这些信息来清理您的数据库。我认为MailGun也可以通过SMTP工作,但是API使用起来非常简单。 - John Whish
3
只有当ColdFusion与您的邮件服务器之间通信存在问题时,您才会收到错误提示。除非您尝试发送一条消息到某个地址并且您的邮件服务器已经从该地址的邮件服务器收到了通知,否则您的邮件服务器将不知道一个电子邮件不存在。请注意,此过程可能需要时间。 - Scott Stroz
2个回答

5

曾经我参加的一个聚会上有人做过这方面的演示。他的解决方法如下:

  • 在发送邮件时,在failto属性中使用特殊的电子邮件地址。
  • 编写一个 .cfm 文件,使用 cfpop 标记读取发送至该地址的邮件。(这可能是在 cfexchange 标记可用之前)
  • 添加代码以读取传递失败通知并提取电子邮件地址。
  • 对这些地址采取行动。

演示者将此文件作为定期作业运行。


这真的很有帮助。 - volume one

2

@Dan Bracuk的答案是你可能会得到的最好的答案。原因在于:CF服务器并不直接发送邮件,它只是将邮件交给一个真正的邮件服务器(即使该服务器运行在同一台机器上)进行投递。在被接受后,CF的工作就完成了。这个阶段的非投递并不反映地址质量,而是反映CF服务器和邮件服务器之间的连接情况。

然后,邮件服务器会再次将邮件加入队列。有时,收件人的域名会接受电子邮件,并稍后询问。要知道电子邮件是否发送失败,唯一的方法就是等待发送到failto(如果使用)或发件人地址的非传送报告(电子邮件)。这可以来自“您”的邮件服务器,也可以来自收件人域的邮件服务器。根据您的邮件服务器投递重试选项和第三方延迟,这可能需要一天或更长时间。如果您想自己完成此操作,则必须编写一个例程来从帐户中获取并分析电子邮件,以确定它们是否为NDR以及其类型。非传送报告可以指示硬退信、软退信、拦截、延迟或网关条件。显然,其中许多不是“扔掉它”的情况,因此您必须解析它们以获取SMTP代码http://www.serversmtp.com/en/smtp-error和关键字,以确定是否应该删除或标记电子邮件地址。


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