【问题标题】:Sending emails with Django and Post Office使用 Django 和 Post Office 发送电子邮件
【发布时间】:2021-07-19 13:28:10
【问题描述】:

我在为我的 django 项目设置电子邮件选项时遇到了一些问题。 我在后端使用邮局,但我似乎无法排队。

views.py:

from django.views.generic import TemplateView
from post_office import mail

class EmailView(TemplateView):

    model = Customer
    mail.send(
        'a.sophiewirth@gmail.com', # List of email addresses also accepted
        'your.generic.test.email@gmail.com',
        subject='My email',
        message='Hi there!',
        html_message='Hi <strong>there</strong>!',
    )
    template_name = 'customers/send_email.html'

settings.py:

# using post office as the default email backend
EMAIL_BACKEND = 'post_office.EmailBackend'

POST_OFFICE = {
    'DEFAULT_PRIORITY' : 'now'
}

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = "your.generic.test.email@gmail.com"
EMAIL_PORT = 25  # default smtp port
EMAIL_HOST_PASSWORD = "password"
EMAIL_USE_TLS = False
DEFAULT_FROM_EMAIL = 'your.generic.test.email@gmail.com'

urls.py:

from django.conf.urls import patterns, include, url
from customers.views import CustomerList, CreateCustomerView, CustomerUpdateView, EmailView
from . import views

urlpatterns = patterns('',
    url(r'^$', CustomerList.as_view(), name="customer-list"),
    url(r'^create-customer$', CreateCustomerView.as_view(), name="create-customer"),
    url(r'^customer-update/(?P<pk>\d+)$', CustomerUpdateView.as_view(), name="customer-update"),
    url(r'^send-email$', EmailView.as_view(), name="send-email"),
)

send_email.html 到目前为止是很空的,它只包含一个段落来告诉您您发送了一封电子邮件。

谁能告诉我为什么什么都没有发送?另外,作为我要发送邮件的特定用户,我怎样才能让电子邮件的收件人进入视图?

非常感谢:)

【问题讨论】:

  • 你用的是什么排队系统?
  • 我目前没有使用除 django 和 postgres 之外的任何其他系统。我没有意识到我需要专门添加一个排队系统。我确实在我的机器上安装了 celery。对不起,我对整个后端的事情真的很陌生,所以我知道我遇到了一个巨大的菜鸟。
  • 对某事感到陌生并没有错。给我几分钟来完成其他事情,我将发布我的 Celery 设置作为示例。那时可能已经有人回答了,但至少现在你知道你至少可以得到一个答案!
  • 感谢您如此友善并帮助我! :)

标签: python django


【解决方案1】:

我同时安装了djceleryDjango celery email。这是在一个较旧的项目中,我相信不再需要 djcelery,但我的设置仍然应该给你一个开始。我的 Django 设置包括以下内容:

import djcelery
...
djcelery.setup_loader()

EMAIL_BACKEND = 'post_office.EmailBackend'
POST_OFFICE_BACKEND = 'djcelery_email.backends.CeleryEmailBackend'

我的项目还包括一个 shell 脚本,我运行它来启动和配置 celery 守护进程。我的项目在virtualenv 中运行,因此您可能不需要其中的一些。

#!/bin/bash
set -e
# user/group to run as
USER=your_username
GROUP=your_groupname
cd /path/to/virtualenv/
source ./bin/activate
cd /path/to/directory/containing/manage.py/
exec python manage.py celeryd --settings=directory.path.settings.py

运行 shell 脚本应该会显示一个正在运行的 celery 进程,并且您的电子邮件现在应该可以愉快地发送和排队了。

【讨论】:

  • 嘿,所以我修改了我的设置页面。它现在有: import djcelery djcelery.setup_loader() # 使用 djcelery 的电子邮件后端作为邮局的后端 POST_OFFICE_BACKEND = 'djcelery_email.backends.CeleryEmailBackend' 但是现在当我尝试发送邮件时,我的本地主机会永远加载。我也跑rabbitmq,可能有问题?
  • 哦,等等,我以前没有看到的是,我实际上从 celery 收到了一个错误:[2015-03-17 13:15:42,270: ERROR/MainProcess] 消费者:无法连接到 amqp ://guest:**@127.0.0.1:5672//: [Errno 61] 连接被拒绝。 18.00 秒后重试...
  • 好的,所以我再次启动了rabbitmq,错误消息消失了,但仍然没有邮件:/
【解决方案2】:

现在删除默认优先级并将'CELERY_ENABLED': True 添加到POST_OFFICE 设置中,如下所示:

 POST_OFFICE = {
     'CELERY_ENABLED': True,
 }

之后,当您启动 celery worker 时,您应该会看到收到的 2 个任务

post_office
post_office.tasks.cleanup_expired_mails
post_office.tasks.send_queued_mail 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2022-11-24
    • 2013-03-07
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    相关资源
    最近更新 更多