最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

django基礎(chǔ)學(xué)習(xí)之send_mail功能

 更新時(shí)間:2019年08月07日 09:11:50   作者:__奇犽犽  
這篇文章主要給大家介紹了關(guān)于django基礎(chǔ)學(xué)習(xí)之send_mail功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用django具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

我們知道python中smtplib模塊用于郵件的功能,而django對(duì)這個(gè)這模塊進(jìn)行封裝,使得它使用起來(lái)十分簡(jiǎn)單。

django.core.mail就是django郵件的核心模塊。

兩個(gè)常用函數(shù)

它提供了兩個(gè)函數(shù),使用起來(lái)十分的簡(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ì)寫(xiě)在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文本的傳輸,具體我也沒(méi)使用過(guò),不是很了解。

一般情況下,我們需要在setting中進(jìn)行配置,除了必須配置的host和port,一般我們也將賬號(hào)密碼寫(xiě)在這里,這樣每次調(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í)為T(mén)rue或False
EMAIL_USE_TLS = False
# 發(fā)件人,只有這個(gè)變量名可以自己自定義,設(shè)置在這里是為了減少每次去寫(xiě)
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è)類(lèi)進(jìn)行封裝,使他們使用起來(lái),相當(dāng)?shù)暮?jiǎn)單,但它們的功能是十分有限的,例如,無(wú)法抄送(cc)或者私密發(fā)送(bcc)以及無(wú)法加入附件(attachments)
如果要是用剛剛說(shuō)的功能,就必須直接使用EmailMessage這個(gè)類(lèi)。

EmailMessage

# 類(lèi)定義
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è)類(lèi)參數(shù)中,抄送cc,私密發(fā)送bcc,回復(fù)reply_to都是一個(gè)列表。

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

它還提供一些方法,主要提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è)類(lèi)提供幾個(gè)方法:

open(): 開(kāi)個(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的開(kāi)關(guān),那么我們就能實(shí)現(xiàn)多個(gè)EmailMessage對(duì)象在email發(fā)送出去,這個(gè)時(shí)候,我們考慮通過(guò)上下文自動(dòng)控制打開(kāi)與關(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ì)象,然后通過(guò)直接調(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í)沒(méi)有open鏈接的話,它會(huì)先打開(kāi)連接,執(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è)只是展示作用,并沒(méi)用必要同時(shí)使用

backend類(lèi)型與定制

說(shuō)了那么多的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è)類(lèi),它繼承BaseEmailBackend了,是默認(rèn)的backend,控制了整個(gè)send mail的過(guò)程,當(dāng)然django還提供了其他backend,不過(guò)作用不是很大。

Console backend: 將郵件直接寫(xiě)到你的stdout中。

Dummy backend: 沒(méi)有實(shí)際作用。

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

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

當(dāng)然,還可以自定義backend,你需要繼承BaseEmailBackend,并且實(shí)現(xiàn)send_messages(email_messages),open,close方法,不過(guò)我感覺(jué)沒(méi)有這個(gè)必要,畢竟smtp.EmailBackend提供了較為完善的功能了。

后言

本文內(nèi)容基本來(lái)自django1.11官方文檔,文字部分都是基于文檔與自己的理解,可能會(huì)存在理解錯(cuò)誤,歡迎各位的指出。

參考文章:

