Django 发送email配置详解及各种错误类型

跟随Django Book的内容发送邮件不成功,总结一下需要配置好settings.py文件,还要注意一些细节。

1、在settings文件最后添加以下内容,缺一不可!

EMAIL_HOST= 'smtp.163.com'
EMAIL_PORT= 25
EMAIL_HOST_USER = 'xxxxxx@163.com'(你有163邮箱的话)
EMAIL_HOST_PASSWORD = ‘xxxxxxx'
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER 

这里Host邮箱最好还是写163的,qq的我试过不行,别的也不敢保证可以。如果出现“STARTTLS extension not supported by server”这种错误类型很有可能是邮箱不支持。

2、出现Forbidden (403)“CSRF verification failed. Request aborted.”的错误

需要添加{% csrf_token %}到form中去,<form action="/contact/" method="post">{% csrf_token %}<p>...</p>...</form> 

之后在contact()方法的views.py中添加from django.template import RequestContext并且最后一句改为return render_to_response('contact_form.html',{'errors': errors}, context_instance=RequestContext(request))即可

3、我的目录结构是这样的:

mysite-->

books/

contact/

mysite/

templates/

manage.py

4.最后附上完整代码

templates/contact_form.html文件如下

  1.  
    <html>
  2.  
    <head>
  3.  
    <title>Contact us</title>
  4.  
    </head>
  5.  
    <body>
  6.  
    <h1>Contact us</h1>
  7.  
     
  8.  
    {% if errors %}
  9.  
    <ul>
  10.  
    {% for error in errors %}
  11.  
    <li>{{ error }}</li>
  12.  
    {% endfor %}
  13.  
    </ul>
  14.  
    {% endif %}
  15.  
     
  16.  
    <form action="/contact/" method="post">{% csrf_token %}
  17.  
    <p>Subject: <input type="text" name="subject"></p>
  18.  
    <p>Your e-mail (optional): <input type="text" name="email"></p>
  19.  
    <p>Message: <textarea name="message" rows="10" cols="50"></textarea></p>
  20.  
    <input type="submit" value="Submit">
  21.  
    </form>
  22.  
    </body>
  23.  
    </html>


contact/views.py文件如下:

  1.  
    from django.core.mail import send_mail
  2.  
    from django.http import HttpResponseRedirect
  3.  
    from django.shortcuts import render
  4.  
    from django.template import RequestContext
  5.  
    def contact(request):
  6.  
    errors = []
  7.  
    if request.method == 'POST':
  8.  
    if not request.POST.get('subject', ''):
  9.  
    errors.append('Enter a subject.')
  10.  
    if not request.POST.get('message', ''):
  11.  
    errors.append('Enter a message.')
  12.  
    if request.POST.get('email') and '@' not in request.POST['email']:
  13.  
    errors.append('Enter a valid e-mail address.')
  14.  
    if not errors:
  15.  
    send_mail(
  16.  
    request.POST['subject'],
  17.  
    request.POST['message'],
  18.  
    request.POST.get('email', 'noreply@example.com'),
  19.  
    ['接收信件的邮箱!'],
  20.  
    )
  21.  
    return HttpResponseRedirect('/contact/thanks/')
  22.  
    return render(request, 'contact_form.html',
  23.  
    {'errors': errors},context_instance=RequestContext(request))

mysite/mysite/urls.py如下:

  1.  
    from django.conf.urls import *
  2.  
    from django.contrib import admin
  3.  
    from books import views
  4.  
    from mysite.views import emailsuccess
  5.  
    from contact.views import contact
  6.  
    admin.autodiscover()
  7.  
     
  8.  
    urlpatterns = patterns('',
  9.  
    (r'^contact/$',contact),
  10.  
    (r'^contact/thanks/$',emailsuccess),
  11.  
    )

mysite/mysite/views.py文件如下:

  1.  
    from django.http import HttpResponse,Http404
  2.  
    def emailsuccess(request):
  3.  
    return HttpResponse("Send Succeed!")


欢迎交流讨论,共同学习!

转载请注明出处:http://blog.csdn.net/monkeyduck

原文地址:https://www.cnblogs.com/ExMan/p/9471097.html