Intereting Posts
php mail несколько получателей Использование PHP для удаления выбранного элемента из раскрывающегося списка, среди прочих Сообщение электронной почты CodeIgniter SMTP – символы заменены одинаковыми знаками echo html значение тега отдельно для разных блоков Почему `set_radio` не работает, когда включена опция form_validation? Как избежать открытия двух окон браузера? Неустранимая ошибка: превышено максимальное время выполнения 300 секунд Обновление базы данных SQL с использованием значений флажка Проводящие параметры Axios не читаются $ _POST Избегайте ленивой загрузки Doctrine Symfony2 Переменные расширения класса переменной в PHP – возможно ли это? Заглавные буквы в имени класса PHP загрузка контекста canvas в качестве изображения с использованием ajax и php Прочитать персидский (Unicode chars) текстовый файл, используя php Ошибка «Невозможно использовать строковое смещение как массив»

Как отправить электронное письмо нескольким получателям из запроса базы данных (PHP)

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

function sendmail($cat, $user) { require_once "Mail.php"; $elist = mysql_query("SELECT cEmail FROM tblUsers WHERE cAlerts = 'All' AND cEAlerts = 'Yes' AND cPreferences LIKE '%$cat%';"); $elist = mysql_fetch_array($elist); $from = "EMAIL ADDRESS"; $to = $elist; $subject = "SUBJECT"; $body = "BODY"; $host = "smtp.domain.com"; $username = "USERNAME"; $password = "PASSWORD"; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); } 

Попробуйте что-то подобное, но нужно отметить, что вы должны отправлять электронную почту индивидуально, чем группировать все свои адреса электронной почты в одном поле «Кому». Другим пользователям может не понравиться, что другие видят это. Возможно, ваша функция smtp разбивает массив, не уверен: – |

 function sendmail($cat, $user) { require_once "Mail.php"; $elist = mysql_query("SELECT cEmail FROM tblUsers WHERE cAlerts = 'All' AND cEAlerts = 'Yes' AND cPreferences LIKE '%$cat%';"); $from = "EMAIL ADDRESS"; $subject = "SUBJECT"; $body = "BODY"; $host = "smtp.domain.com"; $username = "USERNAME"; $password = "PASSWORD"; if(mysql_num_rows($elist) > 0) { while($elist_result = mysql_fetch_array($elist)) { $headers = array ('From' => $from, 'To' => $elist_result['cEmail'], 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); } } } 

mysql_fetch_array извлекает массив с элементами, соответствующими каждому mysql_fetch_array одной строки таблицы. Другими словами, здесь это массив, содержащий столбец cEmail одного пользователя.

Перед вызовом функций почты вам нужно получить все значения в один массив. Вы можете сделать это так:

 $dest = array(); while ($arr = mysql_fetch_array($elist)) { $dest[] = $arr['cEmail']; } 

У меня была аналогичная проблема, пытаясь зациклиться на моей базе данных получателей с целью отправки персонализированных писем PEAR каждому получателю.

Проблема, с которой я столкнулся, заключалась в том, что цикл будет прекращен после одной итерации, пока я не изменю $recipients чтобы просто отправить первый элемент в массиве, как показано в этом фрагменте кода. ( $recipients – массив идентификаторов для получателей):

 /*PEAR mail set-up code included here*/ for ($i = 0; $i < count($recipients); $i++) { $sql_recipients = "SELECT * FROM $data_table WHERE id = $recipients[$i] ORDER BY id ASC "; $res_recipients = mysqli_query($mysqli,$sql_recipients) or die (mysqli_error($mysqli)); $recipients_info = mysqli_fetch_array($res_recipients); $recip_id = $recipients_info['id']; $recip_organisation = $recipients_info['organisation']; $recip_fname = $recipients_info['fname']; $recip_lname = $recipients_info['lname']; $recip_email = $recipients_info['email']; /*PEAR mail code here */ $recipients[0] = $recip_email; $mail->send($recipients[0], $hdrs, $body); } 

Я научился этому из одного из примеров в книге, в которой изучаю PHP, Head First PHP и MySQL .

