- Отправка письма нескольким получателям
- Добавить комментарий Отменить ответ
- Контакты
- Рубрики
- Свежие записи
- Популярные записи
- Архивы
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- Какое есть в PHP механизм отправка письма по очереди нескольким получателям?
- Войдите, чтобы написать ответ
- Как работать с Cookie при многосайтовости на разных доменах?
- Как отправлять почту на несколько ящиков сразу?
Отправка письма нескольким получателям
Чтобы отправить письмо сразу нескольким получателем, как и в предыдущем рецепте, можно воспользоваться php функцией mail. Единственное отличие от прошлого примера, будет заключаться в том, что параметр, передающий e-mail получателя, будет содержать не один адрес, а несколько, разделенных запятыми.
Пример:
// массив получателей письма $arrayTo = array( ‘test1@test.com’, ‘test2@test.com’, ‘test3@test.com’ ); // переводим массив в строку // и разделяем адреса запятыми $strTo = implode(«,», $arrayTo); // Тема письма $subject = «Тестовое письмо»; // Текст письма. // Тут может быть как просто текст, так и html код $message = ‘
Текст письма
‘; // заголовок письма $headers= «MIME-Version: 1.0\r\n»; // кодировка письма $headers .= » Content-type: text/html; charset=utf-8\r\n «; // от кого письмо $headers .= «From: Тестовое письмо \r\n»; // отправляем письмо $result = mail($strTo, $subject, $message, $headers); // результат отправки письма if($result)< echo "Письмо успешно отправлено"; >else
Добавить комментарий Отменить ответ
Контакты
Рубрики
- API соц.сетей (14)
- Arduino (26)
- HTML и CSS (29)
- Java Script (56)
- JQuery (32)
- PHP (144)
- SQL (15)
- Готовые проекты (7)
- Книга «128 рецептов php» (128)
- Настройки (3)
- Оффтоп (2)
Свежие записи
Популярные записи
Архивы
- Апрель 2021 (1)
- Март 2021 (1)
- Февраль 2021 (1)
- Июнь 2020 (1)
- Май 2018 (1)
- Апрель 2018 (4)
- Март 2018 (6)
- Февраль 2018 (5)
- Январь 2018 (2)
- Декабрь 2017 (6)
- Ноябрь 2017 (5)
- Март 2017 (1)
- Декабрь 2016 (2)
- Ноябрь 2016 (5)
- Октябрь 2016 (5)
- Май 2016 (1)
- Декабрь 2014 (1)
- Ноябрь 2014 (63)
- Октябрь 2014 (70)
- Сентябрь 2014 (28)
- Август 2014 (13)
- Апрель 2014 (5)
- Март 2014 (10)
- Февраль 2014 (6)
- Январь 2014 (46)
- Декабрь 2013 (1)
- Ноябрь 2013 (1)
- Октябрь 2013 (6)
- Сентябрь 2013 (17)
- Июль 2013 (9)
- Июнь 2013 (4)
- Март 2013 (2)
- Февраль 2013 (24)
Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.
(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.
Строка, которая будет дополнительно вставлена в конец отправляемых заголовков письма.
Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.
Замечание:
При отправке письмо должно содержать заголовок From. Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .
Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing. Заголовок From также определяет заголовок Return-Path в Windows.
Замечание:
Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.
Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.
Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.
Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).
Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail — это файл /etc/mail/trusted-users .
Возвращаемые значения
Возвращает TRUE , если письмо было принято для передачи, иначе FALSE .
Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Список изменений
Версия | Описание |
---|---|
4.2.3 | Параметр additional_parameters отключен в режиме safe_mode и при его использовании функция mail() вызовет предупреждение и вернет FALSE . |
Примеры
Пример #1 Отправка письма.
Использование функции mail() для отправки простого письма:
// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;
?php
// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap ( $message , 70 , «\r\n» );
// Отправляем
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>
Пример #2 Отправка письма с дополнительными заголовками.
Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:
$to = ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = ‘From: webmaster@example.com’ . «\r\n» .
‘Reply-To: webmaster@example.com’ . «\r\n» .
‘X-Mailer: PHP/’ . phpversion ();
?php
mail ( $to , $subject , $message , $headers );
?>
Пример #3 Отправка письма с дополнительными аргументами командной строки.
Параметр additional_parameters может быть использован для передачи дополнительных параметров программе, используемой для отправки писем с помощью директивы sendmail_path.
Пример #4 Отправка HTML-сообщения
С помощью функции mail() также можно отправить и HTML-письмо.
// несколько получателей
$to = ‘aidan@example.com’ . ‘, ‘ ; // обратите внимание на запятую
$to .= ‘wez@example.com’ ;
?php
// тема письма
$subject = ‘Birthday Reminders for August’ ;
// текст письма
$message = ‘
Here are the birthdays upcoming in August!
Person | Day | Month | Year |
---|---|---|---|
Joe | 3rd | August | 1970 |
Sally | 17th | August | 1973 |
‘ ;
// Для отправки HTML-письма должен быть установлен заголовок Content-type
$headers = ‘MIME-Version: 1.0’ . «\r\n» ;
$headers .= ‘Content-type: text/html; charset=iso-8859-1’ . «\r\n» ;
// Дополнительные заголовки
$headers .= ‘To: Mary , Kelly ‘ . «\r\n» ;
$headers .= ‘From: Birthday Reminder ‘ . «\r\n» ;
$headers .= ‘Cc: birthdayarchive@example.com’ . «\r\n» ;
$headers .= ‘Bcc: birthdaycheck@example.com’ . «\r\n» ;
// Отправляем
mail ( $to , $subject , $message , $headers );
?>
Замечание:
Для отправки HTML или других комплексных сообщений рекомендуется использовать PEAR-пакет » PEAR::Mail_Mime.
Примечания
Замечание:
Реализация функции mail() в Windows во многом отличается от реализации в Unix. Во-первых, она не использует локальную программу для составления писем, а работает непосредственно с сокетами, что означает что необходим почтовый агент (MTA), ожидающий соединений на сокете (может быть как на локальном так и на удаленном сервере).
Во-вторых, дополнительные заголовки вроде: From:, Cc:, Bcc: и Date: интерпретируются в первую очередь не, MTA, а PHP.
Поэтому параметр to не должен быть адресом вида «Something «. Команда mail может неправильно интерпретировать этот адрес во время передачи данных MTA.
Замечание:
Не следует использовать функцию mail() для отправки большого количества писем в цикле. Функция открывает и закрывает соединение с SMTP-сервером для каждого письма, что не очень эффективно.
Для отправки большого количества сообщений обратите внимание на пакеты » PEAR::Mail и » PEAR::Mail_Queue.
Смотрите также
Какое есть в PHP механизм отправка письма по очереди нескольким получателям?
Подскажите механизм (PHP) отправки письма на разные адреса по очереди?
На сайте имеется форма для отправки почты, имеется несколько e-mail адресов, допустим — 3шт.
При первой отправке письмо должно отправиться на 1-й e-mail, при следующей отправке — на 2-й, затем на 3-й и так по кругу. Т.е. 3 получателя получают письма в порядке очереди. Что посоветуете?
Оценить 2 комментария
А «при следующей отправке» имеется в виду «абсолютный номер следующего запроса на отправление почты» или от одного пользователя? Если в рамках пользователя, можно было бы юзать куки. Если не секрет, зачем вообще такое?
Самое простое — заведите файлик last_email_index. Читаете файлик, инкрементируете циферку, если она стала больше, чем всего адресов — сбрасываете до 0, перезаписываете в файлик, отправляете письмо по адресу, равному полученному индексу массива.
Если адреса и так в БД — то добавляете поле, когда последнее письмо было отправлено, выбираете адрес с самой старой датой, апдейтите на текущую дату и отправляете по этому адресу письмо.
Вот Вам тут советуют БД, файлы
Мне кажется если количество адресов ограничено и их не много, то почему бы не захардкодить это в
$emails = array('first@example.com', 'second@example.com'); foreach ($emails as $email)
Мне кажется, речь о равномерном round-robin распределении по пулу адресов, а не о отсылке по всем адресам сразу.
Вам надо хорошо и правильно, или по барабану?
Если хорошо и правильно, то нужен кольцевой буфер с атомарным доступом. Если по барабану, то в принципе решение с файликом выше подойдет. Просто данное решение содержит race condition, поэтому у вас не будет абсолютно равномерного распределения.
Если надо правильно — то могу набросать схемку на redis.
Алсо лучший вариант — это складывать с фронтенда все письма в очередь, а отправлять в бэкграунде, разбирая очередь в один процесс, где и устроить кольцевой буфер за массива средствами array_push и array_shift.
Для себя и потомков, функция вернет адрес получателя.
function getRecipient()< $a=array('one@example.com', 'two@example.com','three@example.com'); $f=__DIR__.'/file_v_kotorom_sohranim_index'; $i=0; if(file_exists($f))< $i=file_get_contents($f); if($ielse < file_put_contents($f, $i); >return $a[$i]; >
Войдите, чтобы написать ответ
Как работать с Cookie при многосайтовости на разных доменах?
Как отправлять почту на несколько ящиков сразу?
1. Цикл из бд, т.е. email’ы хранятся в БД, в цикле отправить к примеру 100 раз, каждый раз отправлять по новой.
2. Перечислить ящики через запятую и отправить разом.
Какой вариант правильнее, в чем разница?
Если вы делаете какую то сугубо техническую рассылку к примеру по своим собственным сотрудникам внутри вашего домена — можно использовать второй вариант если очень хочется. (хотя я все равно не вижу в нем смысла)
Во всех остальных случаях — первый без вариантов.
Письма с большим количеством адресатов во первых активно режутся спам фильтрами, во вторых как то не очень правильно раскрывать персональные email пользователей.
С одного сервера можно рассылать миллионы email сообщений в сутки, вы вряд ли упретесь в производительность.
При втором варианте, все получатели увидят кому было адресовано письмо, что, чаще всего, плохой подход.
При первом варианте письмо будет являться «индивидуальным», соответственно как-либо узнать кому еще оно было отправлено не будет возможно.
В случае если получатели не должны знать о других получателях лучше первый вариант, иначе второй, так как меньше ресурсов потребуется.
Что вы там придумываете, если Вам нужно отправлять копию на 100 ящиков, для этого есть специальный заголовок Bcc, при этом один запрос, а не 100, а почтовый сервер сам уже все сделает, как надо и копии будут скрытыми, т.е не один из получателей не увидит email адреса других адресатов.
$emails = [ 'mail_1@example.com', 'mail_2@example.com', 'mail_3@example.com', . 'mail_100@example.com' ]; $to = array_shift($emails); $headers = "Bcc: ".implode(',', $emails)."\r\n"; mail($to, $subject, $content, $headers);
@KorsaR-ZN Поясните для тех кто на трамвае — даже в исходнике письма не будут видны другие адреса? Я правда не знал о такой возможности :-)(без сарказма)
@cjbars что вы подразумиваете под исходником письма?
Bcc это скрытая копия, т.е почтовый сервер получив сообщение, разошлет скрыто от других, копии адресатам указанным в bcc, и их почты не где не будут видны.
@cjbars Тут только один нюанс есть, о котором я забыл упомянуть.
В поле «Кому» будет отображен первый получатель, из списка, ну судя по коду, что я написал выше.
Так что в после To, нужно писать либо левый ящик. либо свой.
Ну я Вам описал просто, как копии рассылать. Если Вам нужны именно уникальны отправки, то только первый вариант из вашего вопроса.
Насчет исходника письма, там да будут видны, но только на сервере. ведь потом почтовый сервер все заголовки обрабатывает и рассылает копии, где в поле Bcc будет только один почтовый адрес именно конректнного получателя остальных он выкинит, и т.д для остальных получателей из поля Bcc
@KorsaR-ZN Зато я теперь знаю как раскидать копии коллегам, и утвердился в мысли, что коммерческие предложения лучше рассылать медленно, но верно укникальными письмами.
@cjbars да. Для индивидуального письма, самый верный спосбо это первый
Для копии это bcc или cc, вторая не скрытая, т.е ящики будут видны