2012-09-21 6 views
0

뉴스 레터 가입자가있는 2000 개의 이메일 목록이 있다고 가정하고 대량 메일을 보내야합니다. 서버는 스팸을 방지하기 위해 이메일을 보낼 때 시간 제한이 있습니다.SwiftMailer의 Throttle Plugin을 사용하면 서버 연결이 끊어집니다.

일부에는 시간당 300 또는 500 개의 이메일이 충분합니다.

스로틀 메일러를 사용하여 스로틀 플러그인을 사용하여 분당 8 개의 이메일 (8 * 60 분 = 총 500 개의 메일 중 500 개 이하의 메일)을 보내는 동안 서버는 연결을 닫고 "404 - 찾을 수 없음 페이지"로 응답합니다.

괴상한 것은 스크립트 실행 중에 100 개 이하의 이메일을 보냈지 만 여전히 서버는 프로 시저를 무한 루프에 빠뜨리고 스크립트 실행을 종료한다는 것입니다.

스로틀 플러그인을 사용하지 않고 즉시 500 개의 이메일을 보내려고하면 매력처럼 작동합니다. 하지만 1500 또는 2000과 같은 이메일을 더 보내야하는 경우 어떻게해야합니까?

나는 스로틀 플러그인을 읽고 PHP의 기본 함수 인 sleep()을 사용합니다.이 기능은 이와 같은 상황에서 올바르게 작동합니다.

프로세스가 HTTP 프로토콜이 아닌 Cron 작업을 통해 실행되는 경우 작동 할 수 있다고 알려졌습니다. 나는 wget과 curl을 사용하여 cron 작업을 설정했지만 아직도 운이 없다는 것을 시도했다.

내가 수행 한 연구에서 배운 것은 Swiftmailer와 함께 SMTP 서버를 사용할 때 3 초 프로세스가 28 초 (길어야)가 걸리는 것입니다. 모든 쿼리가 모두 최적화되고 모든 데이터가 서버에 과부하가 걸리지 않고 메모리에 올바르게 배치됩니다.

그 후 나는 SMTP를 사용하지 않고 한 번 시도해보기로 결정했으나 Throttler Plugin은 작동하지 않았다.

모든 제안 또는 권장 사항을 높이 평가할 것입니다.

편집 : 또한이 읽은 : 물론 SwiftMailer Batch email times my Server out

을 나는이 사용

ignore_user_abort(true); 
set_time_limit(0); 
ini_set('max_execution_time', 0); 
ini_set('memory_limit', '256M'); 
ini_set('mysql.connect_timeout', 500); 
ini_set('default_socket_timeout', 500); 

PS를 :가를 계산 있도록 나는 지금 스크립트의 동작을 변경하도록 강요했다 서버의 한도는 분당 이메일에 대한 사용자 입력을 기준으로하며 활성 가입자의 총 수가 적은 경우 발송할 이메일에 대해 스로틀 플러그인없이 전송합니다.

따뜻한 안부, 조지 Girtsou

답변

3

나는 이것이 당신의 SMTP 연결의 시간 제한과 관련이 있다고 생각합니다.

루프에서 전자 메일을 처리하고 Throttle Plugin과 결합하면 Swiftmailer는 SMTP 서버와의 연결을 닫을 기회를 얻지 못하며 ONE에서 보낸 전자 메일 수의 제한이있을 수 있습니다 단일 연결뿐입니다. 이 전송되는 X의 메일 후 SMTP 연결을 닫고 다시 연결 될 때까지 Y 초를 기다리는뿐만 아니라 조합에 AntiFlood 플러그인을 얻을하는 것이 좋습니다 이유

는 그입니다.

$transport->start()$transport->stop()은 플러그인이 사용하는 SMTP 서버에 수동으로 연결하고 연결을 끊는 방법입니다.

SMTP 전송의 경우 흥미로운 시간 초과 매개 변수가 있습니다.

멋진 오류 처리를 위해 try {} catch {}에서 코드를 작성하는 것도 좋습니다.

호프가 도움이되기를 바랍니다.

관련 문제