欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

django基礎(chǔ)學習之send_mail功能

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

前言

我們知道python中smtplib模塊用于郵件的功能,而django對這個這模塊進行封裝,使得它使用起來十分簡單。

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

兩個常用函數(shù)

它提供了兩個函數(shù),使用起來十分的簡單:

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: 收件人,這是一個列表,可以有多個收件人 
# 以上4個在參數(shù) 在send_mass_mail中,會寫在datatuple這個元組中 
# fail_silently: 是否報錯,True的話表忽略異常 
# auth_user&auth_password:賬號密碼 
# connection: 表示這個的鏈接對象,后續(xù)會提到 
# html_message: send_mail方法獨有,可以比較簡單地實現(xiàn)一個html文本的傳輸,具體我也沒使用過,不是很了解。

一般情況下,我們需要在setting中進行配置,除了必須配置的host和port,一般我們也將賬號密碼寫在這里,這樣每次調(diào)用函數(shù)就不用傳遞這兩個參數(shù),當不傳遞這兩個值,他們就會默認去讀取setting中的值

返回值是成功發(fā)送了多個message,而不是多少個人,一般使用send_mail,都返回1

# settings.py
# 我使用的是新浪的,host可以在對應(yīng)郵箱的設(shè)置中找到
EMAIL_HOST = 'smtp.sina.com'
EMAIL_PORT = 25
# 你的郵箱賬號與密碼
EMAIL_HOST_USER = 'viptestfordjango@sina.com'
EMAIL_HOST_PASSWORD = '******'
# 由于使用25端口,一般都不使用TLS機密,SSL和TSL只需要設(shè)置一個,他們同時為True或False
EMAIL_USE_TLS = False
# 發(fā)件人,只有這個變量名可以自己自定義,設(shè)置在這里是為了減少每次去寫
EMAIL_FROM = 'viptestfordjango@sina.com'

實例

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ā)送驗證碼
  """
  # 0-9 a-z A-z
  code = ''
  seeds= lowercase+uppercase+digits
  length = len(seeds)
  # 生成4位驗證碼
  for i in range(4):
    code += seeds[randint(0, length-1)]
  send_title = '重置密碼'
  send_message = '你的驗證碼是:{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個函數(shù)的不同,send_mail一次發(fā)送一個message(給多人),而send_mass_mail一次可以發(fā)送不同的message(給多人)。

更深層的理解,前面提高一個參數(shù)connection,結(jié)合這個參數(shù),其實每建立一個連接,send_mail只發(fā)送一種message,而send_mass_mail建立一個連接,可以發(fā)送多個message,這樣子,效率明顯高很多。

高級功能

前面2個函數(shù)其實是對EmailMessage這個類進行封裝,使他們使用起來,相當?shù)暮唵危鼈兊墓δ苁鞘钟邢薜?,例如,無法抄送(cc)或者私密發(fā)送(bcc)以及無法加入附件(attachments)
如果要是用剛剛說的功能,就必須直接使用EmailMessage這個類。

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'},
)

這個類參數(shù)中,抄送cc,私密發(fā)送bcc,回復reply_to都是一個列表。

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

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

直接使用Backend

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

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

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

open(): 開個一個連接

close(): 關(guān)閉這個連接

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

那么,其實如果我們能控制connection的開關(guān),那么我們就能實現(xiàn)多個EmailMessage對象在email發(fā)送出去,這個時候,我們考慮通過上下文自動控制打開與關(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()

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

from django.core import mail

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

這個直接調(diào)用send_messages(messages),如果此時沒有open鏈接的話,它會先打開連接,執(zhí)行關(guān)自動關(guā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()

這個例子使用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'

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

后言

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

參考文章:

django1.11官方文檔 email

總結(jié)

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

您可能感興趣的文章:

相關(guān)文章

  • Python圖片檢索之以圖搜圖

    Python圖片檢索之以圖搜圖

    由于很多論文里面的測試圖片沒有標號,就不能確定它們是Testset數(shù)據(jù)集中哪幾張圖片.為了能解決這個問題,需要完成以圖片去搜索整個數(shù)據(jù)集文件目錄的任務(wù).本文有非常詳細的圖文示例,需要的朋友可以參考下
    2021-05-05
  • Django 2.0版本的新特性搶先看!

    Django 2.0版本的新特性搶先看!

    12 月 2 日,Python Web 開發(fā)框架 Django 官網(wǎng)發(fā)文宣布推送 Django 2.0 版。在 Django 2.0 的發(fā)布說明中,最大吸引注意的內(nèi)容就是兼容性。,下面這篇文章主要給大家介紹了關(guān)于Django 2.0版本的新特性的相關(guān)資料,需要的朋友可以參考下。
    2018-01-01
  • python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼

    python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼

    這篇文章主要介紹了python+selenium 簡易地疫情信息自動打卡簽到功能的實現(xiàn)代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • Python 3.8 新功能全解

    Python 3.8 新功能全解

    這篇文章主要介紹了Python 3.8 新功能全解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-07-07
  • Python基礎(chǔ)常用內(nèi)建函數(shù)圖文示例解析

    Python基礎(chǔ)常用內(nèi)建函數(shù)圖文示例解析

    這篇文章主要為大家Python常用內(nèi)建函數(shù),文中通過圖例詳細的給大家作出了講解分析,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09
  • numpy庫ndarray多維數(shù)組的維度變換方法(reshape、resize、swapaxes、flatten)

    numpy庫ndarray多維數(shù)組的維度變換方法(reshape、resize、swapaxes、flatten)

    這篇文章主要介紹了numpy庫ndarray多維數(shù)組的維度變換方法(reshape、resize、swapaxes、flatten),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Python中的min及返回最小值索引的操作

    Python中的min及返回最小值索引的操作

    這篇文章主要介紹了Python中的min及返回最小值索引的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Python實現(xiàn)計算圓周率π的值到任意位的方法示例

    Python實現(xiàn)計算圓周率π的值到任意位的方法示例

    這篇文章主要介紹了Python實現(xiàn)計算圓周率π的值到任意位的方法,簡單分析了圓周率的計算原理,并結(jié)合實例形式分析了Python計算圓周率的相關(guān)操作技巧,需要的朋友可以參考下
    2018-05-05
  • python elasticsearch環(huán)境搭建詳解

    python elasticsearch環(huán)境搭建詳解

    在本篇文章里小編給大家整理的是關(guān)于python elasticsearch環(huán)境搭建的相關(guān)知識點內(nèi)容,有需要的朋友們可以參考下。
    2019-09-09
  • python?利用?PrettyTable?美化表格

    python?利用?PrettyTable?美化表格

    這篇文章主要介紹了python?利用?PrettyTable?美化表格,首先按行設(shè)置數(shù)據(jù)展開相關(guān)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04

最新評論