我們在Django中會碰到發送郵件的需求,Django中內置了郵件發送功能,被定義在django.core.mail
模塊中。發送郵件需要使用SMTP服務器,常用的免費服務器有:163、126、QQ,下面以163郵件為例。
使用Django發送郵件就相當於,事先准備好一個可用的郵箱賬戶,並設置好POP3/SMTP/IMAP。然后去該郵箱獲得授權碼,Django在發郵件時通過授權碼登錄該郵箱,然后通過這個郵箱向指定的一個或多個賬號發送郵件。
Django中發送郵件步驟
第一步:setting.py配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = True # 是否使用TLS安全傳輸協議(用於在兩個通信應用程序之間提供保密性和數據完整性。)
EMAIL_USE_SSL = False # 是否使用SSL加密,qq企業郵箱要求使用
EMAIL_HOST = 'smtp.163.com' # 發送郵件的郵箱 的 SMTP服務器,這里用了163郵箱
EMAIL_PORT = 25 # 發件箱的SMTP服務器端口
# 上面配置可以不動,下面配置修改為自己的
EMAIL_HOST_USER = 'tin@163.com' # 發送郵件的郵箱地址
EMAIL_HOST_PASSWORD = 'xxxxxx' # 發送郵件的郵箱密碼(這里使用的是授權碼)
EMAIL_TO_USER_LIST = ['xxxx@foxmail.com', 'xxx@qq.com'] # 此字段是可選的,用來配置收件人列表
第二步:url.py
... # 發送郵件
url(r'^send_emial/', views.send_email, name="send_email") ...
第三步:views.py
簡單發送郵件:
from django.core.mail import send_mail from django.shortcuts import HttpResponse def send_email(request): send_mail( subject='這里是郵件標題', message='這里是郵件內容', from_email='tian@163.com', # 發件人
recipient_list=['1206180814@qq.com'], # 收件人
#收件人可以直接寫,也可以從setting.py中配置中導入
fail_silently=False ) return HttpResponse('OK')
send_mail
各參數如下:
- subject,郵件標題
- message,發送郵件內容
- from_email,發件人
- recipient_list,收件人,可以是多個
- fail_silently,如果為
False
時,發送失敗拋出錯誤
現在,有了上述這些關鍵代碼之后,我們就可以向指定的郵箱發郵件了,如果收不到郵件,可有去看垃圾郵件中找找,可能被當成了垃圾郵件(我在qq郵箱中遇到這情況,解決辦法是,點開這個郵件,點擊我不是垃圾郵件,就好了)。
多封郵件發送多個收件人
from django.core.mail import send_mail, send_mass_mail def send_email(request): message1 = ('郵件標題1', '內容1', 'tian@163.com', ['1206180814@qq.com']) message2 = ('郵件標題2', '內容2', 'tian@163.com', ['1206180814@qq.com']) send_mass_mail((message1, message2), fail_silently=False) return HttpResponse('OK')
當發送多封郵件時,就要使用send_mass_mail
了。上例中的列表內,也可以填寫多個收件人。
這里簡要說下send_mail
和send_mass_mail
的區別:
send_mail
每次發郵件都會建立一個連接,發多封郵件時建立多個連接。而 send_mass_mail
是建立單個連接發送多封郵件,所以一次性發送多封郵件時 send_mass_mail
要優於 send_mail
。
發送帶附件的郵件
導入EmailMessage來完成:
from django.shortcuts import render, HttpResponse from django.core.mail import EmailMessage def send_email(request): """發送帶附件""" msg = EmailMessage( subject='這是帶附件的郵件標題', body='這是帶附件的郵件內容', from_email='tian@163.com', # 也可以從settings中獲取
to=['1206180814@qq.com'] ) msg.attach_file('t2.xls') msg.send(fail_silently=False) return HttpResponse('OK')
上例中,attach_file
使用當前文件系統下的某個文件做為附件。調用時,傳入某個文件的完整路徑,以及該附件的MIME類型(可選的)。 忽略MIME類型的話,Django會自動根據附件文件名來推測MIME類型。最簡單的用法如下:
message.attach_file('/images/weather_map.png')
另外的,我們還可以使用attach
傳遞三個參數:filename
,content
和 mimetype. filename
是出現在郵件中的附件文件的名稱,content
是附件的內容,而 mimetype
是附件所使用的MIME類型。 如果忽略 mimetype
, Django會自動根據附件文件名來推測MIME內容類型。
例如:
message.attach('design.png', img_data, 'image/png')