【问题标题】:Crontab for sending mails用于发送邮件的 crontab
【发布时间】:2014-10-01 20:14:21
【问题描述】:

当我使用 django 时,我创建了我的 send_newsletter 管理命令

python manage.py send_newsletter

它有效。 我的 send_newsletter.py

sys.path.append('/srv/apps/')  
sys.path.append('%s/actecil_newsletter' % os.getcwd())  
sys.path.append('%s/actecil_newsletter/actecil_newsletter' % os.getcwd())  
sys.path.append('/srv/apps/apps_django_1_4') 
sys.path.append('/srv/apps/apps_django_1_4/Django-1.4.3') 
if 'DJANGO_SETTINGS_MODULE' not in os.environ.keys():
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

class Command(BaseCommand):
  args = '<mail_id, mail_id, ...>'
  def handle(self, *args, **options):   
    mail = Mail.objects.all()
    for mail in mail:
        print "------------------------------------------------------------------------------------"
        if not mail.sended :
            soup = BeautifulSoup(mail.content)
            subject = mail.subject
            recipients = []
            for t in mail.tags.all():
                for r in t.recipients.all():
                    if not r in recipients:
                        recipients.append(r)

            for r in mail.recipients.all():
                if not r in recipients:
                    recipients.append(r)

            if recipients:
                for a in soup.find_all('a'):
                    link = Link()
                    link.link = (a.get('href'))
                    link.mail = mail
                    link.save()
                    a['href'] = "%s/compagnes/link/%s/%s/%s/" % (settings.WEBSITE_URL, mail.id, '-*{^@+*@=)=-+*-=+*-=*+=--=*-*=-==)@@###/+@]}-*', link.id)
                tag = soup.new_tag('img', src="%s/compagnes/mail/%s/%s/" % (settings.WEBSITE_URL, mail.id, '-*{^@+*@=)=-+*-=+*-=*+=--=*-*=-==)@@###/+@]}-*'))
                soup.body.insert_after(tag)
                content = soup.prettify()
                for r in recipients:
                    c = content.replace('-*{^@+*@=)=-+*-=+*-=*+=--=*-*=-==)@@###/+@]}-*', "%s" % r.id)
                    msg = EmailMultiAlternatives(subject.encode('utf-8'), c.encode('utf-8'), settings.DEFAULT_FROM_EMAIL, [r.mail, ])
                    msg.attach_alternative(c, "text/html")
                    msg.send()
            mail.sended = True      
            mail.date_sent = datetime.datetime.now()
            mail.save()

我用

创建了一个 cron
sudo crontab -e

在终端上并将其放入 crontab 文件中:

*/5 * * * * cd /srv/apps/newsletter/actecil_newsletter && python manage.py send_newsletter

但它不起作用,如果有人知道如何解决它?

编辑:我在 crontab 的日志中收到此错误

Traceback (most recent call last):
File "manage.py", line 9, in <module>
from django.core.management import execute_from_command_line
ImportError: No module named django.core.management

【问题讨论】:

  • 可能有很多东西。 Cron 失败时应该向您发送电子邮件;如果您没有收到该电子邮件,您可以通过将 &gt;/tmp/log 2&gt;&amp;1 添加到 cron 作业的末尾来重定向输出并查看文件是否有错误。
  • 我认为您正在使用 ubuntu 并且在 ubuntu 中 crontab 正在运行,但不幸的是 django 代码没有被执行。我建议你为此使用 django-celery。
  • @JohnZwinck 我在问题中添加了错误日志。
  • 看起来 PYTHONPATH 可能是为你设置的,但不是为 cron 设置的?
  • 我添加了 send_newsletter.py 文件中使用的 sys.path 并放入了 manage.py 并且它工作了

标签: python linux django cron


【解决方案1】:

问题是在 cron 中运行的 python 无法访问 django 安装。对此有很多问题,Django 是如何安装在您的系统中的? (使用 SO 包、pip 或手动..)。

使用 django-cron 将使您的生活更轻松,简化您的开发并以 django 方式管理您的所有应用程序;)

提示:

  • 在 Django 开发中必须使用virtualenv
  • 考虑阅读任务/队列作业,例如Celery

【讨论】:

    【解决方案2】:

    您可以尝试以特定用户身份运行 cron 作业吗?当我开始使用 django 时,我也遇到了 django 管理命令和 cron 作业的问题。从那以后,我通常以特定用户的身份运行

    */5 * * * * su -l <user> -c cd /srv/apps/newsletter/actecil_newsletter && python manage.py send_newsletter
    

    【讨论】:

      【解决方案3】:

      我终于找到了解决问题的方法,感谢大家尝试帮助我。 获得日志后(感谢 John Zwinck),我将其添加到我的 manage.py

      sys.path.append('/path/to/django/apps_django_1_4')
      sys.path.append('/path/to/django/apps_django_1_4/Django-1.4.3')
      sys.path.append('%s/actecil_newsletter' % os.getcwd())
      sys.path.append('%s/actecil_newsletter/actecil_newsletter' % os.getcwd())
      

      这使它工作,希望它会帮助别人,然后是我:)

      谢谢大家

      【讨论】:

        猜你喜欢
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 2013-11-28
        • 2016-08-19
        • 1970-01-01
        • 2014-04-13
        相关资源
        最近更新 更多