ColdFusion邮件队列停止处理

时间:2008-09-18 17:52:44

标签: coldfusion administration

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

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

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

  • CF 8标准
  • WIN2K3

添加了:

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

新增2:

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

新增3:

  • 我们没有使用附件。

7 个答案:

答案 0 :(得分:13)

我们最终做了什么:

我写了两个预定的任务。第一个检查队列文件夹中是否有任何消息早于 n minues(当前设置为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>

答案 1 :(得分:5)

  

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

无论如何,你尝试关闭假脱机吗?我已经看到邮件在半秒钟内以500-600条消息的速度发送,这就是一种糟糕的服务器。标准页面超时为60秒,在页面超时之前,您可以发送大约72,000封电子邮件。你一次发送超过72,000个吗?

我在CFMail之前使用的替代方法是快速构建自定义假脱机程序。而不是动态发送电子邮件,将它们保存到数据库表。然后设置一个预定作业以发送几百条消息,并在几分钟后重新安排自己,直到该表为空。

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

答案 2 :(得分:3)

您是否尝试过完全绕过队列? (在CF Admin中,在Mail Spool设置下,取消选中“Spool mail messages for delivery”。)

答案 3 :(得分:3)

我有时会遇到同样的问题而且它不是由于零字节文件,尽管过去这个问题确实出现了。看起来像一个或两个文件(文件夹中最旧的文件)将阻止队列处理。我所做的是将所有消息移动到保留文件夹,重新启动邮件队列并按时间顺序将消息按时间顺序复制回一个块,等待它们熄灭并再移动一些。阻止队列的消息放在一个单独的文件夹中,以供后面检查。

您可以通过stopping the queue以编程方式执行此操作,将最旧的文件移动到另一个文件夹,然后start the mail queue,并通过检查文件夹文件计数和日期来查看是否成功开始发送。如果删除最旧的文件不起作用,请重复上一过程,直到移动所有违规邮件文件并继续成功发送。

我希望有所帮助。

答案 4 :(得分:2)

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

我们在大约一年前就采用了Ben的解决方案,而且这些解决方案有助于自动重新排列卡住的电子邮件。

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

  

设置邮件服务器参数时发生异常。   此例外原因是:   coldfusion.mail.MailSessionException:   设置邮件服务器时发生异常   参数..

我们的每个Web服务器都是相同的克隆,所以为什么它只发生在那个是奇怪的。

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

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

希望有所帮助。

答案 5 :(得分:0)

邮件假脱机程序和CFMX 8中带有附件的邮件存在问题,这些附件已使用其中一个修补程序修复。至少版本8.0.1应该已经修复了。

答案 6 :(得分:0)

Ben Doom的代码中有一个错误。无论如何,感谢Ben,代码很棒,我们现在在安装了CF8的服务器上使用它,但是: 如果directory(\ 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>