一、配置
在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:
轉自https://blog.csdn.net/geerniya/article/details/78562003、https://www.jb51.net/article/134480.htm