Django Celery网上商店:未发送订单确认电子邮件

时间:2016-09-11 18:21:07

标签: django email celery

我正在做这本书的网上商店教程" Django By Example"。我正在使用Windows。

我创建了订单表单页面。看起来不错。发送订单后,该网站说: "谢谢。您的订单已成功完成。您的订单号是7"。 但是"客户"没有收到订单确认电子邮件。

运行芹菜的另一个命令提示符给出了这种错误:

"ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it."

根据本书在命令提示符中应该包含的内容:

[2015-09-14 19:43:47,526: INFO/MainProcess] Received task: orders.
tasks.order_created[933e383c-095e-4cbd-b909-70c07e6a2ddf]
[2015-09-14 19:43:50,851: INFO/MainProcess] Task orders.tasks.
order_created[933e383c-095e-4cbd-b909-70c07e6a2ddf] succeeded in
3.318835098994896s: 1

如果我将以下代码添加到settings.py,则订单确认电子邮件会成功发送到命令提示符。

EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

我不知道这个问题是否与RabbitMQ有关。我现在不知道它在我的系统中是否正常工作。早些时候,我尽可能地完成了Erlang和RabbitMQ的安装。 cmatskas.com:" RabbitMQ默认运行为Windows服务,从技术上讲,您不需要做任何其他事情就可以开始与它进行交互。"

编辑:(我添加了我认为可能有助于SMTP2GO正常工作的tasks.py)。 订单/ tasks.py

from celery import task
from django.core.mail import send_mail
from .models import Order


@task
def order_created(order_id):
    """
    Task to send e-mail notification when an order is successfully created.
    """
    order = Order.objects.get(id=order_id)
    subject = 'Order nr. {}'.format(order.id)
    message = 'Dear {}, \n\nYou have successfully placed an order.\
                Your order id is {}.'.format(order.first_name, order.id)
    mail_sent = send_mail(subject, message, 'admin@myshop.com', [order.email])
    return mail_sent

以下是我未能成功将smtp2go第2步代码添加到本教程的tasks.py中。很高兴知道(或得到一些提示)如何让它工作:

from celery import task
from django.core.mail import EmailMultiAlternatives
from .models import Order


@task
def order_created(order_id):
    """
    Task to send e-mail notification when an order is successfully created.
    """
    order = Order.objects.get(id=order_id)
    subject = 'Order nr. {}'.format(order.id)
    from_email = 'Max Burgers'
    to = order.email
    text_content = 'Dear {}, \n\nYou have successfully placed an order.\
                Your order id is {}.'.format(order.first_name, order.id)
    html_content = '<p>This is an awesum <strong>HTML</strong> message.</p>'
    msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
    msg.attach_alternative(html_content, "text/html")
    msg.send()
    return

1 个答案:

答案 0 :(得分:0)

如果未指定EMAIL_BACKEND设置,Django会尝试通过本地计算机上的(不安全的)SMTP服务器发送电子邮件。在你的情况下可能不存在。

您必须配置服务器,通过该服务器发送(真实)电子邮件。我建议使用smtp2go,这是非常好的服务,免费提供少量电子邮件(20 /天)。

他们还有关于Django设置的教程:https://www.smtp2go.com/docs/django/