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="Submit">
    </form>
</body>
</html>
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', '[email protected]'),
                ['[email protected]'],
            )
            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 = ‘[email protected]‘

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.‘, ‘[email protected]‘,  [‘[email protected]‘], fail_silently=False);

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

 if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', '[email protected]'),
                ['[email protected]'],
            )

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

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

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

4.邮箱设置问题。

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

Connection refused等错误。

时间: 2024-11-08 19:12:57

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

Python django实现简单的邮件系统发送邮件功能

Python django实现简单的邮件系统发送邮件功能 本文实例讲述了Python django实现简单的邮件系统发送邮件功能. django邮件系统 Django发送邮件官方中文文档 总结如下: 1.首先这份文档看三两遍是不行的,很多东西再看一遍就通顺了.2.send_mail().send_mass_mail()都是对EmailMessage类使用方式的一个轻度封装,所以要关注底层的EmailMessage.3.异常处理防止邮件头注入.4.一定要弄懂Email backends 邮件发送后

Django电商第一章:立项需求分析和结构设计

Django电商第一章:立项需求分析和数据库设计 电商的7种商业模式介绍 电商即电子商务(Electronic Commerce),是是以信息网络技术为手段,以商品交换为中心的商务活动,其有多种模式: ①B2B(Business to Business):电子交易的双方都是商家,使用网络技术完成商务交易,如阿里巴巴.慧聪网等. ②B2C(Business to Consumer):直接面向消费者销售产品和服务商业零售模式,一般以网络零售业为主,主要借助互联网完成在线销售活动,如唯品会等. ③C2

The Django Book第七章(表单)

从Request对象中获取数据 在views函数里.我们常常写到 from django.http import HttpResponse def hello(request): return HttpResponse('Hello World') HttpReponse对象就是上面的request变量.这个变量非常有趣,可以获取到加载这个页面的是谁,用的什么浏览器. 属性/方法 说明 举例 request.path   除域名以外的请求路径,以正斜杠开头  "/hello/" req

The Django Book第六章(Admin)随笔

要使用Django自带的管理界面,首先得激活- 激活的前提首先在你的项目的seeting目录下的INSTALL_APPS必须有以下的的包 django.contrib.admin django.contrib.auth 用户鉴别系统(只有此包有的时候才能用 python manger.py createsuperuser ) django.contrib.contenttypes django.contrib.sessions 支持匿名会话 --以下可选 django.contrib.comme

(转)Django学习之 第一章:Django介绍

Django: Python编程Web框架 如果你上djangoproject.com你会发现对Django的如下解释: "Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design." 让我们展开来看 Django是高级Web框架 高级Web框架免去了构建动态Web站点的痛苦,它把常见的Web开发的问题抽象出来并提供了对频繁的编程任务

【DJango项目】第一章 验证码

我们现在在工程目录/meiduo_mall/apps中创建Django应用users,并在配置文件中注册users应用. python manage.py startapp users  ---->  INSTALL_APPS注册 class User(AbstractUser): """用户模型类""" mobile = models.CharField(max_length=11, unique=True, verbose_name='

django中使用celery异步发送邮件问题

通过提示说明Celery 4.x 需要Django1.11或者后面的版本,可是使用的是django1.8.2的版本,最先以为是自己什么地方配置出错了,找了很久也没有找到. 任务队列启动没错,任务处理启动也没问题,打开输入地址就报错. 最终看到使用的是Celery4.3.0,然后改成4.1.1版本就可以使用了. 具体问题没找到,应该是新版本加入了一些东西,以后再来研究. 原文地址:https://www.cnblogs.com/-666/p/11279843.html

django中的发送邮件功能

Django中内置了邮件发送功能,被定义在django.core.mail模块中发送邮件需要使用SMTP服务器, 常用的免费服务器有:163.126.QQ,下面以163邮件为例子: 注册163邮箱, 登录后设置--->POP3/SMTP/IMAP   中打开开发者模式 客户端的授权码' 的在项目的settings.py中加上 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.c

《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

书籍出处:https://www.packtpub.com/web-development/django-example原作者:Antonio Melé 2016年12月10日发布(没有进行校对,有很多错别字以及模糊不清的语句,请大家见谅) 2017年2月7日精校完成(断断续续的终于完成了第一章精校,感觉比直接翻译还要累,继续加油) 2017年2月10日再次进行精校(感谢大牛@kukoo的精校!) (译者注:本人目前在杭州某家互联网公司工作,岗位是测试研发,非常喜欢python,目前已经使用Dj