【问题标题】:Mysterious issue with Django + uWSGI + send emailDjango + uWSGI + 发送电子邮件的神秘问题
【发布时间】:2012-01-22 21:03:20
【问题描述】:

经过大约 1.5 小时的艰苦调试,我在这里写信给你。


首先,这些是感兴趣的文件:

/project/app/utils.py

from django.core.mail import EmailMultiAlternatives
import threading

class EmailThread(threading.Thread):
    def __init__(self, subject, body, from_email, recipient_list, fail_silently, html):
        self.subject = subject
        self.body = body
        self.recipient_list = recipient_list
        self.from_email = from_email
        self.fail_silently = fail_silently
        self.html = html
        threading.Thread.__init__(self)

    def run(self):
        msg = EmailMultiAlternatives(self.subject, self.body, self.from_email, self.recipient_list)
        if self.html:
            msg.attach_alternative(self.html, "text/html")
        print "sending message"
        msg.send(self.fail_silently)
        print "sent."

def send_html_mail(subject, body, from_email, recipient_list, fail_silently=False, html=None, *args, **kwargs):
    EmailThread(subject, body, from_email, [recipient_list], fail_silently, html).start()

/project/app/views.py

[...]
import utils

def my_view(request):
    [...]
    utils.send_html_mail('subject', '<h1>cool things.</h1>', 'Test <test@example.org>', 'my_email@example.org', html='<h1>cool things.</h1>')

/project/app/settings.py

# I use Amazon SES

[...]
EMAIL_BACKEND = 'backends.smtp.SSLEmailBackend'
EMAIL_HOST = 'amazon-server'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'user'
EMAIL_HOST_PASSWORD = 'pass'
EMAIL_USE_TLS = True
[...]

/project/backends/smtp.py

# taken from https://gist.github.com/1486891

import smtplib

from django.core.mail.utils import DNS_NAME
from django.core.mail.backends.smtp import EmailBackend

class SSLEmailBackend(EmailBackend):
    def open(self):
        if self.connection:
            return False
        try:
            self.connection = smtplib.SMTP_SSL(self.host, self.port,
                                           local_hostname=DNS_NAME.get_fqdn())
            if self.username and self.password:
                self.connection.login(self.username, self.password)
            return True
        except:
            if not self.fail_silently:
                raise

好的,现在问题来了:

在本地主机中:

  • 从视图发送电子邮件工作
  • 从 django shell 工作发送电子邮件

在我服务器上的部署应用中:

  • 从视图发送电子邮件不起作用
  • 从 django shell 工作发送电子邮件

localhost 中的 Django shell 输出:

# utils.send_html_mail('subject', '<h1>cool things.</h1>', 'Test <test@example.org>', 'my_email@example.org', html='<h1>cool things.</h1>')
sending email
sent.

部署应用程序中的 Django shell 输出:

# utils.send_html_mail('subject', '<h1>cool things.</h1>', 'Test <test@example.org>', 'my_email@example.org', html='<h1>cool things.</h1>')
sending email

相同的代码,相同的提交。问题出在方法msg.send(self.fail_silently) 可能就在print "sent." 之前,但它是什么?我没有想法。

你呢?

【问题讨论】:

    标签: python django uwsgi amazon-ses django-email


    【解决方案1】:

    你是否在 uWSGI 中使用 --enable-threads 启用了线程?

    【讨论】:

    • 谢谢罗伯托。问题已解决。
    【解决方案2】:

    由于threadinguWSGI 存在激活问题,您可以尝试将其添加到您应用的uwsgi 配置中:

    lazy = true
    

    因此您的代码将在子工作者分叉后加载。

    【讨论】:

    • 感谢您的回答,但不幸的是它不起作用。我在运行 uwsgi 时添加了 --lazy
    猜你喜欢
    • 2013-11-13
    • 2012-01-02
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 2016-08-12
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多