Django實現傳送郵件功能

Creabine發表於2016-12-24
最近用python寫了官網的後臺。官網的後臺功能比較簡單,一個多語言支援,一個聯絡我們,即給公司發郵件的功能。多語言支援的方式寫在另一篇部落格了。這裡先來說一說Django的傳送郵件功能。

其實python本身自帶了傳送郵件的功能,Django在其基礎上進行了封裝,使其更加簡單易用。僅僅幾行程式碼就可以實現傳送郵件的功能。
但是在實際開發的時候,遇到了兩個大坑,折騰了3天才真正搞定,在這裡做一個簡單的記錄和梳理,希望能幫其他小夥伴規避這些問題。

使用Django做傳送郵件的功能前,首先要有一個支援smtp協議的郵箱並檢查設定。**在這裡要控訴一下網易郵箱,163和126郵箱,都會強行把你要傳送的郵件判定為垃圾郵件,從而阻止傳送,所以這裡不建議使用。最好使用企業郵箱,付費的真的比較靠譜。**我這裡以騰訊企業郵箱作為示範:
1.登陸騰訊企業郵箱,進入設定--客戶端設定
2.確認SMTP服務是否開啟,如下圖:
3.若沒有開啟,記得開啟。然後看設定方法,下邊會用到。

這裡寫圖片描述

然後,要在settings.py檔案中配置郵箱相關引數:

# send e-mail
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'  #email後端
EMAIL_USE_TLS = False   #是否使用TLS安全傳輸協議
EMAIL_USE_SSL = True    #是否使用SSL加密,qq企業郵箱要求使用
EMAIL_HOST = 'smtp.exmail.qq.com'   #傳送郵件的郵箱 的 SMTP伺服器,這裡用了qq企業郵箱
EMAIL_PORT = 465     #發件箱的SMTP伺服器埠
EMAIL_HOST_USER = 'charleschen@xmdaren.com'    #傳送郵件的郵箱地址
EMAIL_HOST_PASSWORD = '*********'         #傳送郵件的郵箱密碼
最後,在views.py中製作一個簡單的demo郵件併傳送:
from django.core.mail import send_mail  
# send_mail的引數分別是  郵件標題,郵件內容,發件箱(settings.py中設定過的那個),收件箱列表(可以傳送給多個人),失敗靜默(若傳送失敗,報錯提示我們)
send_mail('Subject here', 'Here is the message.', 'charleschen@xmdaren.com',
    ['to@example.com'], fail_silently=False)
如果一切正常,那麼郵件傳送已經成功了。但是我很蛋疼的遇到了問題,報錯顯示是語法錯誤....

大坑注意

我到達上一步的時候,報錯顯示語法錯誤,可是一共就幾行程式碼,檢查了幾遍也沒錯,怎麼回事呢?後來改用python自帶的smtp模組傳送,一步步除錯之後,發現問題在登陸郵箱的時候就失敗了。然後在大神的帶領下,使用Wireshark軟體抓包,發現登陸時,SMTP協議會收取本地計算機名稱,在這個名稱中,不能包含諸如橫槓"-",空格" "等字元,而我的本地計算機名稱包含了"-",並且公司的區域網路由器在主機名後邊加了帶空格的字尾“HDCP HOST”所以導致SMTP協議校驗失敗。
問題清除之後就好辦了,首先修改主機名,然後在設定ip地址的高階設定-DNS中,手動新增一個合法的DNS字尾即可。我這裡改為dhcp3

這裡寫圖片描述

修改之後,傳送成功~

接下來的事情就簡單了,在這個基礎功能上,優化多郵件傳送,還有HTML格式郵件的支援,這些內容都沒什麼坑,我就不贅述了,大家直接看[自強學堂的教程即可](http://www.ziqiangxuetang.com/django/django-send-email.html)


有時候很簡單的功能,也會牽扯到很複雜的問題,或者報錯資訊很難定位問題,這時候要大膽推測,小心求證,列舉各種可能性,一一檢查,最後總能搞定的。希望這篇blog能幫你避開大坑。

相關文章