django 郵件發(fā)送模塊smtp使用詳解
前言
在Python中已經(jīng)內(nèi)置了一個(gè)smtp郵件發(fā)送模塊,Django在此基礎(chǔ)上進(jìn)行了簡(jiǎn)單地封裝,讓我們?cè)贒jango環(huán)境中可以更方便更靈活的發(fā)送郵件。
所有的功能都在django.core.mail中。
一、快速上手
兩行就可以搞定一封郵件:
from django.core.mail import send_mail send_mail( 'Subject here', 'Here is the message.', 'from@example.com', ['to@example.com'], fail_silently=False, )
導(dǎo)入功能模塊,然后發(fā)送郵件,so easy!
默認(rèn)情況下,使用配置文件中的EMAIL_HOST和EMAIL_PORT設(shè)置SMTP服務(wù)器主機(jī)和端口,EMAIL_HOST_USER和EMAIL_HOST_PASSWORD是用戶名和密碼。如果設(shè)置了EMAIL_USE_TLS和EMAIL_USE_SSL,它們將控制是否使用相應(yīng)的加密鏈接。
二、單發(fā) send_mail()
方法原型:send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]
讓我們來(lái)了解一下send_mail()方法,它接收一系列參數(shù),其中的subject、message、from_email和recipient_list參數(shù)是必須的,其它的可選。
- subject:郵件主題。字符串。
- message:郵件具體內(nèi)容。字符串。
- from_email:郵件發(fā)送者。字符串。
- recipient_list:收件人。一個(gè)由郵箱地址組成的字符串列表。recipient_list中的每一個(gè)成員都會(huì)在郵件信息的“To:”區(qū)域看到其它成員。
- fail_silently: 一個(gè)布爾值。如果它是False,send_mail發(fā)送失敗時(shí),將會(huì)引發(fā)一個(gè)smtplib.SMTPException異常。
- auth_user: 可選的用戶名用來(lái)驗(yàn)證SMTP服務(wù)器,如果你要特別指定使用哪個(gè)郵箱帳號(hào),就指定這個(gè)參數(shù)。如果沒(méi)有提供這個(gè)值,Django將會(huì)使用settings中EMAIL_HOST_USER的值。如果兩者都不提供,那你還發(fā)什么???
- auth_password: 可選的密碼用來(lái)驗(yàn)證SMTP服務(wù)器。如果沒(méi)有提供這個(gè)值,Django 將會(huì)使用settings中EMAIL_HOST_PASSWORD的值。和上面那個(gè)參數(shù)是一家的。
- connection: 可選的用來(lái)發(fā)送郵件的電子郵件后端。
- html_message: 如果提供了html_message,可以發(fā)送帶HTML代碼的郵件。
send_mail()方法返回值將是成功發(fā)送出去的郵件數(shù)量(只會(huì)是0或1,因?yàn)樗荒馨l(fā)送一封郵件)。
三、群發(fā) send_mass_mail()
方法原型:send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None ,connection = None)[source]
send_mass_mail()用來(lái)處理大批量郵件任務(wù),也就是所謂的群發(fā)。
它的參數(shù)中,datatuple是必需參數(shù),接收一個(gè)元組,元組的每個(gè)元素的格式如下:
(subject, message, from_email, recipient_list)
上面四個(gè)字段的意義與send_mail()中的相同。
例如,以下代碼將向兩組不同的收件人發(fā)送兩個(gè)不同的消息;但是,只能打開(kāi)一個(gè)到郵件服務(wù)器的連接:
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_mass_mail()方法的返回值是成功發(fā)送的郵件數(shù)量。
使用send_mail()方法時(shí),每調(diào)用一次,它會(huì)和SMTP服務(wù)器建立一次連接,也就是發(fā)一次連一次,效率很低。而send_mass_mail(),則只建立一次鏈接,就將所有的郵件都發(fā)送出去,效率比較高。
四、防止頭部注入攻擊
有時(shí)候,我們要根據(jù)用戶表單的輸入來(lái)構(gòu)造電子郵件,這就存在頭部注入攻擊的風(fēng)險(xiǎn),Django給我們提供了一定的防范能力,但是更多時(shí)候,還需要你自己編寫(xiě)安全防范代碼。
下面是一個(gè)例子,接收用戶輸入的主題、郵件內(nèi)容和發(fā)送方,將郵件發(fā)送到系統(tǒng)管理員:
from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect
def send_email(request):
subject = request.POST.get('subject', '')
message = request.POST.get('message', '')
from_email = request.POST.get('from_email', '')
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ['admin@example.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse('Make sure all fields are entered and valid.')
如果檢查到用戶的輸入帶有頭部注入攻擊的可能性,會(huì)彈出BadHeaderError異常。
五、發(fā)送多媒體郵件
默認(rèn)情況下,發(fā)送的郵件都是純文本格式的。但有時(shí)候我們希望能在郵件里帶一些超級(jí)鏈接、圖片,甚至視頻和JS動(dòng)作。
Django為我們提供了一個(gè)EmailMultiAlternatives類,可以同時(shí)發(fā)送文本和HTML內(nèi)容,下面是個(gè)范例,我們照著寫(xiě)就行:
from django.core.mail import EmailMultiAlternatives subject, from_email, to = 'hello', 'from@example.com', 'to@example.com' text_content = 'This is an important message.' html_content = '<p>This is an <strong>important</strong> message.</p>' msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) msg.attach_alternative(html_content, "text/html") msg.send()
需要提醒的是,接收方的郵件服務(wù)商不一定支持多媒體郵件,也許是為了安全,也許是別的原因。為了保證你的郵件內(nèi)容能被閱讀,請(qǐng)務(wù)必同時(shí)發(fā)送純文本郵件。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)PDF轉(zhuǎn)Word的方法詳解
由于PDF的文件大多都是只讀文件,有時(shí)候?yàn)榱藵M足可以編輯的需要通??梢詫DF文件直接轉(zhuǎn)換成Word文件進(jìn)行操作。本文為大家整理了一些實(shí)現(xiàn)方法,希望對(duì)大家有所幫助2023-02-02
Python Pygame實(shí)戰(zhàn)之塔防游戲的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Python中的Pygame模塊制作簡(jiǎn)單的塔防小游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-03-03
將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例
今天小編就為大家分享一篇將tensorflow的ckpt模型存儲(chǔ)為npy的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Python庫(kù)Theano深度神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)訓(xùn)練深入探究
Theano是一個(gè)用于深度學(xué)習(xí)的Python庫(kù),它提供了高效的數(shù)值計(jì)算和自動(dòng)微分功能,使得深度神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)和訓(xùn)練變得更加容易,本文將深入探討Theano的功能和用法,并提供豐富的示例代碼,幫助大家入門(mén)深度學(xué)習(xí)2024-01-01
在Python中關(guān)于中文編碼問(wèn)題的處理建議
這篇文章主要介紹了幾種在Python中關(guān)于中文編碼問(wèn)題的處理方法,包括在使用Unicode編碼時(shí)碰到的異常等,需要的朋友可以參考下2015-04-04
圖文詳解梯度下降算法的原理及Python實(shí)現(xiàn)
梯度下降是迭代法的一種,可以用于求解最小二乘問(wèn)題(線性和非線性都可以)。本文將通過(guò)圖文詳解梯度下降算法的原理及實(shí)現(xiàn),需要的可以參考一下2022-08-08
Python 實(shí)現(xiàn)簡(jiǎn)單的客戶端認(rèn)證
這篇文章主要介紹了Python 如何實(shí)現(xiàn)簡(jiǎn)單的客戶端認(rèn)證,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解
本文主要介紹了Numpy中扁平化函數(shù)ravel()和flatten()的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

