這樣發(fā)周報(bào),升職加薪不是夢(mèng)...

前面寫(xiě)了篇文章,介紹了怎么使用定時(shí)任務(wù)發(fā)送周報(bào),有些朋友想要知道后續(xù)操作,既然朋友有需求,那么必須滿足呀,這篇文章就介紹怎么使用定時(shí)任務(wù)加上python定時(shí)發(fā)送文件給同事。

一、用python發(fā)送郵件

先上代碼

class MailSender:
    ...


def check_latest_file(p, today):
    counter = 0
    for file in p.glob('*.csv'):
        if today in file.name:
            counter += 1
    return counter


def main(date=''):
    user = os.environ.get('EMAIL_NAME') 
    pwd = os.environ.get('EMAIL_PWD')
    to_addr = 'email@email.com'
    smtpSvr = 'smtp.exmail.qq.com' #這里用的是騰訊的郵箱所以是這個(gè),其它郵箱請(qǐng)按相關(guān)郵箱設(shè)置
    content = '請(qǐng)查看附件'

    if date == '':
        today = datetime.now().strftime('%Y-%m-%d')
    else:
        today = date

    if os.name == 'nt':
        p = Path(r"E:\銷售情況")
    else:
        p = Path("/home/steven/sales_collect")

    subject = today + '銷售情況'
    m = MailSender(smtpSvr, 25)
    m.login(user, pwd)
    for file in p.glob('*.csv'):
        if today in file.name:
            m.add_attachment(file)

    m.send(subject, content, to_addr)
    m.close()


if __name__ == '__main__':
    if len(sys.argv) > 1:
        main(sys.argv[1])
    else:
        main()

內(nèi)容其實(shí)不復(fù)雜,主要用到了smtplib作為發(fā)送郵件的庫(kù),email庫(kù)用來(lái)構(gòu)建郵件, 定義了一個(gè)MailSender類,方法實(shí)現(xiàn)了郵件的創(chuàng)建和附件的添加,還有最后的發(fā)送。

 user = os.environ.get('EMAIL_NAME')
 pwd = os.environ.get('EMAIL_PWD')

這里為什么要這樣寫(xiě),因?yàn)槲业拇a是托管在github上的,但是測(cè)試時(shí)又要用到這些比較敏感的內(nèi)容,比如密碼,所以比較安全的方式就是把敏感信息放到系統(tǒng)環(huán)境變量中,這樣push的時(shí)候就不用擔(dān)心又有什么不該公開(kāi)的信息放上去了。不過(guò)也就是因?yàn)檫@里的設(shè)置,后面在ubuntu中出現(xiàn)一個(gè)坑,在win里面很正常,但是在ubuntu中卻是不太好弄,這個(gè)后面再講。

 if os.name == 'nt':
        p = Path(r"E:\銷售情況")
    else:
        p = Path("/home/steven/sales_collect")

這一段代碼是為了實(shí)現(xiàn),linux和window的兼容,由于我是在win下寫(xiě)的代碼和測(cè)試的,但是使用的時(shí)候是要放在服務(wù)器的,所以這里做了個(gè)判斷。如果是win系統(tǒng)就把文件存到E盤(pán)下面的文件夾,如果是linux就存到/home/steven/sales_collect下面。

    if date == '':
        today = datetime.now().strftime('%Y-%m-%d')
    else:
        today = date

這里是為了能按需求取要發(fā)送的文件,如果沒(méi)有傳入日期就按最新的日期來(lái)取文件,也就是今天,如果有日期,就按照傳入的日期取文件,注意我的文件都是按照日期加文件名的方式命名的,所以很方便的按照日期選取。

二、 sh腳本配置

python腳本寫(xiě)好后經(jīng)過(guò)測(cè)試,能夠正常運(yùn)行。是時(shí)候?qū)憇h腳本了。

#!/usr/bin/env bash
cd /home/steven/sales_collect
/usr/bin/python3.6 send_mail.py

寫(xiě)好bash腳本,更改文件權(quán)限chmod 700 send_mail.sh后可以直接運(yùn)行。可是后面加入定時(shí)任務(wù)后,卻總是取不到系統(tǒng)環(huán)境變量。這個(gè)就是前面所說(shuō)的在ubuntu中的坑。幾經(jīng)周折,經(jīng)Q群朋友 @不再留戀 提醒,做了以下修改:

#!/bin/bash
cd /home/steven/sales_collect/ && /usr/bin/python3.6 send_mail.py

經(jīng)過(guò)測(cè)試,終于沒(méi)有問(wèn)題了。修改了幾個(gè)地方,#! 后面我之前的內(nèi)容是參考python寫(xiě)的,有可能是錯(cuò)的。還有 cd 進(jìn)入與后面的執(zhí)行操作最好用 && 連接一起使用。

三、 定時(shí)任務(wù)設(shè)置

crontab -e #進(jìn)入編輯模式
# 添加內(nèi)容
00 20 * * * /home/steven/send_email.sh # 最開(kāi)始的設(shè)置
00 20 * * * /bin/bash /home/steven/send_email.sh # 經(jīng)朋友提醒后修改

這里可能是和上面的sh腳本的#!問(wèn)題一起的,按照最開(kāi)始的設(shè)置,python腳本始終沒(méi)有取到系統(tǒng)環(huán)境變量,加上/bin/bash后,python腳本正常取到系統(tǒng)環(huán)境變量,測(cè)試郵箱收到郵件。

郵件發(fā)送情況

之前為了測(cè)試的時(shí)候,設(shè)置的每過(guò)2分鐘發(fā)送一次。至此任務(wù)終于完成,后面有時(shí)間再研究下,到底是#!寫(xiě)錯(cuò)的原因還是定時(shí)任務(wù)時(shí)應(yīng)該加上/bin/bash

后記

其實(shí),經(jīng)過(guò)驗(yàn)證,最后成功。在編程里一點(diǎn)也不奇怪,總是不斷調(diào)整思路,最后解決問(wèn)題。做為一個(gè)coder,可能最大的能力就是解決問(wèn)題的能力了。最后,大家如果需要源碼,請(qǐng)關(guān)注我的公眾號(hào)回復(fù)關(guān)鍵詞 定時(shí)郵件 獲取源碼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容