首頁>科技>

大家好,我是早起。

之前有分享過如何用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偷懶,這些就不再分享了

4
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 氫能火爆 但加氫站卻全部虧損 這是何故