Рассылка писем через крон

Статус
В этой теме нельзя размещать новые ответы.

euheni

Постоялец
Регистрация
6 Сен 2007
Сообщения
118
Реакции
26
Нужно сделать рассылку на ящики клиентов, которые лежат в базе.

Для сего написал небольшой скрипт:

PHP:
<?php

if (isset($_POST['title']) && isset($_POST['mess']))
{

    require_once "cfg/connect.inc.php";
    require_once "cfg/DB.php";
	
	$db = new Database();
	
	$sql = "SELECT distinct(cust_email) FROM SS_orders";
	
    $result = $db -> query($sql);
    if ($db -> get_nom($result)) 
    {
        $mails = array();
        while ($row = $db -> assoc($result)) 
        {
            $mails[] = $db -> from_db($row);
        }
    }
	
	$from  = 'От кого <info@mysite.com>';
	
 	foreach ($mails as $m)
	{
		if(preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,4}/i", $m[cust_email])) 
		{	
			$to = $m[cust_email];
			$title = $_POST['title'];
			$mess = $db -> from_db($_POST['mess']);
			
			$headers = "Content-type: text/plain; charset=windows-1251" . "\r\nFrom: ".$from. "\r\n";
			
			mail($to, $title, $mess, $headers);
			
 		}
	}
	
	echo "<div align=center><b>Готово</b></div>";
	
	$smarty->assign("mailer", $mailer);
	
}
?>

Спросил у хостера будет ли работать такой скрипт, он ответил, что на рассылку стоит ограничение 200 писем в час.
Я добавил в цикл
PHP:
sleep(20);
чтобы получилось 180 писем в час.

Но таким образом скрипту нужно будет выполняться 10 часов.
На это хостер ответил: "На виртуальном хостинге резидентные пользовательские программы не разрешаются. Просто запускайте определенную часть по крону каждый час."

Помогите догнать как это реализовать.
 
В панели управления надо найти доступ к крону (планировщику) и добавить туда абсолютный путь к файлу. Ну и не забываем про set_time_limit(0), иначе через 30 секунд скрипт отвалится.
 
На сколько я понял, нужно N раз запусить скрипт через Cron.
Причем каждый раз должны браться разные куски из базы.

Просто запускать через час наверно не покатит.
 
Тогда надо немного переделать идею скрипта - он должен не только рассылать письма, но и помечать адреса, по которым он уже отослал их. И при последующем запуске, по уже пройденным адресам письма не посылать.

А нет желания поставить простенький

И разделив базу на несколько частей рассылать через него?

Хотя, если речь идёт о постоянной рассылке, тогда проще написать решение самому.
 
Лучше хранить по каждому письму время отправки в базе и так контролировать лимит 200 писем в час, а не шаманить с sleep()
 
Спросил у хостера будет ли работать такой скрипт, он ответил, что на рассылку стоит ограничение 200 писем в час.
1) в вашем скрипте ставим цикл на 180 писем ( или 200, как хотите)
2) в кроне прописываем чтобы запускал каждый час скрипт... вот и все

 
Подскажите плиз как мне каждый раз при запуске скрипта выбирать по 200 мыл чтобы они не повторялись.

Сейчас у меня все выбирается в один массив вот так:

PHP:
    $sql = "SELECT distinct(cust_email) FROM SS_orders";
    
    $result = $db -> query($sql);
    if ($db -> get_nom($result)) 
    {
        $mails = array();
        while ($row = $db -> assoc($result)) 
        {
            $mails[] = $db -> from_db($row);
        }
    }

И еще ... текст который рассылается ... я делал его через форму постом, а через крон если запуск ставить, то я так понимаю уже никак так не сделать. Сначала надо будет его записать куда-то (в базу например) а потом уже оттуда брать?
 
Рандом в базе вещь очень извращенческая.
Лучше выбрать все базы 1 запросом, записать их в массив и применить функцию
Для просмотра ссылки Войди или Зарегистрируйся
например так
PHP:
$array = array_rand($emails, 200);
Из массива мыл, возьмется рандомно 200 мыльников (без повторений)
потом делаем так
PHP:
foreach ($emails as $value) {
    $email = $emails[$value];
}


Сначала надо будет его записать куда-то (в базу например) а потом уже оттуда брать?

Ды лучше в файл записывать, зачем лишний раз нагружать базу.
 
Мне надо на все мыльники отправить. Их около 1800.
На сколько я понял
PHP:
$array = array_rand($emails, 200);
при 2-й выборке через час выберет рандомно 200 мыл, но в них могут попасть и те, что выбирались в 1-й раз.
А повторы не нужны.
 
PHP:
$array = array_rand($emails, 200);

PHP:
foreach ($array as $value) { 
    $email = $emails[$value]; 
    unset($emails[$value]);
}

unset удалит уже взятый элемент из массива $emails

при следующем вызове array_rand в массиве $emails будут отсутсвовать ранее использованные мыльники.

Это что касается 1 запуска ,т.е. в нем все эти циклы будут.

Если нужно чтобы скрипт брал эти значения при каждом своем запуске, тогда нужно писать мыла или в файл (и каждый раз удалять из файла) или маркировать их в базе.
Например сделал апдейт, поставил лимит 200, записям присвоил флаг
status = 1 ( 0 - не использованы, 1 - спамятся в данный момент, 2 - проспамлены)

Затем выбрал эти мыльники, отослал, снял метку то что они в данный момент отсылаются, поставил статус = 2 и т.д.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху