13

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

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

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

  • CF 8 标准
  • Win2k3

添加:

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

添加2:

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

新增 3:

  • 我们没有使用附件。
4

7 回答 7

12

我们最终做了什么:

我写了两个计划任务。第一个检查队列文件夹中是否有任何消息早于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>
于 2009-02-09T15:11:24.750 回答
5

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

无论如何,您是否尝试过关闭假脱机?我已经看到邮件在半秒内以 500-600 条消息的速度发送,而且那是在一个蹩脚的服务器上。使用 60 秒的标准页面超时,您可以在页面超时之前发送约 72,000 封电子邮件。您一次发送超过 72,000 个吗?

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

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

于 2008-09-26T16:48:16.843 回答
3

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

于 2008-09-18T18:29:47.700 回答
3

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

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

我希望有所帮助。

于 2008-09-20T20:12:55.960 回答
2

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

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

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

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

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

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

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

希望有帮助。

于 2012-05-10T21:37:30.920 回答
1

Ben Doom 的代码中有一个错误。无论如何谢谢本,代码很棒,我们现在在我们的一台安装了 CF8 的服务器上使用它,但是:如果目录 (\spool) 为空,则代码失败(错误:传递给日期函数 DateDiff 的日期值未指定或无效。)这是因为如果查询对象 spool 为空(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>
于 2014-04-26T17:38:05.457 回答
0

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

于 2008-09-25T01:12:05.520 回答