[Python] 自動(dòng)化辦公 批量分發(fā)郵件

轉(zhuǎn)載請(qǐng)注明:陳熹 chenx6542@foxmail.com (簡(jiǎn)書(shū)號(hào):半為花間酒)
若公眾號(hào)內(nèi)轉(zhuǎn)載請(qǐng)聯(lián)系公眾號(hào):早起Python

這篇文章能學(xué)到的主要內(nèi)容:

  1. openpyxl 讀取 Excel 文件
  2. yagmail 發(fā)送郵件

https://pan.baidu.com/s/1ZBw3UR5nrVrflQGGnY18Hw 提取碼 vmd1

需求描述

一、基本需求

你在公司的財(cái)務(wù)部工作,年底了已解決計(jì)算好全公司 10 個(gè)部門(mén)每個(gè)人的獎(jiǎng)金情況线得,并根據(jù)部門(mén)分別制作了 10 張表格:

每個(gè)獎(jiǎng)金表格內(nèi)容大致如下:

你手上同時(shí)有一份 Excel 文件 郵件地址.xlsx齐媒,里面有各部門(mén)負(fù)責(zé)人的郵箱:

要完成的需求很簡(jiǎn)單:給各部門(mén)負(fù)責(zé)人發(fā)送相應(yīng)部門(mén)的獎(jiǎng)金附件
這個(gè)需求不同于群發(fā)况木,只要把所有人郵件地址加進(jìn)來(lái)一鍵發(fā)送就可以奋隶,而是需要點(diǎn)對(duì)點(diǎn)的單發(fā)郵件饵骨。如果部門(mén)或者收件人的數(shù)量繼續(xù)增加,無(wú)非會(huì)增加工作難度啤贩、降低工作效率待秃,因此需要 Python 出手解決

二、升級(jí)需求

原有部門(mén)獎(jiǎng)金表格新增加了一列:個(gè)人郵箱

不同于初級(jí)需求痹屹,給部分負(fù)責(zé)人發(fā)送總獎(jiǎng)金表格的同時(shí)章郁,也需要給各部分每一個(gè)人發(fā)送自己的獎(jiǎng)金金額,發(fā)送內(nèi)容為:

尊敬的xxx部門(mén) xxx 您好痢掠,您的工號(hào)是 xxx驱犹,您2020年的獎(jiǎng)金為 xxx

(本文給出的郵箱地址均為虛構(gòu),因此不需要實(shí)際運(yùn)行代碼)

邏輯梳理

初級(jí)需求是一個(gè)點(diǎn)對(duì)點(diǎn)單獨(dú)發(fā)送足画,簡(jiǎn)單的思路可以是:

  1. 逐行遍歷 郵件地址.xlsx獲取各部門(mén)名稱(chēng)和負(fù)責(zé)人郵箱地址
  2. 根據(jù)部門(mén)名稱(chēng)去 獎(jiǎng)金發(fā)放 文件夾下獲取 獎(jiǎng)金_部門(mén)名稱(chēng).xlsx 作為附件
  3. 在遍歷 郵件地址.xlsx的循環(huán)體內(nèi)完成郵件的發(fā)送

如果加上了個(gè)人郵箱其實(shí)也很簡(jiǎn)單雄驹,在原先代碼的基礎(chǔ)上打開(kāi)并遍歷 獎(jiǎng)金_部門(mén)名稱(chēng).xlsx 文件,獲取每個(gè)人的工號(hào)淹辞、姓名医舆、郵箱地址、獎(jiǎng)金數(shù)象缀,而部門(mén)在打開(kāi) Excel 時(shí)就確定了蔬将,最后根據(jù)上面獲取的信息用 yagmail 組裝成新的郵件信息并發(fā)送

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

先著手實(shí)現(xiàn)基本需求。由于只涉及 Excel 文件的讀取以及郵件的發(fā)送央星,需要導(dǎo)入 openpyxlload_workbook 方法以及 yagmail 庫(kù)霞怀,如果不把密碼(授權(quán)碼)明文顯示而存儲(chǔ)在系統(tǒng)密鑰環(huán)中則需要額外導(dǎo)入 keyring 庫(kù)

from openpyxl import load_workbook
import yagmail
import keyring

password = keyring.get_password('yagmail', 'username')
# 需要在命令號(hào)中用 keyring.set_password('yagmail', username, password) 預(yù)先存好

讀取并遍歷 郵件地址.xlsx

path = r'C:\xxx' # 根據(jù)實(shí)際附件文件和郵件地址 Excel 文件存放的路徑確定
workbook = load_workbook(path + r'\郵件地址.xlsx')
sheet = workbook.active

n = 0 # 設(shè)置變量跳過(guò)表頭
for row in sheet.rows:
    if n:
        department = row[0].value
        dep_address = row[1].value
        print(department, dep_address)
    n += 1

