2010-12-13 2 views
1

우리는 우리의 뉴스 레터를 보내고 자하는 메일 링리스트가 증가하고 있습니다. 현재 우리는 하루에 1200 명을 보내고 있지만 이것은 상당히 증가 할 것입니다. 대기열에서 이메일을 보내기 위해 매 30 분마다 실행되는 PHP 스크립트를 작성했습니다. 문제는 매우 느립니다 (예를 들어 106 개의 이메일을 보내는 데 총 74.37 초 걸렸습니다). 끊임없이 시간을 초과하기 때문에 최대 실행 시간을 90 초로 늘려야했습니다. 나는 쿼리가 잘못되지 않았는지 점검했고, 너무 오랜 시간이 걸리는 메일 부분을 보내는 것처럼 보였다.PHP PEAR Mail 및 ALT-N Mdaemon pro를 사용하여 대량 이메일 전송 느림보

아래에서 볼 수 있듯이 Mail :: factory ('mail', $ params)를 사용하고 있으며 이메일 서버는 다른 서버에서 호스팅되는 Windows 용 ALT-N Mdaemon 전문가입니다. 또한 테스트를 수행하는 동안 아무도 핫메일 또는 야후 주소로 배달되지 않았으며 심지어는 정크로 집어 들지 않았습니다.

왜 이런 일이 일어날 지 모르는 사람이 있습니까?

foreach($leads as $k=>$lead){ 

$t1->start(); 

$job_data = $jobObj->get(array('id'=>$lead['job_id'])); 

$email = $emailObj->get($job_data['email_id']); 


$message = new Mail_mime(); 
//$html = file_get_contents("1032.html"); 

//$message->setTXTBody($text); 

$recipient_name = $lead['fname'] . ' ' . $lead['lname']; 

if ($debug){ 
    $email_address = DEBUG_EXPORT_EMAIL; 
} else { 
    $email_address = $lead['email']; 
} 
// Get from job 
$to = "$recipient_name <$email_address>"; 
//echo $to . " $email_address ".$lead['email']."<br>"; 

$message->setHTMLBody($email['content']); 

$options = array(); 
$options['head_encoding'] = 'quoted-printable'; 
$options['text_encoding'] = 'quoted-printable'; 
$options['html_encoding'] = 'base64'; 
$options['html_charset'] = 'utf-8'; 
$options['text_charset'] = 'utf-8'; 

$body = $message->get($options); 

// Get from email table 
$extraheaders = array(
     "From" => "Sender <[email protected]>", 
     "Subject" => $email['subject'] 
    ); 

$headers = $message->headers($extraheaders); 

$params = array(); 
$params["host"] = "mail.domain.com"; 
$params["port"] = 25; 
$params["auth"] = false; 
$params["timeout"] = null; 
$params["debug"] = true; 

$smtp = Mail::factory('mail', $params); 

$mail = $smtp->send($to, $headers, $body); 



if (PEAR::isError($mail)) { 

    $logObj->insert(array(
    'type' => 'process_email', 
    'message' => 'PEAR Error: '.$mail->getMessage() 
    )); 
    $failed++; 
} else { 
    $successful++; 
    if (DEBUG) echo("<!-- Message successfully sent! -->"); 

    // Delete from queue 
    $deleted = $queueObj->deleteById($lead['eq_id']); 

    if ($deleted){ 
    // Add to history 
    $history_res = $ehObj->create(array(
     'lead_id' => $lead['lead_id'], 
      'job_id' => $lead['job_id'] 
     ) 
     ); 

    if (!$history_res){ 
    $logObj->insert(array(
    'type' => 'process_email', 
    'message' => 'Error: add to history failed' 
    )); 
    } 
    } else { 
     $logObj->insert(array(
    'type' => 'process_email', 
    'message' => 'Delete from queue failed' 
    ));  
    } 
} 

$t1->stop(); 

} 
+0

이 방법으로 문제가 해결되지는 않지만 메일 링리스트 회사를 고용하여 이메일을 관리하는 것이 좋습니다. 일단 대중 교통 메일을 발송하기 시작하면 실수 할 수 밖에 없습니다. 사용자가 서비스를 제대로받지 못하는 가장 좋은 경우, 최악의 경우 IP가 메일 공급자에 의해 블랙리스트에 올 것입니다. – Stephen

+0

대대적 인 우편 발송을 전문으로하는 회사는 자국의 솔루션보다 훨씬 효율적이고 효과적입니다. 이렇게하면 핵심 제품이나 자산에 대한 작업 시간을 절약 할 수 있습니다. – Stephen

+0

옵션이 될 수 있습니다. 이메일을 관리하고 대기열에 넣기위한 시스템이 이미 있으므로 외부에서 이메일을 보내려합니다. 추천하는 서비스는 무엇입니까? 나는 송풍기를 보았다. 그러나 그것은 우리가 벌써 가지고있는 시스템을 대신 할 것으로 보인다. – Greg

답변

0

말하기 어렵다. 낮은 교수형 과일을 pintpoint하려면 xdebug을 사용하여 코드를 프로파일해야합니다.

또한 전자 메일 (redis/beanstalkd/gearmand/kestrel)을 비동기 적으로 처리하거나 타사 종속성을 사용하여 메시지 대기열을 사용하는 것을 고려해 볼 수 있습니다. 예를 들어 매우 저렴한 Google 애플리케이션 엔진 (받는 사람 당 $ 0.0001)/하루 1000 이메일 무료)/신뢰할 수있는. 귀하의 짐을 고려할 때 하루에 약 10 센트가 소요됩니다.

+0

당신은 이것과 비슷한 것을 말하고 있습니까? http://code.google.com/appengine/docs/python/mail/sendingmail.html 이미 PHP로 작성된 커스텀 메시지 큐를 사용합니다. 큐 자체는 전송 부분 일뿐입니다. – Greg

+0

그건 정확히 제가 언급 한 내용이었습니다. 어쩌면 윤곽을 그리면 더 많은 통찰력을 줄 것입니까? – Alfred

0

당신은 몇 가지 다른 문제에 직면 해 있습니다.

1. )는 정말 큐에서 메일을받을 차례로 (round robin style <의 메일을 처리하는 우편물 큐와 여러 메일 서버를 필요로 이메일을 많이 보내 -이 링크는 관련이 있지만, 사용자의 요구에 완벽하게 특정되지 않은 . [시작하기에 충분합니다.]).

2.) 귀하의 메일은 Hotmail/yahoo에 도착하지 않을 가능성이 두 가지 이유 중 하나입니다.

). 사용자는 RDNS을 올바르게 구성하지 않았으며 IP (heder에서 찾은)가 헤더의 도메인으로 다시 매핑되지 않습니다. 또는

b.) 이미 스팸 발송자로 신고 된 사람은 SPAMHAUS이거나 이미 차단 목록에있는 서비스가 무엇이든간에.