Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2012, 01:03   #1
kilogram
Форумчанин
 
Регистрация: 04.03.2012
Сообщений: 144
По умолчанию Рассылка писем

Читаю Котова, там приводится такой код.

Файл index.php
PHP код:
<?php ## Отправка почты по шаблону (без кодирования).
// Подключаем функцию mailx() (см. ниже).
include_once "mailx.php";
include_once 
"mailenc.php";
// Этот текст может быть получен, например, из базы данных,
// или являться сообщением форума или гостевой книги.
$text "Cookies  need love like everything does.";
// Получатели письма.
$tos = array("usa-1200@mail.ru""swd200@yandex.ru","swd200@qip.ru");
// Считываем шаблон.
$tpl file_get_contents("mail.eml");
// Отправляем письма в цикле по получателям.
foreach ($tos as $to) {
  
// Заменяем элементы шаблона.
  
$mail $tpl;
  
$mail strtr($mail, array(
    
"{TO}"   => $to,
    
"{TEXT}" => $text,
  ));
  
// Вызываем mailx(), включенную из файла.
  
mailx($mail);

}

?>
Файл mailenc.php
PHP код:
<?php ## Кодирование заголовков письма.
// Корректно кодирует все заголовки в письме $mail с использованием 
// метода base64. Кодировка письма определяется автоматически на основе
// заголовка Content-type. Возвращает полученное письмо.
function mailenc($mail) {
  
// Разделяем тело сообщения и заголовки.
  
list ($head$body) = preg_split("/\r?\n\r?\n/s"$mail2);
  
// Определяем кодировку письма по заголовку Content-type.
  
$encoding '';
  
$re '/^Content-type:\s*\S+\s*;\s*charset\s*=\s*(\S+)/mi';
  if (
preg_match($re$head$p)) $encoding $p[1];
  
// Проходимся по всем строкам-заголовкам.
  
$newhead "";
  foreach (
preg_split('/\r?\n/s'$head) as $line) {
    
// Кодируем очередной заголовок.
    
$line mailenc_header($line$encoding);
    
$newhead .= "$line\r\n";
  }
  
// Формируем окончательный результат.
  
return "$newhead\r\n$body";
}

// Кодирует в строке максимально возможную последовательность
// символов, начинающуюся с недопустимого символа и НЕ 
// включающую E-mail (адреса E-mail обрамляют символами < и >).
// Если в строке нет ни одного недопустимого символа, преобразование
// не производится.
function mailenc_header($header$encoding) {
  
// Кодировка не задана - делать нечего.
  
if (!$encoding) return $header;
  
// Сохраняем кодировку в глобальной переменной. Без использования
  // ООП это - единственный способ передать дополнительный параметр
  // callback-функции.
  
$GLOBALS['mail_enc_header_encoding'] = $encoding;
  return 
preg_replace_callback(
    
'/([\x7F-\xFF][^<>\r\n]*)/s',
    
'mailenc_header_callback',
    
$header
  
);
}

// Служебная функция для использования в preg_replace_callback(). 
function mailenc_header_callback($p) {
  
$encoding $GLOBALS['mail_enc_header_encoding'];
  
// Пробелы в конце оставляем незакодированными.
  
preg_match('/^(.*?)(\s*)$/s'$p[1], $sp);
  return 
"=?$encoding?B?".base64_encode($sp[1])."?=".$sp[2];
}
?>
Файл mailx.php
PHP код:
<?php ## Более удобная отправка почты.
// Функция отправляет письмо, полностью заданное в параметре $mail.
// Корректно обрабатываются заголовки To и Subject.
function mailx($mail) {
  
// Разделяем тело сообщения и заголовки.
  
list ($head$body) = preg_split("/\r?\n\r?\n/s"$mail2);
  
// Выделяем заголовок To.
  
$to "";
  if (
preg_match('/^To:\s*([^\r\n]*)[\r\n]*/m'$head$p)) {
    
$to = @$p[1]; // сохраняем
    
$head str_replace($p[0], ""$head); // удаляем из исходной строки
  
}
  
// Выделяем Subject.
  
$subject "";  
  if (
preg_match('/^Subject:\s*([^\r\n]*)[\r\n]*/m'$head$p)) {
    
$subject = @$p[1];
    
$head str_replace($p[0], ""$head);
  }
  
// Отправляем почту. Внимание! Опасный прием!
  
mail($to$subject$bodytrim($head));
}
?>
Файл mail.eml
Код:
Привет, {TO}!
{TEXT}
Это сообщение сгенерировано роботом - не отвечайте на него.
Запускаю код на локальном компьютере, приходит письмо всем трем получателям:
PHP код:
$tos = array("usa-1200@mail.ru""swd200@yandex.ru","swd200@qip.ru"); 
Забросил на сервер http://santa.hut4.ru/ приходит ТОЛЬКО 1 письмо НА usa-1200@mail.ru.

Почему так?
kilogram вне форума Ответить с цитированием
Старый 16.06.2012, 10:31   #2
spein
Программист
Форумчанин
 
Аватар для spein
 
Регистрация: 27.02.2009
Сообщений: 505
По умолчанию

Может проблема в адресах?
there are no limits when you're software engineer
spein вне форума Ответить с цитированием
Старый 16.06.2012, 11:01   #3
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Бесплатный хостинги имеют жесткие ограничения на отправку писем (платные тоже имеют ограничения, но менее жесткие). Т.е. за 1 запуск скрипта вам не дадут отправить более 1 письма. Кроме того, в единицу времени тоже не дадут превысить заданный лимит.
Обойти это можно. Надо завести в БД таблицу, где сохранять все письма, которые надо отправить (кому, куда, тема, текст и т.п.). Отправлять по крону (или, если крона нет, а его у вас нет, то после каждой выдачи странички пользователю) очередное письмо из этой таблицы. Если отправлено было успешно, то удаляем запись о нем. Если не успешно, то ставим его в конец очереди.
Arigato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рассылка Mortimoro PHP 2 01.04.2012 16:36
Рассылка писем в Lotus Notes 8 с группового ящика ruavia3 Помощь студентам 8 27.10.2011 07:47
Рассылка Claster Помощь студентам 1 25.08.2011 17:11
smpt, рассылка писем leon2009 Работа с сетью в Delphi 1 14.03.2009 16:03