Intereting Posts

PHPmailer – множественная отправка электронной почты

Я отправляю письма с помощью PHPmailer. На данный момент мне удалось отправить электронное письмо по одному адресу. Теперь я хочу отправить несколько электронных писем всего за один клик.

ПРОБЛЕМА : Я попытался использовать некоторые петли ниже, чтобы отправить несколько писем, но я ошибаюсь. Да, он отправляет электронную почту, но только по одному адресу, и адрес электронной почты получает все письма, которые должны быть отправлены по электронной почте на другие электронные письма.

Например, когда я отправляю 17 писем, эти 17 писем отправляются только по одному адресу. Письма должны быть отправлены в соответствии с адресами в базе данных с соответствующими уникальными вложениями. Пример: abc@gmail.com должен иметь abc.pdf, а 123@gmail.com должен иметь прикрепленный файл 123.pdf.

Я думаю, что это в цикле. Пожалуйста, помогите мне разобраться. Благодарю.

require_once('phpmailer/class.phpmailer.php'); include("phpmailer/class.smtp.php"); $mail = new PHPMailer(); $body = file_get_contents('phpmailer/body.html'); $body = preg_replace('/\/b]/','',$body); $file ='phpmailer/mailpass.txt'; if($handle = fopen($file,"r")){ $contentpass = fread($handle,'15'); fclose($handle); } $mail->IsSMTP(); $mail->Host = "smtp.gmail.com"; $mail->SMTPDebug = 1; $mail->SMTPAuth = true; $mail->SMTPSecure = "tls"; $mail->Host = "smtp.gmail.com"; $mail->Port = 587; $mail->Username = "email@gmail.com"; $mail->Password = $contentpass; $mail->SetFrom("email@gmail.com", "Subject"); $mail->AddReplyTo("email@gmail.com","Subject"); $mail->Subject = "Subjects"; $mail->AltBody = "Subject"; $mail->MsgHTML($body); $file='current_schoolyear.txt'; if($handle = fopen($file,"r")) { $content = fread($handle,'9'); fclose($handle); } $input = addslashes($_POST['depchair']); $email = "select email_address from sa_student where schoolyear = '$input'"; if ($p_address=mysql_query($email)) { while($row = mysql_fetch_assoc($p_address)) { $mail->AddAddress($row['email_address']); $input = addslashes($_POST['depchair']); $control = "select control_no from sa_student where schoolyear = '$input'"; if($ctrl=mysql_query($control)){ $ctrl_no = mysql_result($ctrl, 0); $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf"); } else { echo "No attached document."; } if(!$mail->Send()) { $message = "<div class=\"nNote nFailure\" > <p>Error sending email. " . $mail->ErrorInfo ."</p> </div>"; } else { $message = "<div class=\"nNote nSuccess\" > <p> Email have been sent to the examinees in ".$input_depchair. "! </p> </div>"; } } } else { echo (mysql_error ()); } 

ОБНОВЛЕННЫЙ КОД: После выполнения приведенного ниже кода я смог отправить электронное письмо и с правильным вложением. Однако был отправлен только один электронный адрес (последний адрес электронной почты в базе данных), а остальные электронные письма не были отправлены.

 $input = addslashes($_POST['depchair']); $email = "select email_address, control_no from sa_student where schoolyear = '$input'"; if ($p_address=mysql_query($email)) { while($row = mysql_fetch_assoc($p_address)) { $cloned = clone $mail; $cloned->AddAddress($row['email_address']); $cloned->AddAttachment("fpdf/pdf_reports/document/".$row['control_no'].".pdf"); if(!$cloned->Send()) { $message = "<div class=\"nNote nFailure\" > <p>Error sending email. " . $mail->ErrorInfo ."</p> </div>"; } else { $message = "<div class=\"nNote nSuccess\" > <p> Email have been sent to the examinees in ".$input_depchair. "! </p> </div>"; } unset( $cloned ); } } else { echo (mysql_error ()); } 

Related of "PHPmailer – множественная отправка электронной почты"

После отправки электронной почты $mail->Send() выполните следующее:

 $mail->ClearAllRecipients(); 

в вашем цикле while.
Итак, ваша базовая структура цикла выглядит следующим образом:

 while($row = mysql_fetch_assoc($p_address)){ $mail->AddAddress($row['email_address']); $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf"); $mail->send(); $mail->ClearAllRecipients(); $mail->ClearAttachments(); //Remove all attachements } 

Внутри цикла создайте клон объекта $mail – перед добавлением получателя и вложения – затем используйте клон для отправки электронной почты. Следующая итерация цикла создаст новый клон, свободный от предыдущего адреса и вложения:

 while($row = mysql_fetch_assoc($p_address)) { $cloned = clone $mail; $cloned->AddAddress($row['email_address']); // add attchment to $cloned, etc. if ( $cloned->send() ) { /* etc */ } unset( $cloned ); } 

Это «очистит» ваши изменения в каждой итерации (например, адрес, вложение и т. Д.), Без необходимости повторного ввода свойств конфигурации (например, из, хоста и т. Д.).

Приложение:

Ваши вложения, вероятно, будут одинаковыми, потому что вы не получаете новые результаты для этих строк (в вашем цикле):

 $input=addslashes($_POST['depchair']); $control = "select control_no from sa_student where schoolyear = '$input'"; if ($ctrl=mysql_query($control)) { $ctrl_no = mysql_result($ctrl, 0); $mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf"); } 

$ctrl_no всегда будет возвращать тот же результат, потому что (я предполагаю) $_POST['depchair'] не изменяется – таким образом, $input , $control , $ctrl и $ctrl_no все остаются (эффективно) одинаковыми для каждого цикла. Вам нужно найти то, что вы на самом деле намерены быть $ctrl_no для каждого цикла – прямо сейчас вы используете один и тот же снова и снова.

Возможно, следующий запрос может помочь:

 // replace // $email = "select email_address from sa_student where schoolyear = '$input'"; // with: $students_query = "select email_address, control_no from sa_student where schoolyear = '$input'"; // then // if ($p_address=mysql_query($email)) { // while($row = mysql_fetch_assoc($p_address)) { // becomes if ( $students=mysql_query($students_query) ) { while ( $row = mysql_fetch_assoc( $students ) ) { // so that finally, etc $cloned->AddAddress($row['email_address']); $ctrl_no = $row['control_no']; 

Это вытаскивает как адрес электронной почты студента, так и их control_no в том же запросе, чтобы убедиться, что они остаются связанными друг с другом через цикл. Затем вы можете избавиться от второго запроса среднего цикла, так как все необходимые вам результаты были вытащены в первом запросе вне цикла. Вышеупомянутый не все код, который вам нужно изменить, только критические части.