Django內置發送郵件功能


我們在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_mailsend_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傳遞三個參數:filenamecontent 和 mimetype. filename 是出現在郵件中的附件文件的名稱,content 是附件的內容,而 mimetype 是附件所使用的MIME類型。 如果忽略 mimetype, Django會自動根據附件文件名來推測MIME內容類型。
例如:

message.attach('design.png', img_data, 'image/png')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM