前面寫(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è)試郵箱收到郵件。

之前為了測(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í)郵件 獲取源碼。