代码之家  ›  专栏  ›  技术社区  ›  Ben Doom

ColdFusion邮件队列停止处理

  •  13
  • Ben Doom  · 技术社区  · 16 年前

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

    我们在网上找到了一些建议,在“无法传送”文件夹中提到了零字节文件,所以我创建了一个任务,每三分钟删除一次。然而,停工再次发生。

    我正在寻找诊断和修复此问题的建议。

    • CF 8标准
    • Win 2K3

    补充:

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

    增加2:

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

    增加3:

    • 我们不使用附件。
    7 回复  |  直到 16 年前
        1
  •  13
  •   Ben Doom    14 年前

    我们最终做的是:

    我写了两个计划任务。首先检查队列文件夹中是否存在早于 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>
    
        2
  •  5
  •   Adam Tuttle    16 年前

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

    不管怎样,你有吗 尝试 关闭假脱机?我看到邮件在半秒内以500-600条消息的速度发送,而这在一个糟糕的服务器上。标准页面超时为60秒,即在页面超时之前,您可以发送约72000封电子邮件。一次发送超过72000封邮件吗?

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

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

        3
  •  3
  •   Patrick McElhaney    16 年前

    你试过完全绕过队列吗?(在“CF管理”中的“邮件假脱机设置”下,取消选中“要传递的假脱机邮件”。)

        4
  •  3
  •   Community Egal    7 年前

    我有时也有同样的问题,这不是由于零字节文件造成的,尽管这个问题在过去确实突然出现过。似乎一个或两个文件(文件夹中最旧的文件)会阻止队列处理。我要做的是将所有邮件移动到一个保存文件夹中,重新启动邮件队列,并按逆时间顺序将邮件复制回一个区块中,等待它们退出并移动更多邮件。阻塞队列的消息被放在一个单独的文件夹中,以便稍后检查。

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

    希望有帮助。

        5
  •  2
  •   Tariq Ahmed    12 年前

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

    大约一年前,我们采用了本的解决方案,这肯定有助于自动重新排队那些被卡住的电子邮件。

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

    设置邮件服务器参数时发生异常。 此异常是由以下原因引起的: coldfusion.mail.mailsessionexception(冷聚变.mail.mailsessionexception): 设置邮件服务器时发生异常 参数。。

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

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

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

    希望有帮助。

        6
  •  0
  •   ale    16 年前

    在cfmx 8中,邮件假脱机程序和带有附件的邮件存在问题,已通过其中一个修复程序修复。至少8.0.1版应该已经修复了。

        7
  •  0
  •   user3576573    10 年前

    本·厄运的密码里有一个错误。不管怎样,谢谢你,本,代码很棒,我们现在在安装了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>