2013-09-03 2 views
0

Я пишу триггер, который отправляет письмо по электронной почте с помощью PHP-почты. Проблема с кодом заключается в том, что он отправляет несколько писем одному получателю. Я даже попытался использовать function singleTo, но даже это, похоже, не сработало.Отправка нескольких писем в PHP Mailer

$mail = new PHPMailer(); 

for($i = 0; $i <= sizeof($emailid); $i++) { 
    $mail->WordWrap = 50;        
    $mail->IsHTML(true);         
    $mail->SingleTo = true; 
    $mail->AddAddress($emailid[$i],$name[$i]); 
    $mail->Subject = 'Some Subject'; 
    $mail->Body = "Some Body"; 
    $mail->AltBody = "Some Body"; 

    $errornumber[$i] = 1; 

    if(!$mail->Send()) { 
     $errorinfo[$i] = $mail->ErrorInfo; 
     $errornumber[$i] = 0; 
    } 
} 
+1

Каковы значения '$ emailid [$ i]' и '$ name [$ i]'? – jterry

+0

Какова ценность 'sizeof ($ emailid)'? –

+0

Это идентификаторы почты и их имена @jterry –

ответ

0

Я использую почти такой же сценарий, но Я также установить это:

while(...) 
{ 
    $mail = new PHPMailer(); //reset class instance to new one 
    ..... 
    $mail->From = $fromAddress; 
    $mail->FromName = $fromAddress; 
    $mail->AddAddress($toAdress); 
    .... 
} 

.... - такой же код, как у вас есть

+0

большое спасибо! Код теперь работает нормально! –

11

AddAddress() просто добавляет новый адрес в конец массива адресов. Если вы хотите отправлять отдельные электронные письма, для каждого адреса, вам нужно будет очистить этот список на каждой итерации, например.

for(...) { 
    $mail->AddAddress(...); 
    $mail->send(); 
    $mail->ClearAddresses(); // <---you need this line. 
} 

Если один пользователь получает несколько писем, то вам потребуется код, чтобы определить, когда вы уже отправили один, например:

$sent = array(); 
for(...) { 
    if (isset($sent[$email[$i]])) { 
     continue; // check if sent already, skip if so 
    } 
    ... 
    if ($mail->send()) { 
    $sent[$email[$i]] = true; // flag address as already sent 
    } 
} 
+0

Мне нравится этот ответ, потому что если вы отправляете один и тот же адрес электронной почты различным получателям, нет необходимости перестраивать электронную почту ... вам просто нужно изменить получателя. +1 Спасибо! –

2

пример кода является here

$mail = new PHPMailer(); 

$body = file_get_contents('contents.html'); 

$mail->isSMTP(); 
$mail->Host = 'smtp.example.com'; 
$mail->SMTPAuth = true; 
$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead 
$mail->Port = 25; 
$mail->Username = '[email protected]'; 
$mail->Password = 'yourpassword'; 
$mail->setFrom('[email protected]', 'List manager'); 
$mail->addReplyTo('[email protected]', 'List manager'); 

$mail->Subject = "PHPMailer Simple database mailing list test"; 

//Same body for all messages, so set this before the sending loop 
//If you generate a different body for each recipient (e.g. you're using a templating system), 
//set it inside the loop 
$mail->msgHTML($body); 
//msgHTML also sets AltBody, so if you want a custom one, set it afterwards 
$mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; 

//Connect to the database and select the recipients from your mailing list that have not yet been sent to 
//You'll need to alter this to match your database 
$mysql = mysql_connect('localhost', 'username', 'password'); 
mysql_select_db('mydb', $mysql); 
$result = mysql_query("SELECT full_name, email, photo FROM mailinglist WHERE sent = false", $mysql); 
while ($row = mysql_fetch_array($result)) { 
     $mail->addAddress($row['email'], $row['full_name']); 
     $mail->addStringAttachment($row['photo'], 'YourPhoto.jpg'); //Assumes the image data is stored in the DB 

     if (!$mail->send()) { 
     echo "Mailer Error (" . str_replace("@", "&#64;", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />'; 
     break; //Abandon sending 
     } else { 
      echo "Message sent to :" . $row['full_name'] . ' (' . str_replace("@", "&#64;", $row['email']) . ')<br />'; 
      //Mark it as sent in the DB 
      mysql_query(
      "UPDATE mailinglist SET sent = true WHERE email = '" . mysql_real_escape_string($row['email'], $mysql) . "'" 
      ); 
     } 
     // Clear all addresses and attachments for next loop 
     $mail->clearAddresses(); 
     $mail->clearAttachments(); 
} 
Смежные вопросы