我们的 CF 服务器偶尔会停止处理邮件。这是有问题的,因为我们的许多客户都依赖它。

我们在网上发现了一些建议,其中提到了无法传递的文件夹中的零字节文件,因此我创建了一个每三分钟删除它们的任务。然而,停工再次发生。

我正在寻找诊断和解决此问题的建议。

  • CF 8 标准
  • WIN2K3

添加:

  • 队列失败时邮件日志中没有错误
  • 由于我们发送的邮件量很大,我们还没有尝试在不使用队列的情况下运行它

添加2:

  • spool 文件夹中的任何文件似乎都没有问题。当我们重新启动邮件队列时,它们似乎都正确处理。

添加了 3 个:

  • 我们没有使用附件。
有帮助吗?

解决方案

我们最终做了什么:

我写了两个计划任务。第一个检查队列文件夹中是否有任何早于 n 分钟(当前设置为 30)。第二个在每晚使用率较低时重置队列。

不幸的是,我们从未真正发现为什么队列会脱轨,但这似乎只在我们使用 Exchange 时才会发生——我们尝试过的其他邮件服务器没有这个问题。

编辑: 我被要求发布我的代码,所以这是发现旧邮件时重新启动的代码:

<cfdirectory action="list" directory="c:\coldfusion8\mail\spool\" name="spool" sort="datelastmodified">
<cfset restart = 0>
<cfif datediff('n', spool.datelastmodified, now()) gt 30>
    <cfset restart = 1>
</cfif>
<cfif restart>
    <cfset sFactory = CreateObject("java","coldfusion.server.ServiceFactory")>
    <cfset MailSpoolService = sFactory.mailSpoolService>
    <cfset MailSpoolService.stop()>
    <cfset MailSpoolService.start()>
</cfif>

其他提示

由于我们发送的邮件量很大,我们还没有尝试在不使用队列的情况下运行它

不管怎样,有你吗 尝试过 关闭假脱机功能?我见过邮件以半秒内 500-600 条消息的速度发送,而且这是在一个蹩脚的服务器上发送的。如果标准页面超时时间为 60 秒,那么在页面超时之前您可以发送约 72,000 封电子邮件。您一次发送的数量是否超过 72,000 个?

我在 CFMail 之前使用的另一种方法是构建一个自定义后台处理程序。不要即时发送电子邮件,而是将它们保存到数据库表中。然后设置一个计划作业来发送数百条消息,并在几分钟后自行重新安排,直到表为空。

我们安排该作业每天运行一次;如果表不为空,它可以重新安排自己在几分钟内再次运行。从来没有遇到过问题。

您是否尝试过完全绕过队列?(在 CF 管理中,在“邮件假脱机设置”下,取消选中“假脱机邮件以便传送”。)

我有时会遇到同样的问题,这不是由于零字节文件造成的,尽管这个问题过去确实出现过。似乎一两个文件(文件夹中最旧的文件)将使队列无法处理。我所做的是将所有邮件移至保留文件夹,重新启动邮件队列,并按时间倒序一次将邮件复制回一大块,等待它们出去并再移动一些邮件。阻塞队列的消息被放入一个单独的文件夹中,以便稍后检查。

您可能可以通过编程方式执行此操作 停止队列, ,将最旧的文件移动到另一个文件夹,然后 启动邮件队列 并通过检查文件夹文件计数和日期来查看发送是否成功开始。如果删除最旧的文件不起作用,请重复前面的过程,直到所有有问题的邮件文件都被移动并继续成功发送。

我希望有帮助。

我们实际上有一个相同的设置,Win2K3 上的 32 位 CF8。

大约一年前,我们采用了 Ben 的解决方案,该解决方案有助于自动重新排队陷入困境的电子邮件。

然而最近,由于没有特殊原因,我们的 7 个网络服务器之一决定在每次尝试发送电子邮件时都进入这种状态。

设置邮件服务器参数时出现异常。该异常的原因是:Coldfusion.mail.MailSessionException:设置邮件服务器参数时发生了例外。

我们的每台网络服务器都是彼此相同的克隆,所以为什么只发生在那个服务器上是很奇怪的。

另一件需要注意的事情是,由于 JRUN 的内存管理问题,我们有一个脚本会在半夜重新启动机器。重新启动的行为似乎引发了问题。随后重新启动 CF 服务将清除它,并且机器将正常工作,直到再次重新启动。

我们发现问题与McAfee病毒扫描程序有关,更新排除c:\ColdFusion8目录后,问题消失了。

希望有帮助。

CFMX 8 中的邮件后台处理程序和带有附件的消息存在问题,已通过修补程序之一修复。至少 8.0.1 版本应该已经修复了这个问题。

Ben Doom 的代码中有一个错误。不管怎样,谢谢你,本,代码很棒,我们现在在一台安装了 CF8 的服务器上使用它,但是:如果目录 (\spool) 为空,则代码失败(错误:传递给日期函数 DateDiff 的日期值未指定或无效。)这是因为如果查询对象假脱机为空 (spool.recordcount EQ 0),则 datediff 函数会产生错误。

我们现在使用这个:

<!--- check if request for this page is local to prevent "webusers" to request this page over and over, only localhost (server) can get it e.g. by cf scheduled tasks--->
<cfsetting requesttimeout="30000">
<cfset who = CGI.SERVER_NAME>
<cfif find("localhost",who) LT 1>
    security restriction, access denied.
    <cfabort>
</cfif> 

<!--- get spool directory info --->
<cfdirectory action="list" directory="C:\JRun4\servers\cfusion\cfusion-ear\cfusion-war\WEB-INF\cfusion\Mail\Spool\" name="spool" sort="datelastmodified">
<cfset restart = 0>
<cfif spool.recordcount GT 0><!--- content there? --->
    <cfif datediff('n', spool.datelastmodified, now()) gt 120>
        <cfset restart = 1>
    </cfif>
</cfif>
<cfif restart><!--- restart --->
    <cfsavecontent variable="liste">
        <cfdump var="#list#">
    </cfsavecontent>    
    <!--- info --->
    <cfmail to="x@y.com" subject="cfmailqueue restarted by daemon" server="xxx" port="25"  from="xxxx" username="xxxx" password="xxx" replyto="xxxx">
    1/2 action: ...try to restart. Send another mail if succeeded!
    #now()#

    Mails:
    #liste#
    </cfmail>

    <cfset sFactory = CreateObject("java","coldfusion.server.ServiceFactory")>
    <cfset MailSpoolService = sFactory.mailSpoolService>
    <cfset MailSpoolService.stop()>
    <cfset MailSpoolService.start()>

    <!--- info --->
    <cfmail to="x@y.com" subject="cfmailqueue restarted by daemon" server="xxx" port="25"  from="xxxx" username="xxxx" password="xxx" replyto="xxxx">
    2/2 action: ...succeeded!
    #now()#
    </cfmail>

</cfif>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top