我自己在看這一節之前自己先實現了一下,django-admin.py startproject testEmail新建一個新項目,urls.py把urlpatterns的第一行取消注釋,改成url(r'^$', 'testEmail.views.home', name='home'),在urls.py所在文件夾里面新建一個view.py文件,把以下內容拷貝進去
#*_*coding:utf-8*_* from django.shortcuts import HttpResponse from django.core.mail import send_mail def home(request): send_mail('subject', 'message', '2bitt@sina.com', ['568445851@qq.com','2092296286@qq.com'],fail_silently=False) return HttpResponse("ok")
在配置文件里面添加一下內容,如果報編碼語言有錯,可以在首行加上這句#*_*coding:utf-8*_*
#郵件配置 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.sina.com' #SMTP地址 EMAIL_PORT = 587 #SMTP端口 EMAIL_HOST_USER = '***' #自己的郵箱名 EMAIL_HOST_PASSWORD = '****' #自己的郵箱密碼 EMAIL_SUBJECT_PREFIX = '2BiTT' #為郵件Subject-line前綴,默認是'[django]' EMAIL_USE_TLS = True #與SMTP服務器通信時,是否啟動TLS鏈接(安全鏈接)。默認是false
然后運行python manage.py runserver,打開鏈接http://127.0.0.1:8000,看到ok即表明郵件發送成功了
下面開始正式介紹django Email
通過stmplib模塊,python使得發送郵件變得很簡單,django也提供了幾個輕量級的封裝,這些封裝使得發郵件變得更快,更容易的在開發階段測試發郵件功能並且為那些不能使用stmp的提供了平台支持。
配置
發送郵件的配置是關鍵的,主要有一下幾項:
- EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend',默認是這個,可以不配
- EMAIL_HOST = 'smtp.sina.com' #SMTP地址
- EMAIL_PORT = 587 #SMTP端口
- EMAIL_HOST_USER = '2bitt@sina.com' #自己的郵箱名
- EMAIL_HOST_PASSWORD = '2bitt1314' #自己的郵箱密碼
- EMAIL_SUBJECT_PREFIX = '2BiTT' #為郵件Subject-line前綴,默認是'[django]'
- EMAIL_USE_TLS = True #與SMTP服務器通信時,是否啟動TLS鏈接(安全鏈接)。默認是false
使用
send_mail()
發送郵件最簡單的函數是send_mail,函數位於django.core.mail模塊下面,函數原型如下:
send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None,auth_password=None, connection=None),其實每個參數的意思也是很容易懂得
- subject: 一個字符串,主題
- message: 郵件內容,也是一個字符串
- from_email: 發送郵箱,一個字符串類型的字符串,要求和EMAIL_HOST_USER一致
- recipient_list: 一個列表,元素是接收郵箱字符串,每一個接收郵箱用一個字符串表示
- fail_silently: 是否安靜的失敗,如果是,發送失敗不拋出異常,否則拋出一個smtplib.SMTPException
- auth_user: 認證發送郵箱用戶名,如果不提供,將使用EMAIL_HOST_USER 的值
- auth_password: 郵箱密碼,如果不提供,使用EMAIL_HOST_PASSWORD 的值
- connection: 發送郵件用的后端,如果不提供,將使用 Email backends的值
send_mass_mail()
send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None,connection=None)
send_mass_mail()提供了一個把發送內容封裝成元組然后再封裝在一個元組里面的參數datatuple,這有利於批量發送編輯好的郵件,datatuple每一個元素都是以下的格式
(subject, message, from_email, recipient_list)
send_mass_mail的其他參數和send_mail的一樣
message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com']) message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com']) send_mass_mail((message1, message2), fail_silently=False)
mail_admins()
- mail_admins( subject, message, fail_silently=False, connection=None, html_message=None)提供了一個給管理員發送郵件的快捷方式,啟用這個功能的話,先要在你的設置文件里面配置好ADMINS和SERVER_EMAIL,前者是收件人,后者是發件人
- 如果你提供了html_message的話,郵件內容會被替換成html_message的內容
mail_managers()
- mail_managers( subject, message, fail_silently=False, connection=None, html_message=None)和mail_admins類似
防止頭部注入
頭部注入是一個可以讓攻擊者插入額外的頭部從而控制發件人和收件人的安全漏洞,django通過禁止在頭部中出現換行符的方式預防頭部注入,只要郵件主題,發送方和接收列表有任何的一項包含換行符,django都會拋出django.core.mail.BadHeaderError的異常,然后拒接發送郵件,下面是一個例子:
from django.core.mail import send_mail, BadHeaderError def send_email(request): subject = request.POST.get('subject', '') message = request.POST.get('message', '') from_email = request.POST.get('from_email', '') if subject and message and from_email: try: send_mail(subject, message, from_email, ['admin@example.com']) except BadHeaderError: return HttpResponse('Invalid header found.') return HttpResponseRedirect('/contact/thanks/') else: # In reality we'd use a form class # to get proper validation errors. return HttpResponse('Make sure all fields are entered and valid.')
測試郵件發送
當系統在開發的時候,你並不想真的發送郵件到指定的郵箱,那么我們可以使用其他的一些方法來測試我們的郵件發送功能,這將說道郵件后端的選擇問題了,請繼續看下去
郵件后端
SMTP后端
默認的郵件后端,這是真是將郵件發送到指定郵箱的后端
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Console后端
console后端把郵件寫入到stdoutEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
測試結果如下圖:
文件后端
把郵件寫到文件里面,需要提供一個EMAIL_FILE_PATH參數,可以在配置文件里面直接指明,或者用get_connection()函數里面傳入file_path關鍵字參數,結果見下圖:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend' EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
內存中的后端
發送的郵件存在內存中。。。。。
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
假后端
如其名,假的
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'