您好,登錄后才能下訂單哦!
前言
我們知道python中smtplib模塊用于郵件的功能,而django對(duì)這個(gè)這模塊進(jìn)行封裝,使得它使用起來十分簡(jiǎn)單。
django.core.mail就是django郵件的核心模塊。
兩個(gè)常用函數(shù)
它提供了兩個(gè)函數(shù),使用起來十分的簡(jiǎn)單:
def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None): pass def send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None, connection=None): pass # 參數(shù)介紹 # subject: 郵件主題 # message: 郵件內(nèi)容 # from_email: 發(fā)件人 # recipient_list: 收件人,這是一個(gè)列表,可以有多個(gè)收件人 # 以上4個(gè)在參數(shù) 在send_mass_mail中,會(huì)寫在datatuple這個(gè)元組中 # fail_silently: 是否報(bào)錯(cuò),True的話表忽略異常 # auth_user&auth_password:賬號(hào)密碼 # connection: 表示這個(gè)的鏈接對(duì)象,后續(xù)會(huì)提到 # html_message: send_mail方法獨(dú)有,可以比較簡(jiǎn)單地實(shí)現(xiàn)一個(gè)html文本的傳輸,具體我也沒使用過,不是很了解。
一般情況下,我們需要在setting中進(jìn)行配置,除了必須配置的host和port,一般我們也將賬號(hào)密碼寫在這里,這樣每次調(diào)用函數(shù)就不用傳遞這兩個(gè)參數(shù),當(dāng)不傳遞這兩個(gè)值,他們就會(huì)默認(rèn)去讀取setting中的值
返回值是成功發(fā)送了多個(gè)message,而不是多少個(gè)人,一般使用send_mail,都返回1
# settings.py # 我使用的是新浪的,host可以在對(duì)應(yīng)郵箱的設(shè)置中找到 EMAIL_HOST = 'smtp.sina.com' EMAIL_PORT = 25 # 你的郵箱賬號(hào)與密碼 EMAIL_HOST_USER = 'viptestfordjango@sina.com' EMAIL_HOST_PASSWORD = '******' # 由于使用25端口,一般都不使用TLS機(jī)密,SSL和TSL只需要設(shè)置一個(gè),他們同時(shí)為True或False EMAIL_USE_TLS = False # 發(fā)件人,只有這個(gè)變量名可以自己自定義,設(shè)置在這里是為了減少每次去寫 EMAIL_FROM = 'viptestfordjango@sina.com'
實(shí)例
from django.core.mail import send_mail, send_mass_mail from string import lowercase,uppercase,digits from random import randint from project.settings import EMAIL_FROM def send_code_email(email): """ 發(fā)送驗(yàn)證碼 """ # 0-9 a-z A-z code = '' seeds= lowercase+uppercase+digits length = len(seeds) # 生成4位驗(yàn)證碼 for i in range(4): code += seeds[randint(0, length-1)] send_title = '重置密碼' send_message = '你的驗(yàn)證碼是:{0}。'.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) def send_hello_email(email1, email2): """ 給email1發(fā)送 新年好 給email2發(fā)送 Happy New Year """ # message格式(subject, message, from_email, recipient_list) message1 = ('新年好', '新年好', 'EMAIL_FROM', [email]) message2 = ('Happy New Year', 'Happy New Year', EMAIL_FROM, [email2]) send_status=send_mass_mail((message1, message2), fail_silently=False)
很明顯可以看出2個(gè)函數(shù)的不同,send_mail一次發(fā)送一個(gè)message(給多人),而send_mass_mail一次可以發(fā)送不同的message(給多人)。
更深層的理解,前面提高一個(gè)參數(shù)connection,結(jié)合這個(gè)參數(shù),其實(shí)每建立一個(gè)連接,send_mail只發(fā)送一種message,而send_mass_mail建立一個(gè)連接,可以發(fā)送多個(gè)message,這樣子,效率明顯高很多。
高級(jí)功能
前面2個(gè)函數(shù)其實(shí)是對(duì)EmailMessage這個(gè)類進(jìn)行封裝,使他們使用起來,相當(dāng)?shù)暮?jiǎn)單,但它們的功能是十分有限的,例如,無法抄送(cc)或者私密發(fā)送(bcc)以及無法加入附件(attachments)
如果要是用剛剛說的功能,就必須直接使用EmailMessage這個(gè)類。
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'}, )
這個(gè)類參數(shù)中,抄送cc,私密發(fā)送bcc,回復(fù)reply_to都是一個(gè)列表。
值得一提的是attachments,它也是一個(gè)列表,它的元素始:MIMEBase對(duì)象或者(filename, content, mimetype)這個(gè)元組,即包括顯示的文件名,文件數(shù)據(jù),文件類型。
它還提供一些方法,主要提2個(gè):send()發(fā)送郵件,以及attach()添加附件
直接使用Backend
如果我們像上面那樣直接去調(diào)用EmailMessage.send(),這樣一次連接connection就只會(huì)發(fā)送一個(gè)message,那么如果我想發(fā)送多個(gè)message呢?
這個(gè)時(shí)候我們就有必要去了解backend了
其實(shí)django sending_email功能是由backend的控制的,這個(gè)類提供幾個(gè)方法:
open(): 開個(gè)一個(gè)連接
close(): 關(guān)閉這個(gè)連接
send_messages(email_messages): 接受一個(gè)EmailMessage對(duì)象的列表,然后將多個(gè)信息發(fā)送出去,而EmailMessage的send()方法就是調(diào)用這個(gè)方法,只是傳遞的參數(shù)是[self],就只有一個(gè)對(duì)象。
那么,其實(shí)如果我們能控制connection的開關(guān),那么我們就能實(shí)現(xiàn)多個(gè)EmailMessage對(duì)象在email發(fā)送出去,這個(gè)時(shí)候,我們考慮通過上下文自動(dòng)控制打開與關(guān)閉操作的方式:
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()
這樣的方法顯得有點(diǎn)笨拙,我們肯定希望能夠使用send_messages(),直接傳遞一個(gè)EmailMessage對(duì)象的列表給它。我們注意到上面的代碼get_connection()函數(shù),其實(shí)它就是能夠直接去獲取到一個(gè)backend的對(duì)象,然后通過直接調(diào)用這個(gè)send_messages()方法。
from django.core import mail connection = mail.get_connection() # get_EmailMessage_list返回一個(gè)EmailMessage對(duì)象的列表 messages = get_EmailMessage_list() connection.send_messages(messages)
這個(gè)直接調(diào)用send_messages(messages),如果此時(shí)沒有open鏈接的話,它會(huì)先打開連接,執(zhí)行關(guān)自動(dòng)關(guān)閉。
這樣子好像還有點(diǎn)不靈活,那也可以親自控制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()
這個(gè)例子使用EmailMessage.send()與connection.send_messages()的使用,這個(gè)只是展示作用,并沒用必要同時(shí)使用
backend類型與定制
說了那么多的backend,那它到底是什么,其實(shí)默認(rèn)的它就是: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
就是這個(gè)類,它繼承BaseEmailBackend了,是默認(rèn)的backend,控制了整個(gè)send mail的過程,當(dāng)然django還提供了其他backend,不過作用不是很大。
Console backend: 將郵件直接寫到你的stdout中。
Dummy backend: 沒有實(shí)際作用。
你只需要在setting中指定你的backend:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
當(dāng)然,還可以自定義backend,你需要繼承BaseEmailBackend,并且實(shí)現(xiàn)send_messages(email_messages),open,close方法,不過我感覺沒有這個(gè)必要,畢竟smtp.EmailBackend提供了較為完善的功能了。
后言
本文內(nèi)容基本來自django1.11官方文檔,文字部分都是基于文檔與自己的理解,可能會(huì)存在理解錯(cuò)誤,歡迎各位的指出。
參考文章:
django1.11官方文檔 email
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。