django1.11官方文檔 email

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Python高級(jí)排序sort()函數(shù)使用技巧實(shí)例探索

    Python高級(jí)排序sort()函數(shù)使用技巧實(shí)例探索

    本文詳細(xì)介紹sort()函數(shù)的使用,包括基本排序、自定義排序、逆序排序等多種情況,并提供大量示例代碼,以幫助你充分理解和掌握這一函數(shù)的用法,探索更多sort()排序函數(shù)的作用
    2024-01-01
  • Python基于有道實(shí)現(xiàn)英漢字典功能

    Python基于有道實(shí)現(xiàn)英漢字典功能

    這篇文章主要介紹了Python基于有道實(shí)現(xiàn)英漢字典功能的方法,通過(guò)調(diào)用有道查詢接口實(shí)現(xiàn)英漢字典功能,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 使用Python實(shí)現(xiàn)從零開(kāi)始打造一個(gè)三維繪圖系統(tǒng)

    使用Python實(shí)現(xiàn)從零開(kāi)始打造一個(gè)三維繪圖系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)一個(gè)繪圖系統(tǒng),通過(guò)指定x,y,z的表達(dá)式,以實(shí)現(xiàn)三維繪圖的目的,感興趣的可以了解下
    2024-02-02
  • 基于python的Paxos算法實(shí)現(xiàn)

    基于python的Paxos算法實(shí)現(xiàn)

    這篇文章主要介紹了基于python的Paxos算法實(shí)現(xiàn),理解一個(gè)算法最快,最深刻的做法,我覺(jué)著可能是自己手動(dòng)實(shí)現(xiàn),雖然項(xiàng)目中不用自己實(shí)現(xiàn),有已經(jīng)封裝好的算法庫(kù),供我們調(diào)用,我覺(jué)著還是有必要自己親自實(shí)踐一下,需要的朋友可以參考下
    2019-07-07
  • Python列表list的詳細(xì)用法介紹

    Python列表list的詳細(xì)用法介紹

    這篇文章主要介紹了Python列表list的詳細(xì)用法介紹,列表(list)作為Python中基本的數(shù)據(jù)結(jié)構(gòu),是存儲(chǔ)數(shù)據(jù)的容器,相當(dāng)于其它語(yǔ)言中所說(shuō)的數(shù)組
    2022-07-07
  • Python中l(wèi)ist列表的賦值方法及遇到問(wèn)題處理

    Python中l(wèi)ist列表的賦值方法及遇到問(wèn)題處理

    這篇文章主要介紹了Python中l(wèi)ist列表的賦值方法及遇到問(wèn)題處理,記錄在列表list的賦值過(guò)程中遇到的問(wèn)題,并對(duì)列表的拷貝相關(guān)知識(shí)進(jìn)行匯總,需要的朋友可以參考一下
    2022-03-03
  • python通過(guò)移動(dòng)端訪問(wèn)查看電腦界面

    python通過(guò)移動(dòng)端訪問(wèn)查看電腦界面

    這篇文章主要介紹了python通過(guò)移動(dòng)端訪問(wèn)查看電腦界面,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python基礎(chǔ)之文件處理知識(shí)總結(jié)

    python基礎(chǔ)之文件處理知識(shí)總結(jié)

    今天帶大家了解python文件處理的相關(guān)知識(shí),文中介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • Python爬蟲(chóng)——爬取豆瓣電影Top250代碼實(shí)例

    Python爬蟲(chóng)——爬取豆瓣電影Top250代碼實(shí)例

    這篇文章主要介紹了Python爬取豆瓣電影Top250實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 基于Python制作一個(gè)多進(jìn)制轉(zhuǎn)換工具

    基于Python制作一個(gè)多進(jìn)制轉(zhuǎn)換工具

    這篇文章主要介紹了如何利用Python制作一個(gè)多進(jìn)制轉(zhuǎn)換工具,可以實(shí)現(xiàn)2進(jìn)制、4進(jìn)制、8進(jìn)制、10進(jìn)制、16進(jìn)制、32進(jìn)制直接的互轉(zhuǎn),需要的可以參考一下
    2022-02-02

最新評(píng)論

凌海市| 嘉峪关市| 洪泽县| 札达县| 句容市| 繁峙县| 平阳县| 宿迁市| 富阳市| 东乌珠穆沁旗| 安陆市| 明星| 萨迦县| 麦盖提县| 通江县| 汉川市| 建湖县| 论坛| 阳春市| 定边县| 临清市| 双流县| 庆元县| 读书| 平远县| 鄂州市| 辛集市| 嘉黎县| 南平市| 阿合奇县| 武宁县| 永平县| 昌邑市| 城固县| 繁峙县| 永泰县| 湄潭县| 三明市| 孟津县| 交口县| 连江县|