Python smtp郵件發(fā)送模塊用法教程
在Python中已經(jīng)內(nèi)置了一個smtp郵件發(fā)送模塊,Django在此基礎(chǔ)上進行了簡單地封裝,讓我們在Django環(huán)境中可以更方便更靈活的發(fā)送郵件。
所有的功能都在django.core.mail中。
一、快速上手
兩行就可以搞定一封郵件:
from django.core.mail import send_mailsend_mail( ’Subject here’, ’Here is the message.’, ’from@example.com’, [’to@example.com’], fail_silently=False,)
導入功能模塊,然后發(fā)送郵件,so easy!
默認情況下,使用配置文件中的EMAIL_HOST和EMAIL_PORT設(shè)置SMTP服務器主機和端口,EMAIL_HOST_USER和EMAIL_HOST_PASSWORD是用戶名和密碼。如果設(shè)置了EMAIL_USE_TLS和EMAIL_USE_SSL,它們將控制是否使用相應的加密鏈接。
二、單發(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]
讓我們來了解一下send_mail()方法,它接收一系列參數(shù),其中的subject、message、from_email和recipient_list參數(shù)是必須的,其它的可選。
subject:郵件主題。字符串。 message:郵件具體內(nèi)容。字符串。 from_email:郵件發(fā)送者。字符串。 recipient_list:收件人。一個由郵箱地址組成的字符串列表。recipient_list中的每一個成員都會在郵件信息的“To:”區(qū)域看到其它成員。 fail_silently: 一個布爾值。如果它是False,send_mail發(fā)送失敗時,將會引發(fā)一個smtplib.SMTPException異常。 auth_user: 可選的用戶名用來驗證SMTP服務器,如果你要特別指定使用哪個郵箱帳號,就指定這個參數(shù)。如果沒有提供這個值,Django將會使用settings中EMAIL_HOST_USER的值。如果兩者都不提供,那你還發(fā)什么??? auth_password: 可選的密碼用來驗證SMTP服務器。如果沒有提供這個值,Django 將會使用settings中EMAIL_HOST_PASSWORD的值。和上面那個參數(shù)是一家的。 connection: 可選的用來發(fā)送郵件的電子郵件后端。 html_message: 如果提供了html_message,可以發(fā)送帶HTML代碼的郵件。 send_mail()方法返回值將是成功發(fā)送出去的郵件數(shù)量(只會是0或1,因為它只能發(fā)送一封郵件)。三、群發(fā) send_mass_mail()
方法原型:send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None ,connection = None)[source]
send_mass_mail()用來處理大批量郵件任務,也就是所謂的群發(fā)。
它的參數(shù)中,datatuple是必需參數(shù),接收一個元組,元組的每個元素的格式如下:
(subject, message, from_email, recipient_list)
上面四個字段的意義與send_mail()中的相同。
例如,以下代碼將向兩組不同的收件人發(fā)送兩個不同的消息;但是,只能打開一個到郵件服務器的連接:
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()方法時,每調(diào)用一次,它會和SMTP服務器建立一次連接,也就是發(fā)一次連一次,效率很低。而send_mass_mail(),則只建立一次鏈接,就將所有的郵件都發(fā)送出去,效率比較高。
四、防止頭部注入攻擊
有時候,我們要根據(jù)用戶表單的輸入來構(gòu)造電子郵件,這就存在頭部注入攻擊的風險,Django給我們提供了一定的防范能力,但是更多時候,還需要你自己編寫安全防范代碼。
下面是一個例子,接收用戶輸入的主題、郵件內(nèi)容和發(fā)送方,將郵件發(fā)送到系統(tǒng)管理員:
from django.core.mail import send_mail, BadHeaderErrorfrom django.http import HttpResponse, HttpResponseRedirectdef 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.’)
如果檢查到用戶的輸入帶有頭部注入攻擊的可能性,會彈出BadHeaderError異常。
五、發(fā)送多媒體郵件
默認情況下,發(fā)送的郵件都是純文本格式的。但有時候我們希望能在郵件里帶一些超級鏈接、圖片,甚至視頻和JS動作。
Django為我們提供了一個EmailMultiAlternatives類,可以同時發(fā)送文本和HTML內(nèi)容,下面是個范例,我們照著寫就行:
from django.core.mail import EmailMultiAlternativessubject, 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()
需要提醒的是,接收方的郵件服務商不一定支持多媒體郵件,也許是為了安全,也許是別的原因。為了保證你的郵件內(nèi)容能被閱讀,請務必同時發(fā)送純文本郵件。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. python爬蟲實戰(zhàn)之制作屬于自己的一個IP代理模塊2. IntelliJ IDEA設(shè)置默認瀏覽器的方法3. HTML 絕對路徑與相對路徑概念詳細4. Spring如何使用xml創(chuàng)建bean對象5. Java程序的編碼規(guī)范(6)6. python實現(xiàn)PolynomialFeatures多項式的方法7. python實現(xiàn)在內(nèi)存中讀寫str和二進制數(shù)據(jù)代碼8. Android Studio設(shè)置顏色拾色器工具Color Picker教程9. python 利用toapi庫自動生成api10. vue 如何從單頁應用改造成多頁應用
