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

Deleting email addresses where email wasn't sent

我个人看不出有什么办法可以做到这一点,但我希望有一个聪明的技巧可以让它发挥作用。

我们必须定期向客户发送电子邮件,许多客户的电子邮件过期并给我们发送邮件失败。为了保持数据库的准确和干净,当电子邮件发送失败时,我想从数据库中删除他们的记录。

所以目前它有点像这样:

<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" 发送失败的邮件,然后将它们反馈给查询以从数据库中删除?

有人曾经在我参加的一个活动中就此做过介绍。方法是:

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

演示者运行将此文件作为计划作业。

@Dan Bracuk 上面的回答是您可能会得到的最接近好的答案。原因如下:CF 服务器本身并未投递邮件。它只是将邮件交给真正的邮件服务器(即使该服务器在同一台机器上运行)进行投递。接受后,CF 的工作就完成了。无论如何,此阶段的未投递并不反映地址的质量,而是反映您的 CF 服务器和邮件服务器之间的连接。

从那里,邮件服务器再次假脱机。有时收件人的域会接受电子邮件并稍后提问。知道电子邮件发送是否失败的唯一方法是等待未发送报告(电子邮件)被发送到 failto(如果使用)或地址。这可以来自 "your" 邮件服务器,或收件人域的邮件服务器。根据您的邮件服务器投递重试选项和第三方延迟,这可能需要一天或更长时间。如果您想自己执行此操作,则必须为 POP 编写例程并读取来自帐户的电子邮件,然后分析它们以确定它们是否是 NDR,以及是什么类型。未送达报告可以指示硬退回或软退回、阻塞、延迟或网关状况。显然,其中许多不是 "throw it out" 情况,因此您必须解析它们以获得 SMTP 代码 http://www.serversmtp.com/en/smtp-error 和关键字,以确定是否应该删除或标记电子邮件地址。