背景
前段時間寫了個自動爬蟲的腳本股缸,定時在阿里云服務(wù)器上執(zhí)行,會從某個網(wǎng)站上爬取鏈接保存到txt文本中吱雏,但是腳本不夠完善敦姻,我需要爬蟲完畢之后通過郵件把附件給我發(fā)送過來,之前寫過一個《利用Python+163郵箱授權(quán)碼發(fā)送郵件》的博客歧杏,但是那篇文章是沒有帶附件的镰惦,因此,我想到了爬蟲完畢之后得滤,再執(zhí)行一段發(fā)送郵件的代碼陨献,把爬蟲保存的TXT文件通過郵件發(fā)送到我的郵箱中,需求開始明確了懂更,就開始分析和寫代碼實現(xiàn)吧眨业。
分析
SMTP(Simple Mail Transfer Protocol)急膀,即簡單郵件傳輸協(xié)議,它是一組用于由源地址到目的地址傳送郵件的規(guī)則龄捡,由它來控制信件的中轉(zhuǎn)方式卓嫂。
python的smtplib提供了一種很方便的途徑發(fā)送電子郵件。它對smtp協(xié)議進(jìn)行了簡單的封裝聘殖。
看到阿里云服務(wù)上的定時任務(wù)如下:
爬蟲執(zhí)行完畢獲取到TXT文件命名如下晨雳,前面xfurlwett-是固定的,后面是日期奸腺,".txt"是固定的后綴
在python中用以下兩行代碼格式化時間餐禁,格式化之后把它轉(zhuǎn)為字符串賦給一個變量caodate
ISOTIMEFORMAT='%Y%m%d'
caodate=str(time.strftime(ISOTIMEFORMAT, time.localtime()))
文件名如下,可在字符串xfurlwett前面加上絕對路徑的文件名
filename='xfurlwett-'+caodate+'.txt'
發(fā)送帶附件的郵件,首先要創(chuàng)建MIMEMultipart()實例突照,然后構(gòu)造附件帮非,如果有多個附件,可依次構(gòu)造讹蘑,最后利用smtplib.smtp發(fā)送末盔。
message = MIMEMultipart()
message['subject'] = caodate+'下載附件通知'
# 設(shè)置郵件標(biāo)題
message['from'] = sender
# 設(shè)置發(fā)送人
message['to'] = receiver0
# 設(shè)置接收人
message.attach(msg)
filename='xfurlwett-'+caodate+'.txt'
# 構(gòu)造附件1,傳送當(dāng)前目錄下的 filename 文件
att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這里的filename可以任意寫座慰,寫什么名字陨舱,郵件中顯示什么名字
att1["Content-Disposition"] = 'attachment; filename="'+filename+'"'
message.attach(att1)
代碼實現(xiàn)
import time
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
ISOTIMEFORMAT='%Y%m%d'
def sentemail():
caodate=str(time.strftime(ISOTIMEFORMAT, time.localtime()))
host = 'smtp.163.com'
# 設(shè)置發(fā)件服務(wù)器地址
port = 465
# 設(shè)置發(fā)件服務(wù)器端口號。注意版仔,這里有SSL和非SSL兩種形式
sender = 'a419914150@163.com'
# 設(shè)置發(fā)件郵箱游盲,一定要自己注冊的郵箱
pwd = 'ifujfnjdfnhkgnjfd'
# 設(shè)置發(fā)件郵箱的密碼,163郵箱的授權(quán)碼蛮粮,等會登陸會用到
receiver0 = '419914150@qq.com'
# 設(shè)置郵件接收人背桐,可以是扣扣郵箱
receiver1 = '1879230382@qq.com'
body = '<h1>'+caodate+'</h1><p>zhongfs</p>'
# 設(shè)置郵件正文,這里是支持HTML的
msg = MIMEText(body, 'html')
# 設(shè)置正文為符合郵件格式的HTML內(nèi)容
message = MIMEMultipart()
message['subject'] = caodate+'下載附件通知'
# 設(shè)置郵件標(biāo)題
message['from'] = sender
# 設(shè)置發(fā)送人
message['to'] = receiver0
# 設(shè)置接收人
message.attach(msg)
filename='xfurlwett-'+caodate+'.txt'
# 構(gòu)造附件1蝉揍,傳送當(dāng)前目錄下的 filename 文件
att1 = MIMEText(open(filename, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這里的filename可以任意寫链峭,寫什么名字,郵件中顯示什么名字
att1["Content-Disposition"] = 'attachment; filename="'+filename+'"'
message.attach(att1)
try:
s = smtplib.SMTP_SSL(host, port) # 注意又沾!如果是使用SSL端口弊仪,這里就要改為SMTP_SSL
s.login(sender, pwd) # 登陸郵箱
s.sendmail(sender, receiver0, message.as_string())# 發(fā)送郵件!
#s.sendmail(sender, receiver1, msg.as_string())
print ('Done.sent email success')
except smtplib.SMTPException:
print ('Error.sent email fail')
if __name__ == '__main__':
sentemail()
執(zhí)行情況
程序運行截圖:
收到郵件截圖:
總結(jié)
本文簡單介紹了如何利用python通過163郵箱發(fā)送帶附件的郵件杖刷,并附上了代碼励饵。由于比較簡單,不再過多闡述滑燃。已上傳github代碼役听,鏈接如下:
https://github.com/rootzhongfengshan/python_practical/blob/master/SentMail/SentMailWithAttachment.py