Как запланировать рассылку писем - PullRequest
5 голосов
/ 03 апреля 2010

Используя PHP, у меня есть запрос, который проходит через мою БД в поисках отложенных задач с триггерами напоминания в определенное время дня. У меня есть cronjob, который запускается каждые 10 минут и проверяет БД на наличие строк, для которых установлено поле «remind_me», чтобы оно отключалось в течение следующих 10 минут. Если он что-то находит, каков наилучший способ поставить в очередь письмо с информацией о задаче?

Полагаю, мне понадобится какая-то система сообщений, но как работает почтовая часть? Мне понадобится еще один cronjob, который запускается каждую минуту для проверки системы очередей?

Ответы [ 5 ]

3 голосов
/ 20 октября 2010

Если вы хотите создать систему почтовой очереди, я бы посоветовал вам взглянуть на PEAR :: Mail_Queue и соответствующее руководство.

Вы сможете ставить в очередь почту, когда ваш 10-минутный скрипт выполняется, и почтовую очередь очищать каждые 10 минут с помощью задания cron. Вы также можете очищать почтовую очередь каждую минуту и ​​устанавливать время «не отправлять раньше» в очередь для рассматриваемой почты.

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

Это может быть реализовано с помощью записи о том, когда вы в последний раз отправляли оповещения (чтобы вы не пропустили ни одного и не отправляли оповещения дважды)

Надеюсь, это поможет.

3 голосов
/ 18 октября 2010

Я совсем недавно написал свое собственное решение очень похожей проблемы с использованием PHP и MySQL.
По сути: задание cron запускает сценарий с заданным интервалом, который проверяет базу данных на наличие ожидающих заданий, запускает их и удаляет задания.

Это просто то, что мне нужно было сделать, но его можно изменить, чтобы оно работало для временных интервалов.
Я написал отдельный PHP-скрипт, который выполняет реальную работу (система рассылки), чтобы сделать эту автоматизацию немного более полезной. То есть я могу выполнить любую команду, какую захочу, я выполняю это, сохраняя имя фактической команды и ее аргументы в скрипте automator.

exec("~/scripts/{$row['command']} {$row['args']}");

позволяет мне сохранять аргументы в базе данных, чтобы сделать мой скрипт новостной рассылки более полезным. Для получения аргументов вы используете массив $ argv, $ argv [0] - это имя скрипта, за которым следуют аргументы.

Я храню всю информацию о новостях в отдельной таблице в базе данных, которая сортирует их в хронологическом порядке. Другие важные поля - это тема и тело письма. Затем я просто передаю два аргумента в newsletter.php, чтобы он делал именно то, что я хочу: номер бюллетеня и номер подписчика (или все).

Тестирование на время (за 10 минут до) может быть выполнено с помощью чего-то подобного (я упрощен ради упрощения понимания):

date_default_timezone_set('America/Denver');
$month=;//without leading zeros
$day=;//without leading zeros
$hour=;//24 hour without leading zeros
$min=;//needs leading zeros
if($month==date(n) and $day==date(j)){
    if($hour==date(G)){
        if(($min-date(i))<=10){
            //run command
        }
    }elseif(($hour-1)==date(g)){
        if(($min-date(i))<=(-50)){
            //run command
        }
    }
}

Вы захотите изменить часовой пояс на свой и каким-то образом извлечь информацию о дате и времени из БД.
Вторая часть скрипта (для запуска команд, запланированных на первые 9 минут часа) не прошла тестирование, но первую часть я быстро протестировал только сейчас.
Надеюсь это поможет.

1 голос
/ 03 апреля 2010

PHP-решение

Я немного больше подумал о вашей проблеме, и это решение PHP, которое я придумал.

#!/opt/lamp/bin/php - это путь к моему phpпереводчик.Вы должны изменить его на свой путь или просто запустить его с помощью php -f scheduler.php

scheduler.php

#!/opt/lampp/bin/php
<?php
// For testing purpose I set this to 5 seconds. You should set it to 600.
$time = 5;

