您現在的位置是:首頁 > 綜合

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

  • 由 CDA資料分析師 發表于 綜合
  • 2022-12-20
簡介xlsx 檔案,獲取每個人的工號、姓名、郵箱地址、獎金數,而部門在開啟 Excel 時就確定了,最後根據上面獲取的資訊用 yagmail 組裝成新的郵件資訊併發送程式碼實現先著手實現基本需求

財務python能幹什麼

作者:陳熹、劉早起

大家好,我是早起。

之前有分享過如何

用Python傳送郵件

的文章,今天再分享一個如何用幾行Python程式碼讓財務部妹子追著喊666的實用案例。

需求描述

最近公司要發獎金,需要財務部妹子給每個員工發一封郵件,現在全公司 10 個部門每個人的獎金情況已經計算好了,並根據部門分別製作了 10 張表格:

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

每個獎金錶格內容大致如下:

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

同時有一份 Excel 檔案郵件地址。xlsx,裡面有各部門負責人的郵箱:

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

首先第一個需求很簡單:

給各部門負責人傳送相應部門的獎金附件

這個需求不同於群發,只要把所有人郵件地址加進來一鍵傳送就可以,而是需要點對點的單發郵件

。如果部門或者收件人的數量繼續增加,無非會增加工作難度、降低工作效率,因此需要 Python 出手解決。

當然如果就這麼點小事,妹子辛苦一點手動傳送也能解決,下面還有一個需求

原有部門獎金錶格新

增加了一列個人郵箱

(郵箱地址均為虛構),如下

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

不同於上面需求,

給部分負責人傳送總獎金錶格的同時,也需要給各部分每一個人傳送自己的獎金金額

,傳送內容為:

尊敬的xxx部門 xxx 您好,您的工號是 xxx,您2020年的獎金為 xxx

這個需求如果再手動的話,工作量瞬間就上去了,下面我們講解

如何用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

看我用Python一秒發數百份郵件,讓財務部妹子追著喊666

解析完成後就可以組裝準備傳送的郵件了。以用 QQ 郵箱傳送郵件為例,複習一下組裝郵件需要的內容:

# 用伺服器、使用者名稱、密碼例項化郵件mail = yagmail。SMTP(user=‘xxx@qq。com’, 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=‘xxx@qq。com’, 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=‘xxx@qq。com’, password=password, host=‘smtp。qq。com’) # 這一部分就是升級需求的程式碼# 根據前面的部門資訊開啟相應的表格獲取每個人的情況 workbook_new = load_workbook(path + f‘\獎金髮放\獎金_{department}’) sheet_new = workbook_new。active m = 0for 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=‘xxx@qq。com’, 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偷懶,這些就不再分享了。

Top