Почтовая очередь ColdFusion прекращает обработку

StackOverflow https://stackoverflow.com/questions/94932

  •  01-07-2019
  •  | 
  •  

Вопрос

Наш 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 Admin в разделе Настройки почтового спула снимите флажок "Сохранять почтовые сообщения для доставки".)

Иногда у меня возникает такая же проблема, и это не из-за файла с нулевым байтом, хотя эта проблема возникала в прошлом.Похоже, что один или два файла (самые старые в папке) будут препятствовать обработке очереди.Что я делаю, так это перемещаю все сообщения в папку хранения, перезапускаю очередь почты и копирую сообщения обратно по частям в обратном хронологическом порядке, жду, пока они выйдут, и перемещаю еще несколько.Сообщения, которые задерживали очередь, помещаются в отдельную папку для проверки в последнюю очередь.

Вероятно, вы можете программно сделать это с помощью остановка очереди, перемещая самый старый файл в другую папку, затем запуск очереди отправки почты и проверьте, успешно ли началась отправка, проверив количество файлов в папке и даты.Если удаление самого старого файла не сработало, повторяйте предыдущий процесс до тех пор, пока все нежелательные почтовые файлы не будут перемещены и отправка успешно не продолжится.

Я надеюсь, что это поможет.

На самом деле у нас идентичная настройка, 32-битный CF8 на Win2K3.

Мы использовали решение Бена около года назад, и это, несомненно, помогло автоматически ставить в очередь застрявшие электронные письма.

Однако недавно без особой причины один из наших 7 веб-серверов решил переходить в это состояние при каждой попытке отправки электронной почты.

При настройке параметров почтового сервера возникло исключение.Это исключение было вызвано:исключение coldfusion.mail.MailSessionException:При настройке параметров почтового сервера возникло исключение ..

Каждый из наших веб-серверов является идентичным клоном друг друга, так что странно, почему это происходило только с этим.

Еще один момент, на который следует обратить внимание, - это то, что у нас был скрипт, который перезагружал компьютер посреди ночи из-за проблем с управлением памятью JRUN.Акт перезагрузки, по-видимому, и вызвал проблему.Последующий перезапуск службы CF очистит ее, и с машиной все будет в порядке до тех пор, пока она снова не перезагрузится.

Мы обнаружили, что проблема связана со сканером вирусов McAfee, после обновления которого для исключения каталога c:\ColdFusion8 проблема исчезла.

Надеюсь, это поможет.

В CFMX 8 есть / была проблема со спулером почты и сообщениями с вложениями, которая была исправлена с помощью одного из исправлений.В версии 8.0.1, по крайней мере, это должно было быть исправлено.

В коде Бена Дума есть ошибка.В любом случае, спасибо тебе, Бен, код отличный, и сейчас мы используем его на одном из наших серверов с установленным CF8, но:если каталог (\spool) пуст, код завершается с ошибкой (error:Значение даты, переданное функции date DateDiff, не указано или недопустимо.) Это связано с тем, что если каталог объекта запроса пуст (spool.recordcount РАВЕН 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