情景(Situation)
上文說到小愛面臨著要給總部集團的李總每天早上固定發送日報郵件,而且他也找到自動化的方式了,那究竟是什么呢?其實在講方法之前,其實我們也可以先簡單學一下郵件的發送原理,理解了這個原理是更有助于我們理解我們的程序的。
任務(Task)
首先,我們發郵件是一定要有郵箱的,郵箱可以理解為是郵件服務器上的一個賬戶,我們通過這個賬戶可以給其它郵件服務器上的賬戶發送郵件。但是呢,郵件的發送是需要遵守一定協議的,也就是SMTP(Simple Mail Transfer Protocol)協議,即簡單郵件傳輸協議。通過這個協議我們就可以把我們的郵件發到其它賬戶了。
發郵件的原理是不是是不是很簡單呢?小愛查詢得知,Python中的smtplib庫提供了一種很方便的途徑發送電子郵件,它對smtp協議進行了簡單的封裝;email庫提供了編輯郵件的功能,于是小愛就準備用它們來發郵件了。
行動(Action)
- 郵箱賬號密碼
我們回想下,發郵件是不是需要發件人郵件和密碼、收件人地址呢,那我們先準備好這些數據。關于密碼需要說明的是,它并不是登錄密碼,而是郵箱的授權碼。
sender="****@163.com" #發件人郵箱地址
pw="*****" #郵箱授權碼,在郵件設置中獲取
to=["****@qq.com"] #收件人郵箱地址,有多人的話就是列表
2、郵件標題
小愛準備將標題定位“部門日報+前一天日期”的格式。
import datetime
yesterday=(datetime.date.today() + datetime.timedelta(days = -1)).strftime("%Y-%m-%d")
title='部門日報'+yesterday
3、郵件附件
日報肯定是要放在附件里的。
filename=title+'.docx'
4、郵件正文
接下來就是要構建郵件正文了
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
msg=MIMEMultipart() #構建帶附件的郵件需要用這個實例
msg["From"] = Header(sender)
msg["To"] = Header(",".join(to))
msg["Subject"] = Header(title)
msg.attach(MIMEText("領導請查收!","plain","utf-8")) #郵件正文,plain是純文本的意思
att1 = MIMEText(open(filename, "rb").read(),"base64","utf-8")
#將filename作為附件上傳
att1.add_header('Content-Disposition',"attachment",filename=att_title)
#filename是附件的顯示名字,可以自由定義
msg.attach(att1)
5、發送郵件
接下來就是發送郵件了。
import smtplib as SMTP
server = SMTP.SMTP()
server.connect("smtp.163.com",25)
server.login(sender,pw)
server.sendmail(sender,to,msg.as_string())
server.quit()
print ("a")
結果(Result)
把上面的程序執行一遍就會在目的地郵箱收到如下郵件,是不是很簡單呢,你成功了嗎?反正小愛是成功了,小愛最后把兩個腳本文件合成了一個文件,每天定時運行就可以完全解決制作日報并發送郵件的任務了。從此,小愛再也不用擔心因為路上堵車而無法準時制作日報發送郵件了!