最近一直在纠结一个邮件发送的问题。

在本地Linux下搭建程序,不填写EMAIL设置就可以成功发送邮件,在远端的云服务器下的Linux环境就发送不了。在windows下搭建的程序也不能发送注册邮件,很是奇怪。

初步判断是代码没有问题,本地Linux服务器由于以前也鼓捣过其它东西,不一定与云端服务器保持一致。于是只能从官方文档的发送邮件说明入手,慢慢找原因。

from django.core.mail import send_mail

send_mail(u'邮件标题', u'邮件内容', 'from@example.com',
['to@example.com'], fail_silently=False)

在测试环境使用如上配置,就可以发送邮件了,看来得翻翻源码才能发现问题。

原作者使用如下的方法发送邮件:

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django.core.mail import EmailMessage
import threading class EmailThread(threading.Thread):
"""
发送账号激活邮件线程
"""
def __init__(self,subject='', body='', from_email=None, to=None):
self.subject = subject
self.body = body
self.from_email = from_email
self.to = to
self.fail_silently = True
threading.Thread.__init__(self) def run(self):
msg_email = EmailMessage(self.subject,self.body,self.from_email,self.to)
msg_email.content_subtype = 'html'
try:
msg_email.send(self.fail_silently)
except Exception,e:
# 记录错误日志
log = open('email_error.log','a')
log.write('%s %s\n' %(time.strftime('%Y-%m-%d %H:%M:%S'),e) )
log.close() def send_email(subject='', body='', from_email=None, to=[]):
"""
发送邮件方法
"""
email = EmailThread(subject, body, from_email, to)
email.start()
email.join()

基本了解代码的意思,但是经过几次摘出来最小化试验,还是不能发送成功注册邮件。本来通过最上面的最简单的方法可以发送邮件,但作者使用了线程,也许是出于效率和生产环境的考量。于是我上网找了找Django线程发送邮件的例子,还真找到了。就是代码无缩进…真是….

from django.core.mail import EmailMultiAlternatives
from django.template import loader
from settings import EMAIL_HOST_USER
from django.http import HttpResponse
import threading class my_EmailThread(threading.Thread):
def __init__(self, subject, body, from_email, recipient_list, fail_silently, html):
self.subject = subject
self.body = body
self.recipient_list = recipient_list
self.from_email = from_email
self.fail_silently = fail_silently
self.html = html
threading.Thread.__init__(self) def run (self):
msg = EmailMultiAlternatives(self.subject, self.body, self.from_email, self.recipient_list)
if self.html:
msg.attach_alternative(self.body,self.html)
msg.send(self.fail_silently) def my_send_mail(subject, body, from_email, to, fail_silently=False, html=None, *args, **kwargs):
my_EmailThread(subject, body, from_email, to, fail_silently, html).start()
def test_mail(subject='', body='', from_email=None, to=[]):
#subject = u'邮件主题'
#to_mail_list = ['abc@gmail.com','test@qq.com']
#body = loader.render_to_string('mail_template.html',{'email':email,'date':datetime.today(), })
#send_mail(subject,body,from_email,to_mail_list,html="text/html")
#my_send_mail(u'邮件标题', u'邮件内容', 'xxxx@163.com',['qqqq@163.com'],html="text/html")
my_send_mail(subject,body,from_email,to, html="text/html")

因为,有例子做对照,我直接把上面的代码加入到工程中。在send_mail与EmailThread前面添加my_为了使得两段代码共存,还没有搞懂整个工程的运行原理之前,还是保证原先的代码原样更安全些。

经过试验,直接传进参数,发送邮件没有问题。但是使用变量应用用户信息就会发送失败。

那么,找到上层的视图,控制变量进行测试,看看哪个变量没有正确替换。还真发现了问题。

to = [user.username]
....
#send_email(subject,body,from_email,to)
test_mail(subject,body,from_email,to)

test_mail就是调用的新的线程发送邮件,send_mail调用的原先的线程发送。如上的两种情况都不能发送邮件,就是因为to没有被赋予正确的邮件地址。

send_email(u'邮件标题', u'邮件内容', 'xxxx@163.com',['qqqq@163.com'])

这样的显示调用,原先的线程函处理方法也正确的工作了,看来,上面的两种线程发送邮件都是可用的。问题出现在变量上。

