初探Django线程发送邮件

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

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

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

from django.core.mail import send_mail

send_mail(u‘邮件标题‘, u‘邮件内容‘, ‘[email protected]‘,
    [‘[email protected]‘], 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 = [‘[email protected]‘,‘[email protected]‘]
    #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‘邮件内容‘, ‘[email protected]‘,[‘[email protected]‘],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‘邮件内容‘, ‘[email protected]‘,[‘[email protected]‘])

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

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

from django.contrib.auth.models import User

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

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

时间: 2024-10-09 16:41:06

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

django实现发送邮件功能

django实现邮件发送功能 1)首先注册一个邮箱,这里以163邮箱为例 2)注册之后登录,进行如下修改 找到设置,设置一个授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送邮件时,可以代替密码 3)然后在项目里的配置文件settings.py中进行一些配置: EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = False #是否使用TLS安全传输协议(用于在两个通信

初探Django

Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 安装Django #命令行安装 pip3 install django #或者 去Django官网下载 #或者拿IDE安装,我用的是pycharm 1,创建Django项目 #命令行 django-admin startproject my_site #mysite是项目名称 #IDE创建本质上就

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

1.Django的开发服务器 Django框架中包含一些轻量级的web应用服务器,开发web项目时不需再对其配置服务器,Django提供的内置服务器可以在代码修改时自动加载,从而实现网站的迅速开发. 在我们创建的Django_Pro项目的目录下,打开Dos命令行,启动内置服务器: manage.py runserver 默认情况下,使用命令manage.py runserver 启动内置服务器,默认使用本机8000端口,若需要使用其他端口(例如8001),则使用命令 manage.py runs

初探Django Admin(一)

前面的文章记录了django项目的一些操作,插入数据部分是手动在shell中操作的,如果能有一个图形界面来管理我们的数据,那该多好~ Django已经想到大家会需要这个功能,通过简单的配置,就能使用django提供的后台模块,来管理我们的数据 在url模块天剑admin.autodiscover()来自动初始化函数 from django.conf.urls import patterns, include, url from django.contrib import admin admin.

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

用户线程和守护线程 用户线程 用户线程执行完,jvm退出.守护线程还是可以跑的 /** * A <i>thread</i> is a thread of execution in a program. The Java * Virtual Machine allows an application to have multiple threads of * execution running concurrently. * <p> * Every thread has

Python Web框架之Django初探(一)

Python Web框架之Django初探 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的框架模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. Django可以运行在Apache,Nginx上,也可以运行在支持WSGI,FastCGI的服务器上.支持多种数据

Django 学习笔记二

通过邮件分享post django创建表单 from django import forms class EmailPostForm(forms.Form): name = forms.CharField(max_length=25) email = forms.EmailField() to = forms.EmailField() comments = forms.CharField(required=False, widget=forms.Textarea) 在视图中处理表单 from d

如何通过多线程轮询待发送邮件进行发送

默认情况下,C# 程序具有一个线程.此线程执行程序中以 Main 方法开始和结束的代码.Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止.不过,可以创建辅助线程,以便与主线程一起并行执行代码.这些线程通常称为“辅助线程”. 多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态.多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务.为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与

Linux线程学习

线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, 比创建进程小很多 进程内独立的一条运行路线 处理器调度的最小单元,也称为轻量级进程 可以对进程的内存空间和资源进行访问,并与同一进程中的其他线程共享 线程相关的执行状态和存储变量放在线程控制表内 一个进程可以有多个线程,有多个线程控制表及堆栈寄存器,共享一个用户地址空间 多线程同步问题 线程共享进程的