Я пишу триггер, который отправляет письмо по электронной почте с помощью PHP-почты. Проблема с кодом заключается в том, что он отправляет несколько писем одному получателю. Я даже попытался использовать function singleTo
но даже это, похоже, не сработало.
$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; } }
Я использую почти тот же скрипт, но я также установил это:
while(...) { $mail = new PHPMailer(); //reset class instance to new one ..... $mail->From = $fromAddress; $mail->FromName = $fromAddress; $mail->AddAddress($toAdress); .... }
…. – тот же код, что и у вас
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 } }
Пример кода здесь
$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 = 'yourname@example.com'; $mail->Password = 'yourpassword'; $mail->setFrom('list@example.com', 'List manager'); $mail->addReplyTo('list@example.com', '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 (eg 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("@", "@", $row["email"]) . ') ' . $mail->ErrorInfo . '<br />'; break; //Abandon sending } else { echo "Message sent to :" . $row['full_name'] . ' (' . str_replace("@", "@", $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(); }