用于发送邮件的Crontab

时间:2014-10-01 09:03:54

标签: python linux django cron

我使用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

3 个答案:

答案 0 :(得分:0)

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

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

提示:

  • 在Django开发中,您必须使用virtualenv
  • 请阅读有关Celery
  • 等任务/队列作业的内容

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我终于找到了解决问题的方法,感谢大家帮助我。 获取日志后(感谢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())

这使它成功,希望它能帮助别人,然后我:)

谢谢大家