那么这个user.username又是什么,继续寻找…是使用的User引入的用户对象

from django.contrib.auth.models import User

看来问题不是出现在邮件发送方法上,而是用户对象上。至于为何本地的Linux不经配置,可以直接使用…(请教了作者,作者认为可能是django自带的邮件服务,暂时也就先这么放下这个诡异的问题)

明天开始了解下Django的用户方面,感觉不同平台出现不稳定的情况是因为代码还不够健壮…看能不能有新的发现~

初探Django线程发送邮件的更多相关文章

  1. Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)

    Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...

  2. Django之发送邮件

    Django的发送邮件是基于django的一个组件进行操作的,EmailMessage 基本使用方法: def send_html_mail(subject, html_content, from_a ...

  3. django实现发送邮件功能

    django实现邮件发送功能 1)首先注册一个邮箱,这里以163邮箱为例 2)注册之后登录,进行如下修改 找到设置,设置一个授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送 ...

  4. Django 初探--Django的开发服务器及创建数据库(笔记)

    1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django提供的内置服务器可以在代码修改时自动加载,从而实现网站的迅速开发. ...

  5. 初探Django Admin(一)

    前面的文章记录了django项目的一些操作,插入数据部分是手动在shell中操作的,如果能有一个图形界面来管理我们的数据,那该多好~ Django已经想到大家会需要这个功能,通过简单的配置,就能使用d ...

  6. j.u.c系列(01) ---初探ThreadPoolExecutor线程池

    写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 public void createExecutor() { internalExecutor ...

  7. java并发:初探用户线程和守护线程

    用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...

  8. django中向用户发送邮件信息

    发送邮件来让用户激活,因此,邮件中需要包含用户信息.但用户信息需要加密才可以.因此加密采用的是itsdangerous中的TimedJSONWebSignatureSerializer. 参考链接:h ...

  9. Java线程池详解

    一.线程池初探 所谓线程池,就是将多个线程放在一个池子里面(所谓池化技术),然后需要线程的时候不是创建一个线程,而是从线程池里面获取一个可用的线程,然后执行我们的任务.线程池的关键在于它为我们管理了多 ...

随机推荐

  1. R语言做文本挖掘 Part4文本分类

    Part4文本分类 Part3文本聚类提到过.与聚类分类的简单差异. 那么,我们需要理清训练集的分类,有明白分类的文本:測试集,能够就用训练集来替代.预測集,就是未分类的文本.是分类方法最后的应用实现 ...

  2. Windows Phone 启动器

    http://msdn.microsoft.com/zh-CN/library/gg278408(v=vs.92)#BKMK_Launchers using Microsoft.Phone.Contr ...

  3. Vivado的helloword计划(一个):硬件project部分

    硬件平台:ZedBoard 软件平台:vivado2013.3 本演示样例通过综合.实现,生成比特流,发送到SDK实现. 启动vivado而且创建一个项目 依据提示操作一步步创建新项目的时候记得选择R ...

  4. Oracle压缩总结2— 估计表压缩效应

    使用压缩前,我们可以估算压缩能有多大效果. 11gr2我已经能够使用dbms_comp_advisor,具体代码见附件.只需要运行两个文件dbmscomp.sql和prvtcomp.plb.然后使用D ...

  5. hdu 5072 Coprime(同色三角形+容斥)

    pid=5072">http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜 ...

  6. BZOJ 3505 CQOI 2014 数三角形 数学

    标题效果:到m*n该网络格,问:有网络格是一个三角形的顶点的数目. 思维:数学.首先计算所有三个相同的,不.然后,在上线的一个点失去了三个点是其中.需要注意的是,答案开放long long. CODE ...

  7. The JSON request was too large to be deserialized

    The JSON request was too large to be deserialized 这个问题出现的场景并不是很多,当你向服务端异步(ajax)post数据非常大的情况下(比如做权限管理 ...

  8. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  9. 皴linux rootpassword(方式:重置rootpassword)

    皴linux rootpassword: 开机后,.点击"e"进入维护模式.选"内核选项",例如,看到下面的数字: watermark/2/text/aHR0c ...

  10. 第三十讲:Android之Animation(五)

    天行健,君子以自强不息.--<周易·乾·象> 本讲内容:逐帧动画 Frame Animation 逐帧动画 Frame Animation就是说一帧一帧的连起来播放就变成了动画,和放电影的 ...