天天熱點(diǎn)評(píng)!【編程實(shí)踐】提高工作效率,避免重復(fù)且枯燥的操作,利用Python自動(dòng)發(fā)送郵件

2022-12-27 11:14:36 來(lái)源:51CTO博客

前言

在實(shí)際的工作中,當(dāng)我們需要向部門或者公司同事發(fā)送一封郵件時(shí),總需要抄送多份,雖然現(xiàn)在發(fā)送郵件可以選中多個(gè)收件人或者多個(gè)可以把同事全部拉進(jìn)一個(gè)QQ群發(fā)送群郵件的方式去解決同時(shí)向多人發(fā)送郵件,但是拉進(jìn)一個(gè)群對(duì)于公司同事可能容易實(shí)現(xiàn),但是需要向多個(gè)客戶發(fā)送通知郵件,把所有客戶拉近一個(gè)群不符合現(xiàn)實(shí),且不容易操作,如果使用抄送的方式,好友太多,選擇起來(lái)也是需要大量且耗時(shí)的操作,太廢手了,所以這時(shí)候如果你把所有收件人全部整理出來(lái),這樣以后每次發(fā)送郵件就可以通過程序去自動(dòng)發(fā)送郵件,減少無(wú)聊操作,提高工作效率。而且名單只需整理一次,一勞永逸。特別是向客戶發(fā)邀請(qǐng)函的時(shí)候,需要在郵件中寫上被邀請(qǐng)人的信息,以表公司的誠(chéng)意。這時(shí)候幾乎每封郵件都需要定制。使用抄送的方式也不合適,這時(shí)候可以使用Python來(lái)設(shè)置郵件內(nèi)容,這時(shí)候程序就可以從名單文件中獲取到定制部分的信息,達(dá)到?jīng)]封郵件都是定制的樣子,因?yàn)檠?qǐng)函大部分內(nèi)容格式都是一樣的,只是公司和邀請(qǐng)人和名字不一樣,所以使用程序來(lái)處理,是個(gè)不錯(cuò)的選擇。

除了我們上面提到的場(chǎng)景,在我們運(yùn)維系統(tǒng)或者網(wǎng)站服務(wù)系統(tǒng)中,都會(huì)使用到郵件的自動(dòng)發(fā)送功能,在運(yùn)維系統(tǒng)中我們會(huì)實(shí)現(xiàn)告警功能,通過郵件和短信多種方式通知系統(tǒng)告警信息。在電商網(wǎng)站上,我們會(huì)通過郵件信息通知用戶每月賬單,或者訂單信息。

SMTP簡(jiǎn)介

在20世紀(jì)80年代早期SMTP開始被廣泛地使用。當(dāng)時(shí)它只是作為UUCP的補(bǔ)充,UUCP更適合于處理在間歇連接的機(jī)器間傳送郵件。相反SMTP在發(fā)送和接收的機(jī)器始終都聯(lián)網(wǎng)的情況下工作得最好。


(資料圖片僅供參考)

SMTP(Simple Mail Transfer Protocol)即簡(jiǎn)單郵件傳輸協(xié)議,是一種提供可靠且有效電子郵件傳輸?shù)膮f(xié)議。SMTP是建立在FTP文件傳輸服務(wù)上的一種郵件服務(wù),主要用于傳輸系統(tǒng)之間的郵件信息并提供與來(lái)信有關(guān)的通知。

它是一組用于由源地址到目的地址傳送郵件的規(guī)則,由它來(lái)控制信件的中轉(zhuǎn)方式。SMTP協(xié)議屬于TCP/IP協(xié)議簇,它幫助每臺(tái)計(jì)算機(jī)在發(fā)送或中轉(zhuǎn)信件時(shí)找到下一個(gè)目的地。通過SMTP協(xié)議所指定的服務(wù)器,就可以把E-mail寄到收信人的服務(wù)器上了,整個(gè)過程只要幾分鐘。SMTP服務(wù)器則是遵循SMTP協(xié)議的發(fā)送郵件服務(wù)器,用來(lái)發(fā)送或中轉(zhuǎn)發(fā)出的電子郵件。SMTP是一種TCP協(xié)議支持的提供可靠且有效電子郵件傳輸?shù)膽?yīng)用層協(xié)議。

SMTP目前已是事實(shí)上的在Internet傳輸E-Mail的標(biāo)準(zhǔn),是一個(gè)相對(duì)簡(jiǎn)單的基于文本的協(xié)議。在其之上指定了一條消息的一個(gè)或多個(gè)接收者(在大多數(shù)情況下被確定是存在的),然后消息文本就傳輸了。可以很簡(jiǎn)單地通過Telnet程序來(lái)測(cè)試一個(gè)SMTP服務(wù)器,SMTP使用TCP端口25。要為一個(gè)給定的域名決定一個(gè)SMTP服務(wù)器,需要使用MX(Mail eXchange)DNS。

SMTP交互過程:

首先,客戶端需要建立一個(gè)與SMTP服務(wù)器的TCP連接,端口為25建立連接后,客戶端和服務(wù)器先執(zhí)行一些應(yīng)用層握手操作,讓SMTP服務(wù)器知道客戶端的信息,并且對(duì)客戶端請(qǐng)求作出響應(yīng)等