while (true) {
    /*  
    let's assume you store the emails scheduled from the database in this
    in memory array.
    */
    $array = array( 
        "Message to run last", #message which is scheduled last.
        "Message to run after first message",
        "Message to run immediately", #message which is scheduled first.
    );

    $message = array_pop($array);    
    while ($message != NULL) {
            echo $message . "\r\n";
            /* 
            For testing purpose I am just simply echoing out messages.
            In here you should sent mails using for exmample
            http://php.net/manual/en/function.mail.php
            */
            $message = array_pop($array); // Get next message.
    }

    /*
    sleep $time. This is the "cron" part of your problem.
    */
    sleep($time); 
}

Вы должны запустить этот скриптиз скрипта bash, чтобы увидеть, что он делает.Также код был задокументирован довольно хорошо.Скрипт должен работать вечно (в фоновом режиме).

Решение Java

Это также не только решение PHP , но я думаю, что оно будет масштабироваться лучше, чем решение PHP, которое я придумал.Я все еще работаю над этим, но мне нравится то, что я придумал.

Решение Google App Engine

Я знаю, что это не решение PHP, но когда вы не можетеустановить очередь сообщений Я думаю, что Google App Engine - лучшее решение .Когда я увидел это видео введение от Бретта Слаткина в движок приложения Google с использованием Python SDK, я был продан движку Google App.Это займет всего 10 минут вашего времени, и вы узнаете, как создать базовую гостевую книгу и развернуть ее в облаке.Ниже, если интересно, я попытаюсь объяснить, какие части вам нужно сделать в Google App Engine.


Полагаю, мне понадобится какая-то система сообщений

Возможно, вы можете использовать taskqueue движка приложения Google, чтобы выполнить задание.У очереди задач даже есть эта , которую вы можете настроить для запуска в определенное время.У движка Google App есть щедрая бесплатная квота .Вы можете добавлять 100 000 очередей к задаче бесплатно каждый день.

но как работает почтовая часть

Я бы использовал для этого Google App Engine.Вы можете использовать сервис mail движка приложения Google.Он также имеет щедро бесплатную квоту (2000 получателей в день).Я бы посоветовал вам просто позвонить в API api из очереди, чтобы отправить сообщение.

0 голосов
/ 03 апреля 2010

Как часто вы хотите отправить электронное письмо? Если это происходит (в ту минуту, когда она обнаруживается вашим существующим cronjob, то есть каждые 10 минут), вы можете сделать скрипт, который ищет флаг напоминания, сделать это:

1 - добавить ссылку на каждую строку, в которой был найден флаг, например,

$reminders = array(1, 3, 212);

Каждый элемент в массиве ссылается на первичный ключ вашей таблицы задач, здесь я использовал «задачи».

2 - после завершения поиска в базе данных посмотрите, не пусто ли $ напоминания, а затем выполните запрос, подобный

$query = "SELECT * FROM tasks WHERE id = '".implode(',', $reminders)."'";

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

3 - отправьте электронное письмо с этими данными, используя mail .

Это то, что вы искали?

0 голосов
/ 03 апреля 2010

У нас есть похожая система (это приложение ASP.NET, поэтому у нас есть сервисы для запуска этого с использованием внутреннего планировщика ... но подробности не важны). У нас есть одна большая таблица очереди сообщений, которая содержит данные электронной почты для отправки, адрес и строку темы (фактические электронные письма генерируются из шаблонов). Наша система работает так, что после заполнения строки мы немедленно запускаем задачу отправки, которая собирает все ожидающие электронные письма и отправляет их. Он пытается отправить их 3 раза, и в случае неудачи они переводятся в состояние неудавшегося повторного отправки. У нас есть задание, похожее на cron, которое выполняется каждые 5 минут, чтобы подметать любые невыполненные задачи (вещь очень редко дает сбой, если они вызваны сетевой проблемой в 99% случаев).

...