大家好,我是早起。
之前有分享過如何用Python傳送郵件的文章,今天再分享一個如何用幾行Python程式碼讓財務部妹子追著喊666的實用案例。
需求描述最近公司要發獎金,需要財務部妹子給每個員工發一封郵件,現在全公司 10 個部門每個人的獎金情況已經計算好了,並根據部門分別製作了 10 張表格:
每個獎金錶格內容大致如下:
同時有一份 Excel 檔案郵件地址.xlsx,裡面有各部門負責人的郵箱:
首先第一個需求很簡單:給各部門負責人傳送相應部門的獎金附件
這個需求不同於群發,只要把所有人郵件地址加進來一鍵傳送就可以,而是需要點對點的單發郵件。如果部門或者收件人的數量繼續增加,無非會增加工作難度、降低工作效率,因此需要 Python 出手解決。
當然如果就這麼點小事,妹子辛苦一點手動傳送也能解決,下面還有一個需求
原有部門獎金錶格新增加了一列個人郵箱(郵箱地址均為虛構),如下
不同於上面需求,給部分負責人傳送總獎金錶格的同時,也需要給各部分每一個人傳送自己的獎金金額,傳送內容為:
“
”
這個需求如果再手動的話,工作量瞬間就上去了,下面我們講解如何用Python優雅、快速的解決!
邏輯梳理初級需求是一個點對點單獨傳送,簡單的思路可以是:
“
逐行遍歷 郵件地址.xlsx 取各部門名稱和負責人郵箱地址
根據部門名稱去 獎金髮放 資料夾下獲取 獎金_部門名稱.xlsx 作為附件
再遍歷 郵件地址.xlsx的迴圈體內完成郵件的傳送
”
如果加上了個人郵箱其實也很簡單,在原先程式碼的基礎上開啟並遍歷 獎金_部門名稱.xlsx 檔案,獲取每個人的工號、姓名、郵箱地址、獎金數,而部門在開啟 Excel 時就確定了,最後根據上面獲取的資訊用 yagmail 組裝成新的郵件資訊併發送
程式碼實現先著手實現基本需求。由於只涉及 Excel 檔案的讀取以及郵件的傳送,需要匯入 openpyxl 的 load_workbook 方法以及 yagmail 庫,如果不把密碼(授權碼)明文顯示而儲存在系統金鑰環中則需要額外匯入 keyring 庫
from openpyxl import load_workbookimport yagmailimport keyringpassword = keyring.get_password('yagmail', 'username')# 需要在命令號中用 keyring.set_password('yagmail', username, password) 預先存好
讀取並遍歷 郵件地址.xlsx:
path = r'C:\xxx' # 根據實際附件檔案和郵件地址 Excel 檔案存放的路徑確定workbook = load_workbook(path + r'\郵件地址.xlsx')sheet = workbook.activen = 0 # 設定變數跳過表頭for row in sheet.rows: if n: department = row[0].value dep_address = row[1].value print(department, dep_address) n += 1
解析完成後就可以組裝準備傳送的郵件了。以用 QQ 郵箱傳送郵件為例,複習一下組裝郵件需要的內容:
# 用伺服器、使用者名稱、密碼例項化郵件mail = yagmail.SMTP(user='[email protected]', password = password, host='smtp.qq.com') # 待發送的內容contents = ['第一段內容', '第二段內容']# 傳送郵件mail.send('收件人郵箱', '郵件標題', contents)
如果在 contents 中放絕對路徑,yagmail 會自動將其作為附件,非常智慧。這也是本需求能實現的重要依託。
複習了這些知識點我們就可以完善上面的遍歷程式碼
n = 0for row in sheet.rows: if n: department = row[0].value dep_address = row[1].value # print(department, dep_address) mail_dep = yagmail.SMTP(user='[email protected]', password=password, host='smtp.qq.com') contents = [f'您好,請查收{department}的獎金情況', path + f'\獎金髮放\獎金_{department}'] mail_dep.send(dep_address, f'{department}獎金情況', contents) n += 1
基本需求完成後,就考慮升級的需求
兩個需求銜接的關鍵在於確定好給哪個部門的負責人發郵件時,就開啟這個部門的獎金情況表,先給部門成員一一發文字郵件,最後給部門負責人發附件。
如果梳理清楚這一環,那麼迴圈的巢狀關係就很明確了:
n = 0for row in sheet.rows: if n: department = row[0].value dep_address = row[1].value # print(department, dep_address) mail_dep = yagmail.SMTP(user='[email protected]', password=password, host='smtp.qq.com') # 這一部分就是升級需求的程式碼 # 根據前面的部門資訊開啟相應的表格獲取每個人的情況 workbook_new = load_workbook(path + f'\獎金髮放\獎金_{department}') sheet_new = workbook_new.active m = 0 for i in sheet_new.rows: if m: id = i[0].value # 工號 name = i[1].value # 姓名 address = i[2].value # 個人郵箱地址 money = i[3].value # 獎金數 # 根據獲取到的個人資訊組裝成新的郵件傳送 mail = yagmail.SMTP(user='[email protected]', password=password, host='smtp.qq.com') contents = [f'尊敬的 {department} {name} 您好,您的工號是 {id},您2020年的獎金為 {money}'] mail.send(address, f'{department}-{name}獎金情況', contents) m += 1 contents_dep = [f'您好,請查收{department}的獎金情況', path + f'\獎金髮放\獎金_{department}'] mail_dep.send(dep_address, f'{department}獎金情況', contents_dep) n += 1
因本文的郵箱都是虛構的,就不展示具體傳送成功的效果了。
至此,短短30餘行程式碼就成功安撫了妹子交集的心態,並約個飯希望好好聊一聊如何用Python偷懶,這些就不再分享了