Файл index.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 ## Кодирование заголовков письма.
// Корректно кодирует все заголовки в письме $mail с использованием
// метода base64. Кодировка письма определяется автоматически на основе
// заголовка Content-type. Возвращает полученное письмо.
function mailenc($mail) {
// Разделяем тело сообщения и заголовки.
list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
// Определяем кодировку письма по заголовку 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 ## Более удобная отправка почты.
// Функция отправляет письмо, полностью заданное в параметре $mail.
// Корректно обрабатываются заголовки To и Subject.
function mailx($mail) {
// Разделяем тело сообщения и заголовки.
list ($head, $body) = preg_split("/\r?\n\r?\n/s", $mail, 2);
// Выделяем заголовок 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, $body, trim($head));
}
?>
Файл mail.eml
Привет, {TO}!
{TEXT}
Это сообщение сгенерировано роботом - не отвечайте на него.
Запускаю код на локальном компьютере, приходит письмо всем трем получателям:
$tos = array("usa-1200@mail.ru", "swd200@yandex.ru","swd200@qip.ru");
Забросил на сервер http://santa.hut4.ru/ приходит ТОЛЬКО 1 письмо НА usa-1200@mail.ru.
Почему так?
Спустя 31 минута, 10 секунд (16.06.2012 - 00:35) DySprozin написал(а):
kilogram
возможно, антиспам защита (; попробуй после строки
вставить
скрипт будет работать 15 секунд - достаточное время, чтобы сервак "переварил" каждую отправку. Если сработает - попробуй уменьшить sleep(). Не сработает - будем думать дальше.
возможно, антиспам защита (; попробуй после строки
foreach ($tos as $to) {
вставить
sleep(5);
скрипт будет работать 15 секунд - достаточное время, чтобы сервак "переварил" каждую отправку. Если сработает - попробуй уменьшить sleep(). Не сработает - будем думать дальше.
Спустя 32 минуты, 48 секунд (16.06.2012 - 01:07) kilogram написал(а):
Поставил sleep(10000) отправило все равно на одну почту.
Спустя 1 час, 11 минут, 45 секунд (16.06.2012 - 02:19) FatCat написал(а):
У большинства хостеров стоит ограничение на количество адресов: ОДИН адрес.
Если хостер разрешает лишь один мейл процессу, отправка в цикле не спасает, надо рефрешить страницу для каждой отправки.
То есть вместо кода
я бы предложил что-то типа такого:
Если хостер разрешает лишь один мейл процессу, отправка в цикле не спасает, надо рефрешить страницу для каждой отправки.
То есть вместо кода
foreach ($tos as $to){
// Отправка мейла
}
я бы предложил что-то типа такого:
$key = isset($_GET['key']) ? intval($_GET['key']) : 0;
if(isset($tos[$key]))
{
$to = $tos[$key];
// Отправка мейла
echo("<html><head><meta http-equiv='refresh' content='0; url=index.php?key=".($key++)."'></head><body></body></html>");
}
else echo "Рассылка выполнена, разослано ".($key++)." писем.";