Python 發(fā)送郵件

最近通過python寫了一個(gè)小的用例,現(xiàn)在demo基本上完成了,把用到的知識進(jìn)行下梳理。
內(nèi)容就由近到遠(yuǎn)吧,因?yàn)檠矍坝眠^的是最熱乎的,也就是標(biāo)題所說明的,發(fā)送郵件。

常用的電子郵件協(xié)議(此內(nèi)容來自百度百科電子郵件協(xié)議)

常用的電子郵件協(xié)議有SMTP、POP3、IMAP4,它們隸屬于TCP/IP協(xié)議簇,默認(rèn)狀態(tài)下,分別通過TCP端口25、110、143建立連接。

協(xié)議類型

SMTP協(xié)議

SMTP的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協(xié)議。它是一組用于從源地址到目的地址傳輸郵件的規(guī)范,通過它來控制郵件的中轉(zhuǎn)方式。SMTP 協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。SMTP 服務(wù)器就是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器。SMTP認(rèn)證,簡單地說就是要求必須在提供了賬戶名和密碼之后才可以登錄 SMTP 服務(wù)器,這就使得那些垃圾郵件的散播者無可乘之機(jī)。增加 SMTP 認(rèn)證的目的是為了使用戶避免受到垃圾郵件的侵?jǐn)_。

POP協(xié)議

POP郵局協(xié)議負(fù)責(zé)從郵件服務(wù)器中檢索電子郵件。它要求郵件服務(wù)器完成下面幾種任務(wù)之一:從郵件服務(wù)器中檢索郵件并從服務(wù)器中刪除這個(gè)郵件;從郵件服務(wù)器中檢索郵件但不刪除它;不檢索郵件,只是詢問是否有新郵件到達(dá)。POP協(xié)議支持多用戶互聯(lián)網(wǎng)郵件擴(kuò)展,后者允許用戶在電子郵件上附帶二進(jìn)制文件,如文字處理文件和電子表格文件等,實(shí)際上這樣就可以傳輸任何格式的文件了,包括圖片和聲音文件等。在用戶閱讀郵件時(shí),POP命令所有的郵件信息立即下載到用戶的計(jì)算機(jī)上,不在服務(wù)器上保留。

POP3(Post Office Protocol 3)即郵局協(xié)議的第3個(gè)版本,是因特網(wǎng)電子郵件的第一個(gè)離線協(xié)議標(biāo)準(zhǔn)。

IMAP協(xié)議

互聯(lián)網(wǎng)信息訪問協(xié)議(IMAP)是一種優(yōu)于POP的新協(xié)議。和POP一樣,IMAP也能下載郵件、從服務(wù)器中刪除郵件或詢問是否有新郵件,但I(xiàn)MAP克服了POP的一些缺點(diǎn)。例如,它可以決定客戶機(jī)請求郵件服務(wù)器提交所收到郵件的方式,請求郵件服務(wù)器只下載所選中的郵件而不是全部郵件。客戶機(jī)可先閱讀郵件信息的標(biāo)題和發(fā)送者的名字再決定是否下載這個(gè)郵件。通過用戶的客戶機(jī)電子郵件程序,IMAP可讓用戶在服務(wù)器上創(chuàng)建并管理郵件文件夾或郵箱、刪除郵件、查詢某封信的一部分或全部內(nèi)容,完成所有這些工作時(shí)都不需要把郵件從服務(wù)器下載到用戶的個(gè)人計(jì)算機(jī)上。

支持種IMAP的常用郵件客戶端有:ThunderMail,Foxmail,Microsoft Outlook等。

傳輸方式

Internet上傳送電子郵件是通過一套稱為郵件服務(wù)器的程序進(jìn)行硬件管理并儲存的。與個(gè)人計(jì)算機(jī)不同,這些郵件服務(wù)器及其程序必須每天24小時(shí)不停地運(yùn)行,否則就不能收發(fā)郵件了,簡單郵件傳輸協(xié)議SMTP(Simple Mail Transfer Protocol)和郵局協(xié)議POP(Post Office Protocol)是負(fù)責(zé)用客戶機(jī)/服務(wù)器模式發(fā)送和檢索電子郵件的協(xié)議。

用戶計(jì)算機(jī)上運(yùn)行的電子郵件客戶機(jī)程序請求郵件服務(wù)器進(jìn)行郵件傳輸,郵件服務(wù)器采用簡單郵件傳輸協(xié)議標(biāo)準(zhǔn)。很多郵件傳輸工具,如outlook express、fox mail等,都遵守SMTP標(biāo)準(zhǔn)并用這個(gè)協(xié)議向郵件服務(wù)器發(fā)送郵件。SMTP協(xié)議規(guī)定了郵件信息的具體格式和郵件的管理方式。

郵箱設(shè)置

為了能夠?qū)崟r(shí)監(jiān)聽變化,我選擇了郵箱來接收變化信息。這里,我們需要兩個(gè)郵箱,一個(gè)用來發(fā)送變化信息,一個(gè)用來接收變化信息。這里,我使用了163郵箱進(jìn)行了發(fā)送者。

開啟SMTP功能

首先登錄郵箱,設(shè)置--POP3/SMTP/IMAP開啟SMTP功能。

image.png

客戶端授權(quán)密碼

為了我們的賬戶安全,建議在郵箱中,開啟一個(gè)客戶端的授權(quán)密碼,來供我們發(fā)送郵件時(shí),登錄使用。操作如下圖:


image.png

Python代碼實(shí)現(xiàn)

上面的步驟完成,接下來就是代碼實(shí)現(xiàn)。

# 倒入相關(guān)庫
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr,formataddr
import smtplib

# encode方法
def format_addr(s):    
    name,addr = parseaddr(s)    
    return formataddr((Header(name,'utf-8').encode(),addr))

# 發(fā)送郵件方法
def send_email(title, subject, content):
    #發(fā)送者的郵箱地址
    from_addr = 'l**********@163.com'
    #授權(quán)密碼
    from_pwd = 's**********'
    #接受者郵箱地址
    to_addr = 'l************@qq.com'
    #smtp服務(wù)器地址
    smtp_server = 'smtp.163.com'

    #發(fā)送內(nèi)容設(shè)置
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['From'] = format_addr('<%s>'%from_addr)
    msg['To'] = format_addr('Re<%s>'%to_addr)
    msg['Subject'] = Header(subject, 'utf-8').encode()

    #發(fā)送郵件 服務(wù)器和端口配置
    smtp = smtplib.SMTP_SSL(smtp_server,465)
    #測試環(huán)境下,打印出交互信息
    smtp.set_debuglevel(1)
    #登錄賬戶
    smtp.login(from_addr, from_pwd)
    #發(fā)送郵件內(nèi)容
    #正文是一個(gè)str,as_string()把MIMEText對象變成str
    smtp.sendmail(from_addr,to_addr,msg.as_string())
    smtp.quit()

    print 'email send success!'
    return

接收郵箱查看

在接收郵箱查看下,看您發(fā)送的內(nèi)容是否成功接收到了呢?好了,今天的內(nèi)容就到這里了!

參考內(nèi)容:百度百科,百度知道等。

上面代碼為markdown下直接敲入的,有的可能沒有驗(yàn)證,可能出現(xiàn)關(guān)鍵字書寫錯(cuò)誤,如果直接拷貝出現(xiàn)錯(cuò)誤,歡迎留言,謝謝!??!??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容