За последние 24 часа нас посетили 53925 программистов и 1647 роботов. Сейчас ищут 1113 программистов ...

Рассылка писем

Тема в разделе "PHP для новичков", создана пользователем kilogram, 16 июн 2012.

  1. kilogram

    kilogram Активный пользователь

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Читаю Котова, там приводится такой код.

    Файл index.php
    Код (PHP):
    1. <?php ## Отправка почты по шаблону (без кодирования).
    2. // Подключаем функцию mailx() (см. ниже).
    3. include_once "mailx.php";
    4. include_once "mailenc.php";
    5. // Этот текст может быть получен, например, из базы данных,
    6. // или являться сообщением форума или гостевой книги.
    7. $text = "Cookies  need love like everything does.";
    8. // Получатели письма.
    9. $tos = array("usa-1200@mail.ru", "swd200@yandex.ru","swd200@qip.ru");
    10. // Считываем шаблон.
    11. $tpl = file_get_contents("mail.eml");
    12. // Отправляем письма в цикле по получателям.
    13. foreach ($tos as $to) {
    14.   // Заменяем элементы шаблона.
    15.   $mail = $tpl;
    16.   $mail = strtr($mail, array(
    17.     "{TO}"   => $to,
    18.     "{TEXT}" => $text,
    19.   ));
    20.   // Вызываем mailx(), включенную из файла.
    21.   mailx($mail);
    22.  
    23. }
    24.  
    25. ?>
    Файл mailenc.php
    Код (PHP):
    1. <?php ## Кодирование заголовков письма.
    2. // Корректно кодирует все заголовки в письме $mail с использованием 
    3. // метода base64. Кодировка письма определяется автоматически на основе
    4. // заголовка Content-type. Возвращает полученное письмо.
    5. function mailenc($mail) {
    6.   // Разделяем тело сообщения и заголовки.
    7.   list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
    8.   // Определяем кодировку письма по заголовку Content-type.
    9.   $encoding = '';
    10.   $re = '/^Content-type:\s*\S+\s*;\s*charset\s*=\s*(\S+)/mi';
    11.   if (preg_match($re, $head, $p)) $encoding = $p[1];
    12.   // Проходимся по всем строкам-заголовкам.
    13.   $newhead = "";
    14.   foreach (preg_split('/\r?\n/s', $head) as $line) {
    15.     // Кодируем очередной заголовок.
    16.     $line = mailenc_header($line, $encoding);
    17.     $newhead .= "$line\r\n";
    18.   }
    19.   // Формируем окончательный результат.
    20.   return "$newhead\r\n$body";
    21. }
    22.  
    23. // Кодирует в строке максимально возможную последовательность
    24. // символов, начинающуюся с недопустимого символа и НЕ 
    25. // включающую E-mail (адреса E-mail обрамляют символами < и >).
    26. // Если в строке нет ни одного недопустимого символа, преобразование
    27. // не производится.
    28. function mailenc_header($header, $encoding) {
    29.   // Кодировка не задана - делать нечего.
    30.   if (!$encoding) return $header;
    31.   // Сохраняем кодировку в глобальной переменной. Без использования
    32.   // ООП это - единственный способ передать дополнительный параметр
    33.   // callback-функции.
    34.   $GLOBALS['mail_enc_header_encoding'] = $encoding;
    35.     '/([\x7F-\xFF][^<>\r\n]*)/s',
    36.     'mailenc_header_callback',
    37.     $header
    38.   );
    39. }
    40.  
    41. // Служебная функция для использования в preg_replace_callback(). 
    42. function mailenc_header_callback($p) {
    43.   $encoding = $GLOBALS['mail_enc_header_encoding'];
    44.   // Пробелы в конце оставляем незакодированными.
    45.   preg_match('/^(.*?)(\s*)$/s', $p[1], $sp);
    46.   return "=?$encoding?B?".base64_encode($sp[1])."?=".$sp[2];
    47. }
    48. ?>
    Файл mailx.php
    Код (PHP):
    1. <?php ## Более удобная отправка почты.
    2. // Функция отправляет письмо, полностью заданное в параметре $mail.
    3. // Корректно обрабатываются заголовки To и Subject.
    4. function mailx($mail) {
    5.   // Разделяем тело сообщения и заголовки.
    6.   list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
    7.   // Выделяем заголовок To.
    8.   $to = "";
    9.   if (preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    10.     $to = @$p[1]; // сохраняем
    11.     $head = str_replace($p[0], "", $head); // удаляем из исходной строки
    12.   }
    13.   // Выделяем Subject.
    14.   $subject = "";  
    15.   if (preg_match('/^Subject:\s*([^\r\n]*)[\r\n]*/m', $head, $p)) {
    16.     $subject = @$p[1];
    17.     $head = str_replace($p[0], "", $head);
    18.   }
    19.   // Отправляем почту. Внимание! Опасный прием!
    20.   mail($to, $subject, $body, trim($head));
    21. }
    22. ?>
    Файл mail.eml
    Код (Text):
    1.  
    2. Привет, {TO}!
    3. {TEXT}
    4. Это сообщение сгенерировано роботом - не отвечайте на него.
    Запускаю код на локальном компьютере, приходит письмо всем трем получателям:
    Код (Text):
    1. $tos = array("usa-1200@mail.ru", "swd200@yandex.ru","swd200@qip.ru");
    Забросил на сервер usa-1200@mail.ru.

    Почему так?
     
  2. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Котов - это какой-то гибрид Котерова и Костарева?

    Добавлено спустя 3 минуты 46 секунд:
    Первое, что можно попробовать - поменять местами почтовые адреса в $tos. Если будет приходить на первый e-mail - значит ошибка в коде. Если нет - значит, или что-то с почтовым сервером, или яндекс и квип их фильтруют.