python實(shí)現(xiàn)郵件發(fā)送功能
什么是POP3、SMTP和MAP?
POP3是Post Office Protocol 3的簡(jiǎn)稱,即郵局協(xié)議的第三個(gè)版本,他是規(guī)定怎樣將個(gè)人計(jì)算機(jī)連接到Internet的郵件服務(wù)器和下載電子郵件的協(xié)議。它是因特網(wǎng)電子郵件的第一個(gè)離線協(xié)議的標(biāo)準(zhǔn)。POP3允許用戶從服務(wù)器上把郵件存儲(chǔ)到本地計(jì)算機(jī)上,同時(shí)刪除保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接受郵件服務(wù)器,用來(lái)接受電子郵件。
SMTP的全稱是Simple Mail Transfer Protocol,即簡(jiǎn)單的郵件傳輸協(xié)議。它是一組用于從源地址到目的地的地址傳輸郵件的規(guī)范,通過(guò)它控制郵件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或者中轉(zhuǎn)信件時(shí)找到下個(gè)目的地。SMTP服務(wù)器就是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器。
SMTP認(rèn)證,簡(jiǎn)單來(lái)說(shuō)就是要求必須在提供了賬戶名和密碼之后才能登陸SMTP服務(wù)器。
IMAP全稱是Iternet Mail Access Protocol,即交互式郵件存取協(xié)議,它是跟POP3類似的郵件訪問標(biāo)準(zhǔn)協(xié)議之一。不同的是,開啟了IMAP后,你在電子郵件客戶端收取的郵件仍然保存在服務(wù)器上,同時(shí)在客戶端上的操作都會(huì)反饋到服務(wù)器上,如:刪除郵件、標(biāo)記郵件等,服務(wù)器上的郵件也會(huì)做相應(yīng)的動(dòng)作。無(wú)論從瀏覽器登陸還是客戶端登陸郵箱看到的郵件以及狀態(tài)都是一致的。
我們使用網(wǎng)易的163郵箱來(lái)發(fā)送郵件,所以我們需要先將163郵箱的POP3/SMTP/IMAP都給打開。
具體步驟是:設(shè)置->POP3/SMTP/IMAP->設(shè)置POP3/SMTP/IMAP,點(diǎn)擊復(fù)選框時(shí)郵箱會(huì)要求你設(shè)置授權(quán)碼,設(shè)置授權(quán)碼,然后一定要將授權(quán)碼給記住,后面會(huì)用到。郵箱設(shè)置好后我們就開始編寫代碼發(fā)送郵件。
首先引入我們需要導(dǎo)入的庫(kù)及包
import smtplib import email # MIME 多郵件擴(kuò)充協(xié)議 from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart
然后設(shè)置郵箱的域名,端口,發(fā)送者郵箱,接收者郵箱
host = 'smtp.163.com' # 使用163郵箱 port = '465' # 163郵箱服務(wù)器的端口號(hào) sender = 'xxxxxx@163.com' # 發(fā)送者的郵箱 password = 'xxxxxx' # 授權(quán)碼 receiver = 'xxxxxx' # 接收者的郵箱,可以為其他類型的郵箱,如果是多個(gè)接收者請(qǐng)傳入列表
接下來(lái)構(gòu)建文本郵箱的主體
body = 'xxx' # 你要發(fā)送的郵件的內(nèi)容 subject = 'xxx' # 你要發(fā)送的郵件的標(biāo)題 # plain表示郵件內(nèi)容的類型,文本類型默認(rèn)是plain。utf-8表示內(nèi)容的編碼格式。 message = MIMEText(body, 'plain', 'utf-8') message['From'] = sender # 發(fā)送者 message['To'] = receiver # 接收者 message['Subject'] = subject # 郵件標(biāo)題
接下來(lái)我們獲取SMTP協(xié)議的證書,登陸我們的郵箱發(fā)送郵件
# 獲取SMTP協(xié)議證書 email_clint = smtplib.SMTP_SSL(host, port) # 登陸郵箱,這里也是用授權(quán)碼登陸郵箱的 login_result = email_clint.login(sender, password) # 發(fā)送郵件 email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string()) # 關(guān)閉郵件發(fā)送客戶端 email_client.close()
其實(shí)這里我們可以打印login_result,如果返回的狀態(tài)碼是235則證明郵件發(fā)送成功。
下面是發(fā)送文本郵件的全部代碼。
import email import smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart class SendEmail(object): def __init__(self): self.host = 'smtp.163.com' self.port = '465' self.sender = 'xxxxxx@163.com' self.password = 'xxxxxx' def send_email(self, receiver, subject='', body=''): message = MIMEText(body, 'plain', 'utf-8') message['From'] = self.sender message['To'] = receiver message['Subject'] = subject try: email_clint = smtplib.SMTP_SSL(self.host, self.port) print('獲取證書成功') login_result = email_clint.login(self.sender, self.password) print('開始登陸') if login_result[0] == 235: print('登陸成功') email_clint.sendmail(self.sender, receiver, message.as_string()) print('郵件發(fā)送成功') else: print('登陸失敗') except Exception as e: print('發(fā)生錯(cuò)誤', e)
下面介紹發(fā)送HTML格式內(nèi)容的郵件以及向郵件內(nèi)容中添加圖片。
其實(shí)發(fā)送HTML格式內(nèi)容的郵件很簡(jiǎn)單,只需將發(fā)送郵件的內(nèi)容格式改為html就行了,像這樣
message = MIMEText('<h2 style="color">學(xué)習(xí)使我快樂</h2>', 'html', 'utf-8')
還有使用內(nèi)嵌的方法向郵件內(nèi)容中加入文本或者圖片
# related 表示使用內(nèi)嵌資源的形式,將郵件發(fā)送給對(duì)方 message = MIMEMultipart('related')
然后向郵件中添加內(nèi)容,如果把圖片嵌入到郵件正文中只需在HTML中通過(guò)引用src="cid:x"即可。x代表圖片的編號(hào)可以是數(shù)字也可是是字符串
# ---------------發(fā)送文本----------------- message_html = MIMEText('<h2 style="color:red;font-size:100px">學(xué)習(xí)使我快樂</h2><img src="cid:small">','html','utf-8') # 將郵件內(nèi)容 裝入到郵件信息當(dāng)中去 message.attach(message_html) # ---------------發(fā)送圖片----------------- # rb 讀取二進(jìn)制文件(圖片是二進(jìn)制文件) image_data = open('1.gif','rb') # 設(shè)置讀取獲取的二進(jìn)制數(shù)據(jù) message_image = MIMEImage(image_data.read()) # 關(guān)閉剛才打開的文件 image_data.close() message_image.add_header('Content-ID','small') # 添加圖片文件到郵件信息當(dāng)中去 message.attach(message_image)
然后構(gòu)建郵件的主體,發(fā)送郵件即可
message['From'] = sender # 發(fā)送者 message['To'] = receiver # 接收者 message['Subject'] = subject # 郵件標(biāo)題 email_clint = smtplib.SMTP_SSL(host, port) login_result = email_clint.login(sender, password) email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string()) email_client.close()
我們經(jīng)常會(huì)向郵件中添加附件,下面介紹添加附件的方式
添加附件也是使用內(nèi)嵌的方式添加的
# 對(duì)二進(jìn)制文件需要設(shè)置默認(rèn)的編碼形式 # 對(duì)于MIMEText()來(lái)說(shuō) 默認(rèn)的編碼形式就是base64 # 如果對(duì)于二進(jìn)制文件來(lái)說(shuō) 沒有設(shè)置base64進(jìn)行編碼 則附件的就會(huì)呈現(xiàn)亂碼 # --------------------添加圖片附件---------------------- message_image = MIMEText(open('1.gif','rb').read(),'base64','utf-8') # 設(shè)置附件在郵件中的名字 message_image['Content-disposition'] = 'attachment;filename="happy.gif"' message.attach(message_image) # --------------------添加xlsx表格附件--------------- message_xlsx = MIMEText(open('table.xlsx','rb').read(),'base64','utf-8') # 設(shè)置附件在郵件當(dāng)中的名字 message_xlsx['Content-Disposition'] = 'attachment;filename="test.xlsx"' message.attach(message_xlsx)
然后發(fā)送郵件即可。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)判斷一個(gè)字符串是否包含子串的方法總結(jié)
這篇文章主要介紹了Python實(shí)現(xiàn)判斷一個(gè)字符串是否包含子串的方法,結(jié)合實(shí)例形式總結(jié)分析了四種比較常用的字符串子串判定方法,需要的朋友可以參考下2017-11-11Flask運(yùn)用Xterm實(shí)現(xiàn)交互終端的示例詳解
Xterm是一個(gè)基于X Window System的終端仿真器(Terminal Emulator),Xterm最初由MIT開發(fā),它允許用戶在X Window環(huán)境下運(yùn)行文本終端程序,本文給大家介紹了Flask運(yùn)用Xterm實(shí)現(xiàn)交互終端的示例詳解,文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面)
本文主要介紹了Python函數(shù)調(diào)用的幾種方式(類里面,類之間,類外面),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python中文分詞工具之結(jié)巴分詞用法實(shí)例總結(jié)【經(jīng)典案例】
這篇文章主要介紹了Python中文分詞工具之結(jié)巴分詞用法,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)中文文件的讀取與分詞操作過(guò)程中遇到的問題與解決方法,需要的朋友可以參考下2017-04-04python設(shè)計(jì)微型小說(shuō)網(wǎng)站(基于Django+Bootstrap框架)
這篇文章主要介紹了python設(shè)計(jì)微型小說(shuō)網(wǎng)站(基于Django+Bootstrap框架),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Jinja2實(shí)現(xiàn)模板渲染與訪問對(duì)象屬性流程詳解
要了解jinja2,那么需要先理解模板的概念。模板在Python的web開發(fā)中廣泛使用,它能夠有效的將業(yè)務(wù)邏輯和頁(yè)面邏輯分開,使代碼可讀性增強(qiáng),并且更加容易理解和維護(hù)。模板簡(jiǎn)單來(lái)說(shuō)就是一個(gè)其中包含占位變量表示動(dòng)態(tài)部分的文,模板文件在經(jīng)過(guò)動(dòng)態(tài)賦值后,返回給用戶2023-03-03Pycharm報(bào)錯(cuò):'NoneType'?object?has?no?attribute?
這篇文章主要給大家介紹了關(guān)于Pycharm報(bào)錯(cuò):'NoneType'?object?has?no?attribute?'bytes'的解決方法,文中通過(guò)圖文將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02