从Django 1.6.x升级到Django后,电子邮件不会发送> 1.7.x

时间:2015-05-01 15:04:56

标签: django email

我目前正在使用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()

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

我希望这非常简单,但任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

我有同样的问题,在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

这很有用。