Что вы можете сделать, это отправлять каждое электронное письмо индивидуально, но одновременно, через цикл while. Когда mysqli_query выбирает электронные письма, создайте цикл while, который проходит через мой

 while ($row_data = mysqli_fetch_array($your_query_in_a_variable)) { // Then you will set your variables for the e-mail using the data // from the array. $from = 'you@yoursite.com'; $to = $row_data['email']; // The column where your e-mail was stored. $subject = 'Open Me!'; $msg = 'Hello world!'; mail($to, $msg, $from); } 

Надеюсь, это ясно. Вы просто просто вызываете строки, которые хотите в своем запросе, а затем используйте mysqli_fetch_array , который проходит каждую строку каждый раз, когда он вызывается (кто-то меня исправляет, если не так) и выйдет, когда больше не осталось строк, которые были вызваны.

Мое предложение будет использовать функцию php mail () и установить параметры smtp-сервера в файле php.ini.

Затем все, что вам нужно сделать, это запросить свой дБ, вытащить первую запись в качестве адреса, а затем прокрутить результирующий набор и поместить каждый адрес электронной почты в массив. Затем просто используйте функцию join для объединения массива с запятыми и используйте его как BCC для строки заголовка.

Вот что я буду использовать, если это возможно. Я включил пару заметок в качестве // комментариев

 function sendmail($cat, $user) { $result = mysql_query("SELECT cEmail FROM tblUsers WHERE cAlerts = 'All' AND cEAlerts = 'Yes' AND cPreferences LIKE '%$cat%';"); //pull out first email as the to address $to = mysql_fetch_array($result); //create array to store all the emails $elist = array(); //loop through and put each email into an array // you might be able to skip this altogether if you can just join $result // but I'm to lazy to investigate what all is being returned while($row = mysql_fetch_assoc($result)){ $elist[] = $row['cEmail']; } //join the emails into a comma separated string $bcc = join($elist, ","); $from = "EMAIL ADDRESS"; $subject = "SUBJECT"; $body = "BODY"; $headers = "From: ". $from ."\r\n"; $headers .="BCC: ". $bcc ."\r\n"; mail($to, $subject, $body, $headers); } 

Надеюсь, это полезная информация. Не стесняйтесь выбирать ее и использовать все, что вам может понадобиться, например, если вы можете использовать часть для реализации своего класса Mail.

Вы не должны использовать функцию php mail() . Он медленный, потому что он полностью подключается к SMTP-серверу по каждой отправляемой вами почте.
Хорошая почтовая библиотека, такая как Zend_Mail, подключается только один раз и доставляет почту в одной партии на SMTP-сервер.
Вы также не должны отправлять все свои письма через длинную линию BCC. По крайней мере, если вы хотите, чтобы ваша электронная почта не была помечена как спам (см. Этот вопрос и этот блог-запись от Джеффа).

 <?php function sendmail($cat, $user) { // Setup mailer require_once "Mail.php"; $smtp = Mail::factory('smtp', array( 'host' => "smtp.domain.com"; 'auth' => true, 'username' => "USERNAME"; 'password' => "PASSWORD"; )); // ALWAYS escape your variables! $query = sprintf("SELECT cEmail FROM tblUsers WHERE cAlerts = 'All' AND cEAlerts = 'Yes' AND cPreferences LIKE '%s'", mysql_real_escape_string($cat), // submit the query $result = mysql_query($query); // iterate over each row while ($row = mysql_fetch_assoc($result)) { $from = "EMAIL ADDRESS"; $to = $row['cEmail']; $subject = "SUBJECT"; $body = "BODY"; $headers = array( 'From' => $from, 'To' => $to, 'Subject' => $subject ); // Send mail with individual to-address via smtp $mail = $smtp->send($to, $headers, $body); } } 

Используйте этот код для решения вашей проблемы. Надеюсь, это действительно поможет вам.

  //Connect to database mysql_connect("localhost","user","password") or die(mysql_error()); mysql_select_db("db") or die(mysql_error()); $sql = "SELECT email FROM members"; $res = mysql_query($sql) or die(mysql_error()); while($row = mysql_fetch_assoc($res) ) { $area .= $row['email']. ", "; } // read the list of emails from the file. $email_list = explode(',', $area); // count how many emails there are. $total_emails = count($email_list); // go through the list and trim off the newline character. for ($counter=0; $counter<$total_emails; $counter++) { $email_list[$counter] = trim($email_list[$counter]); } $to = $email_list; echo $to; 

Надеюсь, вы избавитесь от проблемы. Всего наилучшего.