【问题标题】:Emails won't send after upgrading from Django 1.6.x to Django > 1.7.x从 Django 1.6.x 升级到 Django > 1.7.x 后电子邮件不会发送
【发布时间】:2015-05-01 15:04:55
【问题描述】:

我目前正在使用 Django Allauth 和 Django Invitations (https://github.com/bee-keeper/django-invitations) 的修改版本。唯一添加的是将用户添加到哪个组的字段,当使用 Django 1.6.x 时,应用程序可以完美运行。我想升级到 Django 1.7.x 或 1.8,但这会以某种方式破坏电子邮件功能。

具体的代码在这里:

'import datetime

 from django.db import models
 from django.utils.translation import ugettext_lazy as _
 from django.utils import timezone
 from django.utils.crypto import get_random_string
 from django.utils.encoding import python_2_unicode_compatible
 from django.contrib.sites.models import Site
 from django.core.urlresolvers import reverse

 from allauth.account.adapter import DefaultAccountAdapter
 from allauth.account.adapter import get_adapter

 from .managers import InvitationManager
 from . import app_settings
 from . import signals

 ...(other code)

 def send_invitation(self, request, **kwargs):
    current_site = (kwargs['site'] if 'site' in kwargs
                    else Site.objects.get_current())
    invite_url = reverse('invitations:accept-invite',
                         args=[self.key])
    invite_url = request.build_absolute_uri(invite_url)

    ctx = {
        'invite_url': invite_url,
        'current_site': current_site,
        'email': self.email,
        'key': self.key,
    }

    email_template = 'invitations/email/email_invite'

    get_adapter().send_mail(email_template,
                            self.email,
                            ctx)
    self.sent = timezone.now()
    self.save()
    signals.invite_url_sent.send(
        sender=self.__class__,
        instance=self,
        invite_url_sent=invite_url)'

在这里找到 (https://github.com/bee-keeper/django-invitations/blob/master/invitations/models.py)

这里也引用了allauth的代码:

 from __future__ import unicode_literals import re
 import warnings
 import json

 from django.conf import settings
 from django.http import HttpResponse
 from django.template.loader import render_to_string
 from django.template import TemplateDoesNotExist
 from django.contrib.sites.models import Site
 from django.core.mail import EmailMultiAlternatives, EmailMessage
 from django.utils.translation import ugettext_lazy as _
 from django import forms
 from django.contrib import messages

 try:
     from django.utils.encoding import force_text
 except ImportError:
     from django.utils.encoding import force_unicode as force_text

 from ..utils import (import_attribute, get_user_model,
                 generate_unique_username,
                 resolve_url)

 from . import app_settings

 USERNAME_REGEX = re.compile(r'^[\w.@+-]+$', re.UNICODE)

 ........ (other code)

 def render_mail(self, template_prefix, email, context):
    """
    Renders an e-mail to `email`.  `template_prefix` identifies the
    e-mail that is to be sent, e.g. "account/email/email_confirmation"
    """
    subject = render_to_string('{0}_subject.txt'.format(template_prefix),
                               context)
    # remove superfluous line breaks
    subject = " ".join(subject.splitlines()).strip()
    subject = self.format_email_subject(subject)

    bodies = {}
    for ext in ['html', 'txt']:
        try:
            template_name = '{0}_message.{1}'.format(template_prefix, ext)
            bodies[ext] = render_to_string(template_name,
                                           context).strip()
        except TemplateDoesNotExist:
            if ext == 'txt' and not bodies:
                # We need at least one body
                raise
    if 'txt' in bodies:
        msg = EmailMultiAlternatives(subject,
                                     bodies['txt'],
                                     settings.DEFAULT_FROM_EMAIL,
                                     [email])
        if 'html' in bodies:
            msg.attach_alternative(bodies['html'], 'text/html')
    else:
        msg = EmailMessage(subject,
                           bodies['html'],
                           settings.DEFAULT_FROM_EMAIL,
                           [email])
        msg.content_subtype = 'html'  # Main content is now text/html
    return msg

def send_mail(self, template_prefix, email, context):
    msg = self.render_mail(template_prefix, email, context)
    msg.send()'

位于 (allauth/account/adapter.py)

表单总是将邀请元素保存到数据库中,但会在发送电子邮件行中断。 (所有存储的信息都是正确的,因此不会破坏它)。如果删除了电子邮件,则之后的所有代码都可以正常运行。我什至尝试过发送这样的基本电子邮件:

from django.core.mail import EmailMessage
msg = EmailMessage("TEST", "HELLO", my_email, [some_email])
msg.send()

但这也不会发送电子邮件。

我希望这非常简单,但我们将不胜感激。

【问题讨论】:

  • 您看到任何错误吗? EMAIL_BACKEND 设置的值是多少?
  • 你能给出堆栈跟踪吗?

标签: django email


【解决方案1】:

我遇到了同样的问题,在 django shell (Django 1.7) 中运行此代码时执行刚刚挂起:

from django.core.mail import send_mail
send_mail('Subject here', 'Here is the message.', 'from@example.com',
    ['to@example.com'], fail_silently=False)

按照Django docs on email settings,我在settings.py中使用:

EMAIL_USE_TLS = False
EMAIL_USE_SSL = True
EMAIL_PORT = 465

这行得通。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 2012-05-20
    • 2015-01-23
    相关资源
    最近更新 更多