Как я могу запланировать электронное письмо, которое будет отправлено в будущем в Django? - PullRequest
2 голосов
/ 19 января 2011

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

Как бы я это сделал в django или python?

Ответы [ 5 ]

4 голосов
/ 19 января 2011

Beanstalkd

Если вы можете установить beanstalkd и запустить скрипт Python из командной строки, я бы использовал это для планирования электронной почты.С клиентом beanstalkc вы можете легко это сделать.В Ubuntu вам может понадобиться сначала установить:

  • sudo apt-get install python-yaml python-setuptools

consumer.py:

import beanstalkc

def main():
    beanstalk = beanstalkc.Connection(host='localhost', port=11300)
    while True:
        job = beanstalk.reserve()
        print job.body
        job.delete()


if __name__ == '__main__':
    main()

Распечатает задание через 5 секунд после того, как оно будет вставлено производителем.Конечно, это должно быть больше, если вы хотите запланировать свою электронную почту, но для демонстрационных целей это подойдет.Вы не хотите ждать полчаса, чтобы запланировать сообщение при тестировании;).

Manufacturer.py:

import beanstalkc

def main():
    beanstalk = beanstalkc.Connection(host='localhost', port=11300)
    jid = beanstalk.put('foo', delay=5)

if __name__ == '__main__':
    main()

GAE Task Queue

Вы также можете использовать Очередь задач Google App Engine , чтобы выполнить это.Вы можете указать eta для вашей Задачи .У движка Google App есть щедрая бесплатная квота .В очереди задач webhook выполните Асинхронные запросы , чтобы получить URL на вашем сервере, который выполняет отправку электронных писем.

3 голосов
/ 19 января 2011

Я бы настроил работу cron, которая могла бы обрабатывать все, что вы хотите сделать ...

2 голосов
/ 19 января 2011

Если у вас нет доступа к cron, вы можете легко сделать это:

  1. Напишите модель, в которой хранится электронное письмо, время отправки и BooleanField, указывающее, было ли отправлено электронное письмо.
  2. Напишите представление, которое выбирает все электронные письма, которые еще не были отправлены, но должны уже быть, и отправляет их.
  3. Используйте что-то вроде OpenACS Uptime , Pingdom или любую другую службу, способную периодически отправлять HTTP GET запросы, чтобы вызвать это представление и инициировать отправку электронной почты. (Оба бесплатны, первый должен запрашивать один раз каждые 15 минут, а второй можно настроить так, чтобы он запрашивал каждую минуту, и будет делать это из нескольких мест.)

Конечно, это не элегантно, но это метод, который работает практически на любом веб-хосте. Я делал что-то подобное, когда писал программы PHP для запуска на хосте, который убивал все процессы примерно через 15 секунд.

0 голосов
/ 20 января 2011

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

Другим возможным решением может быть что-то вроде этого:

Используйте фреймворк javascript, который может устанавливать синхронизированные события, запускать / отменять их и т. Д. Я делал синхронизированные события, используя фреймворк ExtJS. Хотя ExtJS довольно большой, я уверен, что другие фреймворки, такие как jQuery или даже необработанный javascript, могут сделать то же самое.

Установите задачу для пользовательского действия, которое будет выполнено через 5 минут. Действие может быть ajax-вызовом скрипта Python, который отправляет электронную почту ... Если пользователь делает что-то, где задача должна быть остановлена, просто отмените событие.

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

0 голосов
/ 19 января 2011

Вы используете сельдерей?Если это правда, см http://ask.github.com/celery/userguide/executing.html#eta-and-countdown

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...