0

我是 Django 开发的新手。我有一个联系消息表单,它将从表单收集的数据发送给收件人,并将表单也保存在数据库中(sqlite)。

view.py 的代码:

def contact(request):
    if request.method == 'POST':
        from django.core.mail import send_mail
        form = MessageForm(request.POST or None)
        if form.is_valid():
            name = form.cleaned_data['name']
            sender = form.cleaned_data['email']
            telephone = form.cleaned_data['telephone']
            subject = "Contact Us Form - Message"

            message = "From: " + name + " ( " + sender + " ) " + "Phone: " + telephone + "\n\n"
            message += form.cleaned_data['message']

            recipients = ['somdip@steanne.co.uk']
            save_it = form.save(commit=False)
            save_it.save()
            result = "Your message has been delivered. Thank you for contacting us! We will get in touch very soon.."
            try:
                send_mail(subject, message, sender, recipients)
            except smtplib.SMTPException:
                result = smtplib.SMTPException.message
            return render(request, "contactus.html", {"result": result, "style": "display: block", 'form': form})
        else:
            return render(request, "contactus.html", {"result": "Failed to send the message. Please validate your data. ",
                                                    "style": "display: block", 'form': form})
    else:
        form = MessageForm()
    return render_to_response('contactus.html', {'form': form},  context_instance=RequestContext(request))

forms.py 中的代码:

class MessageForm(forms.ModelForm):
    class Meta:
        model = Message
        name = forms.CharField(label='Name *', max_length=120)
        email = forms.EmailField(label='Email *', max_length=120)
        telephone = forms.CharField(label='Telephone *', max_length=120)
        message = forms.CharField(label='Message *', max_length=2000, widget=forms.Textarea)

models.py 中的代码:

class Message(models.Model):
    name = models.CharField(max_length=120, null=False, blank=False)
    email = models.EmailField(null=False,  blank=False)
    telephone = models.CharField(max_length=120, null=True, blank=True)
    message = models.TextField(max_length=2000, null=False, blank=False)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)

    def __unicode__(self):
        return smart_unicode(self.email)

在 settings.py 我还添加了:

#Email Sending for ContactForm
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = 465
EMAIL_HOST_USER = 'SECRET'
EMAIL_HOST_PASSWORD = 'SECRET'
EMAIL_USE_SSL = True

当我按下提交时,它给了我一个异常错误:

“exceptions.BaseException”对象的属性“消息”

4

1 回答 1

0

您没有看到异常,您只是看到了以下输出:

>>> smtplib.SMTPException.message
<attribute 'message' of 'exceptions.BaseException' objects>

在这一行:

    result = smtplib.SMTPException.message

您指message的是 type 的属性smtplib.SMTPException,但实际上您需要访问message异常的实例。您的代码应为:

try:
    send_mail(subject, message, sender, recipients)
except smtplib.SMTPException as e:
    result = e.message
#    result = str(e)    # preferred!!! (see below)

在上面,异常实例绑定到变量e,您可以从中访问其message属性。

但是请注意,message从 Python 2.6 开始,该属性已被弃用。这应该发出警告(除非运行 Python-W error会产生错误)。在 Python 3 中,该属性不再存在,并且将引发异常。

试试这个:

try:
    send_mail(subject, message, sender, recipients)
except smtplib.SMTPException as e:
    result = str(e)
于 2014-12-10T11:57:37.910 回答