在本地Linux下搭建程序,不填寫EMAIL設(shè)置就可以成功發(fā)送郵件,在遠端的云服務(wù)器下的Linux環(huán)境就發(fā)送不了。在windows下搭建的程序也不能發(fā)送注冊郵件,很是奇怪。
目前創(chuàng)新互聯(lián)建站已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬主機、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、崇左網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。初步判斷是代碼沒有問題,本地Linux服務(wù)器由于以前也鼓搗過其它東西,不一定與云端服務(wù)器保持一致。于是只能從官方文檔的發(fā)送郵件說明入手,慢慢找原因。
from django.core.mail import send_mail
send_mail(u'郵件標(biāo)題', u'郵件內(nèi)容', 'from@example.com',
['to@example.com'], fail_silently=False)
在測試環(huán)境使用如上配置,就可以發(fā)送郵件了,看來得翻翻源碼才能發(fā)現(xiàn)問題。
原作者使用如下的方法發(fā)送郵件:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-from django.core.mail import EmailMessage
import threading
class EmailThread(threading.Thread):
"""
發(fā)送賬號激活郵件線程
""" 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
' %(time.strftime('%Y-%m-%d %H:%M:%S'),e) )
log.close()
def send_email(subject='', body='', from_email=None, to=[]):
"""
發(fā)送郵件方法
"""
email= EmailThread(subject, body, from_email, to)
email.start()
email.join()
基本了解代碼的意思,但是經(jīng)過幾次摘出來最小化試驗,還是不能發(fā)送成功注冊郵件。本來通過最上面的最簡單的方法可以發(fā)送郵件,但作者使用了線程,也許是出于效率和生產(chǎn)環(huán)境的考量。于是我上網(wǎng)找了找Django線程發(fā)送郵件的例子,還真找到了。就是代碼無縮進…真是….
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'郵件標(biāo)題', u'郵件內(nèi)容', 'xxxx@163.com',['qqqq@163.com'],html="text/html") my_send_mail(subject,body,from_email,to, html="text/html")
因為,有例子做對照,我直接把上面的代碼加入到工程中。在send_mail與EmailThread前面添加my_為了使得兩段代碼共存,還沒有搞懂整個工程的運行原理之前,還是保證原先的代碼原樣更安全些。
經(jīng)過試驗,直接傳進參數(shù),發(fā)送郵件沒有問題。但是使用變量應(yīng)用用戶信息就會發(fā)送失敗。
那么,找到上層的視圖,控制變量進行測試,看看哪個變量沒有正確替換。還真發(fā)現(xiàn)了問題。
to = [user.username]
....
#send_email(subject,body,from_email,to)test_mail(subject,body,from_email,to)
test_mail就是調(diào)用的新的線程發(fā)送郵件,send_mail調(diào)用的原先的線程發(fā)送。如上的兩種情況都不能發(fā)送郵件,就是因為to沒有被賦予正確的郵件地址。
send_email(u'郵件標(biāo)題', u'郵件內(nèi)容', 'xxxx@163.com',['qqqq@163.com'])
這樣的顯示調(diào)用,原先的線程函處理方法也正確的工作了,看來,上面的兩種線程發(fā)送郵件都是可用的。問題出現(xiàn)在變量上。
那么這個user.username又是什么,繼續(xù)尋找…是使用的User引入的用戶對象
from django.contrib.auth.models import User
看來問題不是出現(xiàn)在郵件發(fā)送方法上,而是用戶對象上。至于為何本地的Linux不經(jīng)配置,可以直接使用…(請教了作者,作者認為可能是django自帶的郵件服務(wù),暫時也就先這么放下這個詭異的問題)
明天開始了解下Django的用戶方面,感覺不同平臺出現(xiàn)不穩(wěn)定的情況是因為代碼還不夠健壯…看能不能有新的發(fā)現(xiàn)~