django發送郵件send_mail&send_mass_mail


一、配置

在setting.py中進行相關配置:

EMAIL_HOST = 'smtp.sina.cn'                 #SMTP地址
EMAIL_PORT = 25                             #SMTP端口
EMAIL_HOST_USER = 'xxxxxxxxxxx@sina.cn'     #我自己的郵箱
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxx'        #我的郵箱密碼
EMAIL_USE_TLS = False                       #與SMTP服務器通信時,是否啟動TLS鏈接(安全鏈接)。默認是false
EMAIL_FROM = 'xxxxxxxxxxx@sina.cn'          #發件人        

二、發送郵件

新建一個send_email.py文件。采用diango中的send_email()方法進行郵件的發送。

send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)

發送郵件最簡單的方法是使用django.core.mail.send_mail()。

subject、message、from_email和 recipient_list 參數是必須的。

  • subject:一個字符串,為郵件標題。
  • message:一個字符串,郵件正文。
  • from_email:一個字符串,發件人。
  • recipient_list:一個由郵箱地址組成的字符串列表。recipient_list 中的每一個成員都會在郵件信息的“To:”區域看到其它成員。
  • fail_silently: 是否報錯,True的話表忽略異常。
  • connection: 表示這個的鏈接對象。
from django.core.mail import send_mail
from MxOnline2.settings import EMAIL_FROM

email_title = '慕學在線網注冊激活平台'
email_body = '請點擊下面的鏈接激活你的賬號:xxx'
send_status = send_mail(email_title, email_body, EMAIL_FROM, [xxxxx.qq.com])

一次性發送多個郵件:

send_mass_mail(datatuple, fail_silently=False, auth_user=None,auth_password=None, connection=None)
from django.core.mail import send_mass_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)

備注:send_mail 每次發郵件都會建立一個連接,發多封郵件時建立多個連接。而 send_mass_mail 是建立單個連接發送多封郵件,所以一次性發送多封郵件時 send_mass_mail 要優於 send_mail。

 

高級功能

前面2個函數其實是對EmailMessage這個類進行封裝,使他們使用起來,相當的簡單,但它們的功能是十分有限的,例如,無法抄送(cc)或者私密發送(bcc)以及無法加入附件(attachments)

如果要是用剛剛說的功能,就必須直接使用EmailMessage這個類。

# 類定義
class EmailMessage(object):
 def __init__(self, subject='', body='', from_email=None, to=None, bcc=None,
     connection=None, attachments=None, headers=None, cc=None,
     reply_to=None):
 pass
# 使用
from django.core.mail import EmailMessage
email = EmailMessage(
 'Hello',
 'Body goes here',
 'from@example.com',
 ['to1@example.com', 'to2@example.com'],
 ['bcc@example.com'],
 reply_to=['another@example.com'],
 headers={'Message-ID': 'foo'},
)

這個類參數中,抄送cc,私密發送bcc,回復reply_to都是一個列表。

值得一提的是attachments,它也是一個列表,它的元素始:MIMEBase對象或者(filename, content, mimetype)這個元組,即包括顯示的文件名,文件數據,文件類型。

它還提供一些方法,主要提2個:send()發送郵件,以及attach()添加附件

直接使用Backend

如果我們像上面那樣直接去調用EmailMessage.send() ,這樣一次連接connection就只會發送一個message,那么如果我想發送多個message呢?

這個時候我們就有必要去了解backend了

其實django sending_email功能是由backend的控制的,這個類提供幾個方法:

open() : 開個一個連接

close() : 關閉這個連接

send_messages(email_messages) : 接受一個EmailMessage對象的列表,然后將多個信息發送出去,而EmailMessage的send()方法就是調用這個方法,只是傳遞的參數是[self],就只有一個對象。

那么,其實如果我們能控制connection的開關,那么我們就能實現多個EmailMessage對象在email發送出去,這個時候,我們考慮通過上下文自動控制打開與關閉操作的方式:

from django.core import mail
with mail.get_connection() as connection:
 mail.EmailMessage(
  subject1, body1, from1, [to1],
  connection=connection,
 ).send()
 mail.EmailMessage(
  subject2, body2, from2, [to2],
  connection=connection,
 ).send()

這樣的方法顯得有點笨拙,我們肯定希望能夠使用send_messages() ,直接傳遞一個EmailMessage對象的列表給它。我們注意到上面的代碼get_connection()函數,其實它就是能夠直接去獲取到一個backend的對象,然后通過直接調用這個send_messages()方法。

from django.core import mail
connection = mail.get_connection()
# get_EmailMessage_list返回一個EmailMessage對象的列表
messages = get_EmailMessage_list()
connection.send_messages(messages)

這個直接調用send_messages(messages) ,如果此時沒有open鏈接的話,它會先打開連接,執行關自動關閉。

這樣子好像還有點不靈活,那也可以親自控制open與close!

from django.core import mail
connection = mail.get_connection()
connection.open()
email1 = mail.EmailMessage(
 'Hello',
 'Body goes here',
 'from@example.com',
 ['to1@example.com'],
 connection=connection,
)
email1.send()
email2 = mail.EmailMessage(
 'Hello',
 'Body goes here',
 'from@example.com',
 ['to2@example.com'],
)
email3 = mail.EmailMessage(
 'Hello',
 'Body goes here',
 'from@example.com',
 ['to3@example.com'],
)
connection.send_messages([email2, email3])
connection.close()

這個例子使用EmailMessage.send()connection.send_messages()的使用,這個只是展示作用,並沒用必要同時使用

backend類型與定制

說了那么多的backend,那它到底是什么,其實默認的它就是:backends.smtp.EmailBackend

# 在django.core.mail。backends.smtp.下
class EmailBackend(BaseEmailBackend):
 def __init__(self, host=None, port=None, username=None, password=None,
     use_tls=None, fail_silently=False, use_ssl=None, timeout=None,
     ssl_keyfile=None, ssl_certfile=None,**kwargs):
  pass

就是這個類,它繼承BaseEmailBackend了,是默認的backend,控制了整個send mail的過程,當然django還提供了其他backend,不過作用不是很大。

Console backend: 將郵件直接寫到你的stdout中。

Dummy backend: 沒有實際作用。

你只需要在setting中指定你的backend:

EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

 

 

轉自https://blog.csdn.net/geerniya/article/details/78562003、https://www.jb51.net/article/134480.htm


免責聲明!

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



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