2009-11-03 2 views
4

이메일 뉴스 레터 구독자에게 보낼 페이지를 만들어야합니다. 14000 명 이상의 가입자가 있습니다. php mail() 함수를 사용하여 전자 메일을 보내려합니다. 그러나 나는 그것이 php 30sec max_execution_time 제한에 대한 모든 가입자에게 이메일을 보낼 수 없게 될까 봐 걱정됩니다. 구독자에게 테스트 이메일을 전송하여 이메일을 얼마나 보낼 수 있는지 테스트 할 수 없습니다. 그래서 30 초 max_execution_time 제한으로 mail() 함수로 얼마나 많은 이메일을 보낼 수 있는지 알고 싶습니다. 나를 대답 할 수 있다면 매우 도움이 될 것입니다.30 초의 실행 시간에 얼마나 많은 mail() 함수를 사용할 수 있습니까?

다른 질문 - mysql 실행 시간 또한 PHP로 계산됩니까?

아파치 버전 2.2.13 (유닉스) PHP 버전 5.2.11

+2

이 질문은 시스템의 속도,로드 등의 여러 요인을 고려하지 않습니다. –

+3

잠재적 인 문제는 메일 서버가 블랙리스트에 올라서고 ISP가 전자 메일을 차단하기 시작하는 것입니다. – AdaTheDev

+0

+1하기 전에 누군가의 이전 -1 : 우리는 많은 어려운 숫자를 놓치고 있습니다. 그러나 대답은 숫자에 관한 것이 아니라 올바르게 수행하는 방법입니다. – Wim

답변

4

PHP는 max_execution_time 설정은 사용자 정의 할 수 있습니다. 30 초가 기본값이지만 실행 시간 제한이 전혀없는 경우 0 초로 설정할 수 있습니다. set_time_limit()을 사용하십시오.

set_time_limit(0); 

이렇게하면 모든 이메일을 전송할 수 있습니다.

하나 이상의 이메일을 초당 동일한 메일 서버에 보내는 것에주의하십시오. 블랙리스트에 등록하고 싶지 않습니다.

+1

일부 (대부분?) 메일 서버가 스팸 및 기타 불쾌감을 피하기 위해 들어오는 연결을 차단한다는 것을 잊지 마십시오. 매초마다 하나의 메일을 보내고 max_execution_time이 증가 된 cronjob/background 작업을 사용하는 것이 좋습니다. – Wim

+0

@Wim : 좋은 지적. 이것을 처리 할 수있는 다른 방법이 있습니다. 예를 들어 라운드 로빈 전략을 사용하여 동일한 초에 두 번에 한 서버에 이메일을 보내지 않도록 할 수도 있습니다. 그러면 단일 메일 서버를 망치는 일없이 높은 처리량을 얻을 수 있습니다. – Asaph

+0

@Wim : 스로틀 링에 대한 답변을 업데이트했습니다. – Asaph

3

cronjob에서 실행하거나 백그라운드 작업을 생성하거나 배치 작업에 더 적합한 다른 것을 사용해야합니다.

메일 서버의 속도가 충분히 빠르면 30 초 이내에 14000 개의 이메일을 보낼 수 있지만 구독자가 몇 명 더있어 제대로 작동하지 않으면 어떻게됩니까?

아마 각 사용자에 대해 데이터베이스에 플래그를 설정 한 다음 백그라운드 작업에 의해 전자 메일이 전송 될 때 플래그를 재설정 할 수 있습니다. 메일 서버에 문제가있는 경우 중복을 피하는 데 도움이됩니다.

2

너무 많은 변수에 따라 단일 답변을 사용할 수 없습니다. 요인은 다음과 같습니다

  1. 는 CPU
  2. 는 MTA에 송신 시스템에서 사용할 수있는 대역폭
  3. MTA의 용량의 속도가 밖으로 찾기 위해 이메일을

유일한 방법에 동의 시도 해봐.

-4

정상적인 mailapp에서 10 명에게 동일한 메일을 보내려면 보통 10 개의 동일한 메일을 만들지 않습니까? 아니면 수신자를 보낸 목록에 한 번 추가하여 메일을 보내시겠습니까?

편집 : 대답은 "나는 한 번 보내"입니다 경우에, 나는 당신이 (이 http://www.php.net/mail 여러 수신자에게 보내는 방법을 설명도한다)

+1

맞춤 콘텐츠 ("Hello ") 또는 직접 수신 거부 링크를 원한다면 10 개의 다른 이메일을 보내 드리겠습니다. 내 데스크톱 mailapp 대신에 스크립트를 사용하는 이유는 정확히 무엇입니까? – Wim

+2

불행히도 MTA는 너무 길면 자동으로 보내기 목록을 자릅니다. 또한 구독자 이메일은 종종 구독자 이름으로 개인화됩니다. –

+0

@Wim : True이지만이 경우 의도하지 않은 방식으로 도구를 사용하려고합니다. 그런 경우에는 스크립트에서 mail()을 호출하는 것이 좋습니다. @gnibbler : 물론 메일 당 20 명의 수신자가 있으면 smtp-chats의 수를 많이 줄일 수 있습니다. – Fredrik

0

내가 가진 여기뿐만 아니라 그 방향으로보고해야한다고 생각 이 정확한 문제는 잠시 후에 내 프로젝트 중 하나에 있습니다. 해결책은 실제 사이트에서 보내는 전자 메일을 격리하는 것입니다.

이메일을 보내기 위해 호출 될 작은 클래스를 코딩했습니다. 그것은 템플리트 된 전자 우편을 전달하여 메일 큐의 데이터베이스에 저장합니다. 백 엔드에는 매 X 초마다 메일러 스크립트를 호출하는 크론 작업이있었습니다.스크립트는 이메일에 대한 데이터베이스 대기열을보고 대기열에서 X 번호를 가져 와서 보내려고 (타임 스탬프로 정렬) 배달을 시도합니다. 오류가 발생하지 않았다면 스크립트는 메시지를 보낸 것으로 표시합니다. 다음 단계는 보낸 X 일보다 오래 된 모든 전자 메일을 큐에서 제거하는 것입니다 (로깅을 위해 보관).

희망이 도움이됩니다.