2008-09-18 6 views
13

CF 서버가 메일 처리를 중지하는 경우가 있습니다. 많은 고객이 이에 의존하기 때문에 문제가됩니다.ColdFusion 메일 큐 처리가 중지됩니다.

배달 할 수없는 폴더에 0 바이트 파일을 언급하는 제안이 온라인에서 발견되어 3 분마다 제거하는 작업을 만들었습니다. 그러나 다시 파업이 발생했습니다.

이 문제를 진단하고 해결하기위한 제안을 찾고 있습니다.

  • CF 8 표준
  • Win2k3

추가 :

  • 메일 로그에 오류가 큐가
  • 우리는 실행 시도하지 않은 실패시이 없습니다 대기열을 사용하지 않고, 많은 양의 메일을 보내므로

추가 2 :

  • 는 스풀 폴더에있는 파일 중 하나에 문제가 될 것 같지 않습니다. 메일 대기열을 다시 시작하면 모두 올바르게 처리되는 것처럼 보입니다.

추가 된 3 : 우리는 첨부 파일을 사용하지 않는

  • .

답변

13

우리가 한 일 :

두 개의 예약 된 작업을 작성했습니다. 먼저 큐 폴더에 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> 
+0

나는 이상한 등이 주기적으로 발생하도록 사용되며, "<." 우리는 그 원인을 절대로 발견하지 못했습니다. 우리는 100 개의 동일한 메일을 보낼 수 있었고, 35 번째는 질식 할 것입니다 ... 가장 오래된 것을 제거하는 것은 ...모니터링 할 proc을 설정하면 그 기괴한 기록되지 않은 jrun 딸꾹질에 훌륭한 솔루션입니다. – OhkaBaka

+0

동일한 문제가 발생했지만 여기에 설명 된대로 MailSpoolService를 중지했다가 시작하면 문제가 발생하지 않습니다. ColdFusion을 다시 시작하면됩니다. 누구든지 Coldfusion을 다시 시작해야 할 필요가없는 다른 방법을 제안 할 수 있습니까? – Loftx

+0

@Loftx - 어떤 이메일 서버를 사용하고 있습니까? 우리는 Exchange를 사용해야하는 권한이있을 때만이 문제를 경험했습니다. 작은 SMTP 릴레이 시스템을 사용할 수 있습니까? 무료 버전의 MailEnable은 우리 프로덕션 환경에서 잘 작동합니다. –

3

전체적으로 대기열을 우회하려고 했습니까? (CF 관리자의 메일 스풀 설정에서 "배달 할 메일 메시지 스풀링"을 선택 해제하십시오.)

3

가끔씩 같은 문제가 발생하며 이전에는 문제가 없었지만 0 바이트 파일이 아닙니다. . 하나 또는 두 개의 파일 (폴더에서 가장 오래된 파일)이 처리 대기열을 유지하는 것처럼 보입니다. 내가하는 일은 모든 메시지를 대기 폴더로 옮기고, 메일 대기열을 다시 시작하고, 한 번에 청크로 메시지를 역순으로 복사 한 다음, 나가서 더 이상 이동하기를 기다립니다. 대기열을 보류하고 있던 메시지는 나중에 검사 할 별도의 폴더에 저장됩니다.

아마도 프로그래밍 방식으로 stopping the queue, 가장 오래된 파일을 다른 폴더로 이동 한 다음 start the mail queue으로 이동하고 폴더 파일 수와 날짜를 확인하여 전송이 시작되는지 확인할 수 있습니다. 가장 오래된 파일을 제거해도 문제가 해결되지 않으면 문제가되는 모든 메일 파일이 이동되고 전송이 성공적으로 완료 될 때까지 이전 프로세스를 반복하십시오.

도움이 되었기를 바랍니다.

0

메일 스풀러에 문제가 있거나 CFMX 8에 첨부 파일이있는 메시지 중 하나가 핫픽스로 수정되었습니다. 버전 8.0.1은 적어도 수정되어 있어야합니다.

5

We have not tried to run this without using the queue, due to the large amount of mail we send

에 관계없이, 당신 이 스풀링 해제를 시도? 나는 메일이 0.5 초 안에 500-600 메시지의 속도로 전송되는 것을 보았습니다. 그리고 이것은 진절머리 나는 서버의 일종입니다.표준 페이지 타임 아웃을 60 초로 설정하면 페이지가 만료되기 전에 ~ 72,000 개의 이메일을 보낼 수 있습니다. 한 번에 72,000 개 이상을 보냈습니까?

내가 CFMail을 사용하기 전에 사용했던 대안은 맞춤 스풀러를 만드는 것이 었습니다. 전자 메일을 즉시 전송하는 대신 데이터베이스 테이블에 저장하십시오. 그런 다음 예약 된 작업을 설정하여 몇 백 개의 메시지를 보내고 테이블이 비어있게 될 때까지 몇 분 후에 다시 일정을 잡으십시오.

Google에서 작업을 하루에 한 번 실행하도록 예약했습니다. 테이블이 비어 있지 않으면 몇 분 안에 다시 실행되도록 자체 일정을 조정할 수 있습니다. 절대로 문제가 없었습니다.

2

우리는 실제로 동일한 설정을 가지고, Win2K3에 32 비트 CF8.

우리는 약 1 년 전에 Ben의 솔루션을 사용했는데, 그게 확실한 자동 대기열 이메일을 도왔습니다.

최근에 특별한 이유없이 우리 웹 서버 중 하나가 모든 이메일 시도로이 상태에 들어 가기로 결정했습니다.

An exception occurred when setting up mail server parameters. This exception was caused by: coldfusion.mail.MailSessionException: An exception occurred when setting up mail server parameters..

각 웹 서버는 서로 동일한 복제본이므로 왜 그렇게 이상하게 생겼을까요?

또 다른 중요한 점은 JRUN의 메모리 관리 문제로 인해 한밤중에 컴퓨터를 재부팅하는 스크립트가 있다는 것입니다. 재부팅으로 인해 문제가 시작된 것 같습니다. 그런 다음 CF 서비스를 다시 시작하면이 서비스가 지워지고 시스템이 다시 부팅 될 때까지 정상적으로 작동합니다.

이 문제는 McAfee 바이러스 스캐너와 관련이 있으며 c : \ ColdFusion8 디렉토리를 제외하도록 업데이트 한 후 문제가 없어졌습니다.

희망이 있습니다.

0

Ben Doom의 코드에 버그가 있습니다. 어쨌든 벤 감사합니다. 코드는 훌륭합니다. 우리는 CF8이 설치된 서버에서이 코드를 사용합니다 : 디렉토리 (\ spool)가 비어 있으면 코드가 실패합니다 (오류 : DateDef 함수가 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="[email protected]" 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="[email protected]" subject="cfmailqueue restarted by daemon" server="xxx" port="25" from="xxxx" username="xxxx" password="xxx" replyto="xxxx"> 
    2/2 action: ...succeeded! 
    #now()# 
    </cfmail> 

</cfif>