解析完成后就可以組裝準(zhǔn)備發(fā)送的郵件了。以用 QQ 郵箱發(fā)送郵件為例莉给,復(fù)習(xí)一下組裝郵件需要的內(nèi)容:

# 用服務(wù)器毙石、用戶名、密碼實(shí)例化郵件
mail = yagmail.SMTP(user='xxx@qq.com', password = password, host='smtp.qq.com') 
# 待發(fā)送的內(nèi)容
contents = ['第一段內(nèi)容', '第二段內(nèi)容']
# 發(fā)送郵件
mail.send('收件人郵箱', '郵件標(biāo)題', contents) 

如果在 contents 中放絕對(duì)路徑颓遏,yagmail 會(huì)自動(dòng)將其作為附件徐矩,非常智能。這也是本需求能實(shí)現(xiàn)的重要依托叁幢。復(fù)習(xí)了這些知識(shí)點(diǎn)我們就可以完善上面的遍歷代碼:

n = 0
for 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'您好滤灯,請(qǐng)查收{(diào)department}的獎(jiǎng)金情況', path + f'\獎(jiǎng)金發(fā)放\獎(jiǎng)金_{department}']
        mail_dep.send(dep_address, f'{department}獎(jiǎng)金情況', contents)
    n += 1

基本需求完成后,就考慮升級(jí)的需求
兩個(gè)需求銜接的關(guān)鍵在于確定好給哪個(gè)部門(mén)的負(fù)責(zé)人發(fā)郵件時(shí)曼玩,就打開(kāi)這個(gè)部門(mén)的獎(jiǎng)金情況表鳞骤,先給部門(mén)成員一一發(fā)文字郵件,最后給部門(mén)負(fù)責(zé)人發(fā)附件演训。如果梳理清楚這一環(huán)弟孟,那么循環(huán)的嵌套關(guān)系就很明確了:

n = 0
for 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')

        # 這一部分就是升級(jí)需求的代碼
        # 根據(jù)前面的部門(mén)信息打開(kāi)相應(yīng)的表格獲取每個(gè)人的情況
        workbook_new = load_workbook(path + f'\獎(jiǎng)金發(fā)放\獎(jiǎng)金_{department}')
        sheet_new = workbook_new.active
        m = 0
        for i in sheet_new.rows:
            if m:
                id = i[0].value # 工號(hào)
                name = i[1].value # 姓名
                address = i[2].value # 個(gè)人郵箱地址
                money = i[3].value # 獎(jiǎng)金數(shù)
                # 根據(jù)獲取到的個(gè)人信息組裝成新的郵件發(fā)送
                mail = yagmail.SMTP(user='xxx@qq.com', password=password, host='smtp.qq.com')
                contents = [f'尊敬的 {department} {name} 您好,您的工號(hào)是 {id}样悟,您2020年的獎(jiǎng)金為 {money}']
                mail.send(address, f'{department}-{name}獎(jiǎng)金情況', contents)                
            m += 1

        contents_dep = [f'您好,請(qǐng)查收{(diào)department}的獎(jiǎng)金情況', path + f'\獎(jiǎng)金發(fā)放\獎(jiǎng)金_{department}']
        mail_dep.send(dep_address, f'{department}獎(jiǎng)金情況', contents_dep)
    n += 1

至此,基本需求和升級(jí)需求就都成功用 Python 完成了窟她!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陈症,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子震糖,更是在濱河造成了極大的恐慌录肯,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吊说,死亡現(xiàn)場(chǎng)離奇詭異论咏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颁井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)厅贪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人雅宾,你說(shuō)我怎么就攤上這事养涮。” “怎么了眉抬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贯吓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蜀变,道長(zhǎng)悄谐,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任库北,我火速辦了婚禮爬舰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贤惯。我一直安慰自己洼专,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布孵构。 她就那樣靜靜地躺著屁商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颈墅。 梳的紋絲不亂的頭發(fā)上蜡镶,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音恤筛,去河邊找鬼官还。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毒坛,可吹牛的內(nèi)容都是我干的望伦。 我是一名探鬼主播林说,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屯伞!你這毒婦竟也來(lái)了腿箩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤劣摇,失蹤者是張志新(化名)和其女友劉穎珠移,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體末融,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧惧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勾习。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浓瞪。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖语卤,靈堂內(nèi)的尸體忽然破棺而出追逮,到底是詐尸還是另有隱情,我是刑警寧澤粹舵,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布钮孵,位于F島的核電站,受9級(jí)特大地震影響眼滤,放射性物質(zhì)發(fā)生泄漏巴席。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一诅需、第九天 我趴在偏房一處隱蔽的房頂上張望漾唉。 院中可真熱鬧,春花似錦堰塌、人聲如沸赵刑。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)般此。三九已至,卻和暖如春牵现,著一層夾襖步出監(jiān)牢的瞬間铐懊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工瞎疼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留科乎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓贼急,卻偏偏與公主長(zhǎng)得像茅茂,于是被迫代替她去往敵國(guó)和親捏萍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345