初探Django线程发送邮件
最近一直在纠结一个邮件发送的问题。
在本地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线程发送邮件的更多相关文章
- Python之路【第二十三篇】:Django 初探--Django的开发服务器及创建数据库(笔记)
Django 初探--Django的开发服务器及创建数据库(笔记) 1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django ...
- Django之发送邮件
Django的发送邮件是基于django的一个组件进行操作的,EmailMessage 基本使用方法: def send_html_mail(subject, html_content, from_a ...
- django实现发送邮件功能
django实现邮件发送功能 1)首先注册一个邮箱,这里以163邮箱为例 2)注册之后登录,进行如下修改 找到设置,设置一个授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送 ...
- Django 初探--Django的开发服务器及创建数据库(笔记)
1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django提供的内置服务器可以在代码修改时自动加载,从而实现网站的迅速开发. ...
- 初探Django Admin(一)
前面的文章记录了django项目的一些操作,插入数据部分是手动在shell中操作的,如果能有一个图形界面来管理我们的数据,那该多好~ Django已经想到大家会需要这个功能,通过简单的配置,就能使用d ...
- j.u.c系列(01) ---初探ThreadPoolExecutor线程池
写在前面 之前探索tomcat7启动的过程中,使用了线程池(ThreadPoolExecutor)的技术 public void createExecutor() { internalExecutor ...
- java并发:初探用户线程和守护线程
用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution i ...
- django中向用户发送邮件信息
发送邮件来让用户激活,因此,邮件中需要包含用户信息.但用户信息需要加密才可以.因此加密采用的是itsdangerous中的TimedJSONWebSignatureSerializer. 参考链接:h ...
- Java线程池详解
一.线程池初探 所谓线程池,就是将多个线程放在一个池子里面(所谓池化技术),然后需要线程的时候不是创建一个线程,而是从线程池里面获取一个可用的线程,然后执行我们的任务.线程池的关键在于它为我们管理了多 ...
随机推荐
- iOS如何兼容的应用程序32位系统和64Bit系统
苹果发布iPhone5S时刻,64应用程序位去了眼前.当时我看到苹果公布的官方数据iOS7.x的SDK支撑64位应用程序.而内置的应用程序已经64位置. 我记得自己刚刚接触电脑时还有16位的系统,指针 ...
- php脚本生成google play url的下载链接,下载apk并自动反编译后获取android版本号
需求: get the offer tracking link follow the redirect to get google play url Go to http: ...
- 用Ghostscript API将PDF格式转换为图像格式(C#)
原文:用Ghostscript API将PDF格式转换为图像格式(C#) 由于项目需要在.net下将pdf转换为普通图像格式,在网上搜了好久终于找到一个解决方案,于是采用拿来主义直接用.来源见代码中注 ...
- ural 1932 The Secret of Identifier (容斥原理)
标题效果: 计算到n字符串. 精确到只是有一个不同的字符,两个不同的字符.三个不同的字符,四对不同的字符. IDEAS: 枚举状态. dp[i] [j] ...当前串取出 i 状态下的全部字符转化成十 ...
- boxfilter 实现
A implementation of boxfilter boxfilter 是均值滤波的一种改进.在以下这篇blog里面有介绍. http://www.cnblogs.com/easymind22 ...
- vs2013 ADO联系SQL server2012数据库
平时,给定ADO例如使用以下过程数据源中的数据的数据库应用程序 (1) 创建一个Connection 物.定义的连接字符串信息.它包含了数据源名称.用户ID.密码.连接超时 . 默认数据库的位置和光标 ...
- Matlab中调用第三方Java代码
搞了一天,才算搞定. 第一步:定位Matlab中Java环境的ext目录 新建一个M script文件,或者直接在Matlab的交互式命令行中输入: disp(java.lang.System.get ...
- Net 一个请求的处理流程
Net 一个请求的处理流程 1.浏览器请求 请求-准备环境-->处理请求 2.Aspnet 环境的创建 客户请求 IIS区分静态文件还是动态文件,静态文件直接文件返回,动态文件通过asp ...
- java回调机制及其实现(转)
1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...
- Drupal 7.31 SQL注射分析POC
此漏洞昨日爆发 ,我们有时间去看看今天的代码. 于Drupal于,跑sql声明使用PDO型号,这是一般能够避免大部分的注射,由于使用占位符的sql语法语句是限制. 但是,这并不意味着绝对安全,. 在D ...