在STMP握手階段,客戶端向SMTP服務(wù)器分別指定發(fā)信人,和收信人的電子郵件地址。握手階段完畢,SMTP服務(wù)器把客戶端發(fā)出的郵件消息添加到發(fā)信隊(duì)列中,通過TCP提供的可靠數(shù)據(jù)傳輸服務(wù)把該消息無(wú)錯(cuò)地傳送到服務(wù)器。如果客戶還有其他郵件消息需要發(fā)送到同一個(gè)服務(wù)器,就在同一個(gè)TCP連接重復(fù)上述操作;否則,指示TCP關(guān)閉該連接。

具體發(fā)送和連接過程:

建立TCP連接客戶端發(fā)送HELO命令以標(biāo)識(shí)發(fā)件人自己的身份,客戶端發(fā)送MAIL命令。服務(wù)器以O(shè)K作為響應(yīng),表明準(zhǔn)備接收使用AUTH命令登錄SMTP服務(wù)器,輸入用戶名和密碼(用戶名和密碼都需要使用Base64加密)客戶端發(fā)送RCPT命令,標(biāo)識(shí)該電子郵件的計(jì)劃接收人,可以有多個(gè)RCPT行;服務(wù)器以O(shè)K作為響應(yīng),表示愿意為收件人發(fā)送郵件協(xié)商結(jié)束后,使用DATA命令發(fā)送以"."號(hào)結(jié)束,輸入內(nèi)容一起發(fā)送出去,結(jié)束此次發(fā)送,用QUIT命令退出

本文主要是利用Python結(jié)合SMTP實(shí)現(xiàn)郵件的發(fā)送,關(guān)于SMTP的相關(guān)內(nèi)容這里就不再一一贅述,以后有機(jī)會(huì)可以單獨(dú)嘮嘮

編程實(shí)踐

使用Python發(fā)送有件

Python支持SMTP,可以發(fā)送純文本郵件,HTML郵件和附帶附件的郵件

發(fā)送郵件前需要對(duì)郵箱進(jìn)行一些設(shè)置:

首先需要查看發(fā)件人是否開啟了SMTP的協(xié)議,如果沒有開啟則需要開啟,本文使用的是QQ郵箱的SMTP服務(wù)登錄QQ郵箱,單擊"設(shè)置"鏈接,然后單擊"賬戶"tab選項(xiàng),如下圖所示:然后往下滾動(dòng)頁(yè)面,找到如下圖的服務(wù)開啟項(xiàng),開啟POP3/SMTP服務(wù),會(huì)彈出一個(gè)授權(quán)碼的窗口,如果沒有彈出或者忘記了授權(quán)碼,可以接著點(diǎn)擊"生成授權(quán)碼"按鈕生成授權(quán)碼

注:授權(quán)碼是QQ郵箱推出的用于第三方客戶端登錄,為了賬戶安全,更改QQ密碼及獨(dú)立密碼會(huì)導(dǎo)致授權(quán)碼過期,需要重新獲取新的授權(quán)碼登錄,一個(gè)賬號(hào)可以有多個(gè)授權(quán)碼,可以不用特意記住,但需要每次獲取

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

開啟SMTP協(xié)議,獲得授權(quán)碼引入smtplib模塊定義相關(guān)函數(shù),執(zhí)行代碼發(fā)送郵件

導(dǎo)入相關(guān)模塊:

import smtplibfrom email.mime.text import MIMETextfrom email.utils import formataddr

配置郵箱賬戶相關(guān)信息:發(fā)件人郵箱賬號(hào),密碼,郵箱的pop3授權(quán)碼,收件人賬號(hào).收件人可以是自己

my_sender = "1234567890@qq.com"  # 發(fā)件人郵箱賬號(hào)my_pass = "qwertyuiopeasdfgh"  # 發(fā)件人郵箱pop3授權(quán)碼receiver = "987654321@qq.com"  # 收件人郵箱賬號(hào)

使用smtplib發(fā)送郵件

def mail():    ret = True    try:        msg = MIMEText("你好,這是一封邀請(qǐng)函", "plain", "utf-8")        msg["From"] = formataddr(["迷彩", my_sender])  # 發(fā)件人郵箱昵稱、郵箱賬號(hào)        msg["To"] = formataddr(["迷彩", receiver])  # 收件人郵箱昵稱、郵箱賬號(hào)        msg["Subject"] = "邀請(qǐng)函"  # 郵件的主題,也可以說(shuō)是標(biāo)題        server = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 發(fā)件人郵箱中的SMTP服務(wù)器,端口是25        server.login(my_sender, my_pass)  # 發(fā)件人郵箱賬號(hào)、郵箱密碼        server.sendmail(my_sender, [receiver, ], msg.as_string())  # 發(fā)件人郵箱賬號(hào)、收件人郵箱賬號(hào)、發(fā)送內(nèi)容        server.quit()  # 關(guān)閉連接    except Exception:  # 異常處理:如果 try 中的語(yǔ)句沒有執(zhí)行,則會(huì)執(zhí)行下面的 ret=False        ret = False    return ret

執(zhí)行代碼,發(fā)送郵件:

sendMail = mail()if sendMail:    print("郵件發(fā)送成功")else:    print("郵件發(fā)送失敗")

執(zhí)行結(jié)果如下:

標(biāo)簽: 發(fā)送郵件 電子郵件 郵件發(fā)送

上一篇:JavaScript操作BOM對(duì)象
下一篇:環(huán)球今頭條!為什么自建 UI 框架?