Intereting Posts
как получить информацию о местоположении пользователя с помощью google client api Substr от конца строки php? Как включить файл php.ini для всех каталогов / подкаталогов моего сервера? Данные сеанса Codeigniter потеряны после перенаправления CActiveForm и его поведение не имеют метода или закрытия с именем «getErrors». PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator, восстанавливающий полное дерево Регулярное выражение, замените множественные слэши только одним Заполнение поля выбора из базы данных WordPress: Ajax не работает для вставки, запроса и результатов данных Ошибка SSL: неверный или самозаверяющий сертификат – загрузка изображения Magento в продуктах Перенос физического пути в VIrtual Path в PHP Seting User Agent param в PHP Простой HTML DOM Parser Где найти идентификатор соглашения о выставлении счета, затем использовать его в кассе PHP: не удается отправить ошибку cookie сеанса Хороший способ безопасного загрузки файлов в PHP

PHP mail () BCC – отображает только адрес получателей в заголовке To:

Я пытаюсь BCC к списку подписчиков из базы данных, используя PHP mail (). Все работает, но я сталкиваюсь с проблемой, которая беспокоила меня все утро. Я могу отправить список с помощью BCC, но не могу добавить адрес электронной почты получателя к мертвому «Кому:».

Например, я отправляю список на следующие адреса электронной почты (test1@example.com, test2@example.com и test3@example.com) . Каждый адрес электронной почты получает электронное письмо, а другие адреса электронной почты скрыты из-за BCC.

Моя проблема в том, что в заголовке «To:» отображается пустым на всех концах приема списка. Это я понимаю и знаю, что заголовок не будет отображаться, потому что у меня есть только заголовок BCC в исходящем сообщении. Я задумал цикл цикла, но я получаю все электронные письма, плюс один для этого адреса в одном цикле.

Вот мой рабочий код: Рабочий код включает цикл, который я попытался решить для заголовка To:. Я могу отправить электронное письмо, хотя получаю все электронные письма, которые были отправлены.

 <?php /* Gathers the number of rows within the database. Used for the loop that displays the entire list in the BCC. */ session_start(); include_once '../dbconnect.php'; $result = mysql_query("SELECT * FROM news"); $num_rows = mysql_num_rows($result); $rows = $num_rows; /* Requests the list from the database, please the list in a loop, displays the list only once, and places list in an operator. */ $result = mysql_query("SELECT * FROM `news`"); while($row = mysql_fetch_array( $result )) { for ($x = 1; $x <= 1; $x++) { $contacts.= "".$row['email'].","; } } /* ATTEMPT (It works... sort of): Sends mail to the list using BCC, displays the ONLY receivers email address in the To: header */ $result = mysql_query("SELECT * FROM `news`"); while($row = mysql_fetch_array( $result )) { for ($x = 1; $x <= 1; $x++) { $receiver= "".$row['email'].""; $to = "$receiver"; $subject = 'Test Email'; $headers = "From: example@example.com\r\n"; $headers .= "BCC: $contacts"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; $message = '<html><body>'; $message .= '<h1 style="">Test Message</h1>'; $message .= '</body></html>'; mail($to,$subject, $message, $headers); } } ?> 

Моя общая мысль заключалась в том, чтобы зацикливаться, но я не могу найти решение, которое фактически полностью решает это, BBC в списке и отображает только адрес электронной почты получателя в заголовке To:. Любые мысли или идеи?

Обновление с помощью SMTP-сервера

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

 <?php require_once "Mail.php"; $sub = $_POST['subject']; $ttl = $_POST['title']; $img = $_POST['image']; $bdy = $_POST['body']; $lk = $_POST['link']; mysql_connect("", "", "") or die(mysql_error()) ; mysql_select_db("") or die(mysql_error()) ; $result = mysql_query("SELECT `email` FROM news"); $num_rows = mysql_num_rows($result); $receivers = array(); while ($row = mysql_fetch_array($result)) { $receivers[] = $row['email']; } foreach ($receivers as $receiver) { } $from = "test@example.com"; $to = $receiver; $subject = $sub; $mime = "1.0"; $ctype = "text/html; charset=ISO-8859-1"; $body = ' <html><body> <p>Test Message!</p> </body></html> '; $host = ""; $port = ""; $username = ""; $password = ""; $headers = array ('From' => $from, 'To' => $to, 'Subject' => $subject, 'MIME-Version' => $mime , 'Content-Type:' => $ctype); $smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password)); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); } ?> 

Код содержит некоторые общие улучшения вашего кода. Я добавил встроенные комментарии, чтобы объяснить, что я сделал.

 <?php // General thing: If you do not need a session, do not start one ;) session_start(); include_once '../dbconnect.php'; // Select only what you really need from the table. This saves you memory // and it speeds up the query. $result = mysql_query("SELECT `email` FROM news"); // You are not using these numbers in the script you showed us. I am just // leaving them in here to show you, how you can reuse the "$result" // variable without querying the database again. $num_rows = mysql_num_rows($result); // We are reusing the "$result" here without re-querying the database, which // speeds the whole process up and takes load away from the database. We are // storing all receivers in a dedicated variable, to reuse them later on. $receivers = array(); while ($row = mysql_fetch_array($result)) { $receivers[] = $row['email']; } // Now, instead of querying the database again, we are using our stored mail // addresses in "$receivers" to send the emails one by one. We could have // done this part in the "while" loop before, but I wanted to stay close to // your code, so you would recognize it ;) foreach ($receivers as $receiver) { // I have removed the "for" loop here, because it runs only once. If a loop // only runs once and you control all its input, you really do not need a // loop at all (except some exceptions, just in case someone knows one^^). // You can actually just put the value of $receiver in $to. PHP is pretty // good at typecasting of scalar types (integers, strings etc.), so you do // not need to worry about that. $to = $receiver; $subject = 'Test Email'; // I am putting the headers into an array and implode them later on. This // way we can make sure that we are not forgetting the new line characters // somewhere. $headers = array( "From: example@example.com", "MIME-Version: 1.0", "Content-Type: text/html; charset=ISO-8859-1", // I have removed the "BCC" header here, because this loops send out an // email to each user seperately. It is basically me sending an email to // you. Afterwards I copy&paste all the content to another new mail and // send it to another fella. You would never know that you both got the // same mail ;) ); $message = '<html><body>'; $message .= '<h1 style="">Test Message</h1>'; $message .= '</body></html>'; // Imploding the headers. $imploded_headers = implode("\r\n", $headers); mail($to, $subject, $message, $imploded_headers); } 

Этот код в основном отправляет по электронной почте один раз. Никто, кто получает такое электронное письмо, не знает, к каким адресам электронной почты отправляется электронное письмо.

Как уже упоминалось в коде, этот фрагмент может быть дополнительно оптимизирован. Поскольку отправка электронной почты сама по себе является довольно сложной областью, я бы предположил, что вы найдете какую-то библиотеку PHP, которая связывает все это и работает с ней. Вы можете совершить так много ошибок со всей отправкой электронной почты, что я не буду запускать такой сценарий на производстве, если вы не захотите сразу пометить его как спам.

Добавьте \r\n в:

 $headers .= "BCC: $contacts\r\n"; 

Каждый заголовок должен быть на новой строке.