我们的CF服务器偶尔会停止处理邮件。这是有问题的,因为我们的许多客户都依赖它。
我们在网上发现在无法投递的文件夹中提到零字节文件的建议,因此我创建了一个每三分钟删除一次的任务。但是,再次发生了停工。
我正在寻找诊断和解决此问题的建议。
添加了:
新增2:
新增3:
答案 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>