首页 > 代码库 > django book 第7章发送邮件碰到的种种问题

django book 第7章发送邮件碰到的种种问题

django中文版和英文版:(建议不想看英文版的可以参考中文版文字,但是代码不要看中文版的,有些出入会让你迷惑)。

http://djangobook.py3k.cn/2.0/chapter07/

<html>
<head>
    <title>Contact us</title>
</head>
<body>
    <h1>Contact us</h1>

    {% if errors %}
        <ul>
            {% for error in errors %}
            <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}

    <form action="/contact/" method="post">
        {% csrf_token %}
        <p>Subject: <input type="text" name="subject"></p>
        <p>Your e-mail (optional): <input type="text" name="email"></p>
        <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
        <input type="submit" value=http://www.mamicode.com/"Submit">>

from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render

def contact(request):
    errors = []
    if request.method == 'POST':
        if not request.POST.get('subject', ''):
            errors.append('Enter a subject.')
        if not request.POST.get('message', ''):
            errors.append('Enter a message.')
        if request.POST.get('email') and '@' not in request.POST['email']:
            errors.append('Enter a valid e-mail address.')
        if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )
            return HttpResponseRedirect('/contact/thanks/')
   return render(request, 'contact_form.html', {'errors': errors})   #不要用render_to_response,用render更方便


settings.py设置添加:

EMAIL_HOST = ‘smtp.163.com‘
EMAIL_PORT = ‘25‘
EMAIL_HOST_USER = ‘youremail@163.com‘
EMAIL_HOST_PASSWORD = ‘your passward‘
EMAIL_USE_TLS = False


几个需要注意的问题:(django 1.7.1)

1.html里边form需要加上{% csrf_tokon %},关于csrf攻击可以搜索相关信息。


2.views.py中的方法不建议使用render_to_response。在这里有两种调用方式:

return render_to_response(‘contact_form.html‘,{‘errors‘:errors},context_instance=RequestContext(request));

return render(request, ‘contact_form.html‘, {‘errors‘:errors});

在英文版的django book用的都是render,render封装了最后的RequestContext(request),用起来更加简洁。详细区别参考链接:

http://stackoverflow.com/questions/5154358/django-what-is-the-difference-between-render-render-to-response-and-direc


3.关于函数send_mail:

https://docs.djangoproject.com/en/dev/topics/email/

send_mail(‘Subject here‘, ‘Here is the message.‘, ‘from@example.com‘,  [‘to@example.com‘], fail_silently=False);

函数原型很容易懂,但是这里有些让人困惑的地方。

 if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', 'noreply@example.com'),
                ['siteowner@example.com'],
            )

你在settings.py里边配置的是request.POST.get(‘email‘, ‘noreply@example.com‘),这一句的邮件发送服务器,而不是你的站点管理人员的。也就是说,你这里设置的东西是提供给用户用来发邮件用的,但是如果别人留下了自己的的邮箱名又会出现“‘mail from address must be same as authorization user‘ ”的错误,因为别人的邮箱肯定和你settings.py里边设置的不匹配(不要误解使用了用户填的邮箱发送,使用的是你设置的邮件服务器)。后边的siteowner@example.com是可以随便填的接收邮箱,与设置无关。

所以我想这么解决,你随便申请个163邮箱用来给人发邮件,然后第三个参数就默认填这个邮箱,也就是settings.py里边需要设置的。然后把用户留下的email添加到邮件正文里边给你发过去,最后的siteowner@example.com是你用来接受用户反馈的邮箱。

我看到评注里边有说三四参数颠倒的,应该是没有明白settings.py设置的是给用户提供的一个邮件服务器用的,你要是颠倒了的话就让别人随意使用你的邮箱发送了。


4.邮箱设置问题。

163默认是开通了smtp的,但是qq没有开通,你需要到qq邮箱账户设置里边开通才可以,要不会出现Authentication failed, please open smtp flag first!‘或者

Connection refused等错误。

django book 第7章发送邮件碰到的种种问题