python實(shí)現(xiàn)自動(dòng)發(fā)送郵件發(fā)送多人、群發(fā)、多附件的示例
1、最近公司實(shí)現(xiàn)部分?jǐn)?shù)據(jù)統(tǒng)計(jì)、分析的報(bào)表進(jìn)行每天定時(shí)發(fā)送到相關(guān)人員的郵箱之中的配置代碼被人為刪除了,需要重新恢復(fù)該功能,由于原先是在linux上使用shell配置發(fā)送,實(shí)在是太繁瑣,所以準(zhǔn)備使用python來(lái)實(shí)現(xiàn)該功能,不過(guò)發(fā)現(xiàn)網(wǎng)上各種文檔都是未經(jīng)過(guò)整理,代碼寫的很不友善,比如發(fā)送多人的只能發(fā)送前一個(gè)郵箱,附件寫死不靈活等等,故特寫一遍比較記錄。
主要會(huì)遇到的幾個(gè)問(wèn)題:
1、smtplib.SMTPAuthenticationError: (550, b'User has no permission')
2、smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')
這兩個(gè)錯(cuò)誤是你的密碼用的不是授權(quán)碼導(dǎo)致,授權(quán)碼生成自行百度。
3、554 DT:SPM 163 smtp5
這屬于網(wǎng)易郵箱的一個(gè)退回檢測(cè)機(jī)制導(dǎo)致,貌似跟發(fā)送比較頻繁有關(guān),我再發(fā)送的時(shí)候有遇到過(guò),直到添加了一個(gè)網(wǎng)易郵箱作為收件箱之后才能發(fā)送成功,不知道是不是這個(gè)原因?qū)е?,具體原因未知,如果有人知道請(qǐng)?jiān)谒叫呕蛘咴u(píng)論下告知,謝謝??!
前期準(zhǔn)備查看系統(tǒng)上python版本號(hào):
顯示如圖表示已經(jīng)安裝好了。
2、實(shí)現(xiàn)代碼如下(這是在Windows上的IDEL下編輯測(cè)試代碼,linux上只有改下附件路徑就好了)
# -*- coding: utf-8 -*- from email import encoders import os import traceback from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr, formataddr import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders # 中文處理 def _format_addr(s): name, addr = parseaddr(s) return formataddr((Header(name, 'utf-8').encode(), addr)) def send_email(to_addr_in,filepath_in): # 郵件發(fā)送和接收人配置 from_addr = '*******@163.com' smtp_server = 'smtp.163.com' password = '********' #這是你郵箱的第三方授權(quán)客戶端密碼,并非你的登錄密碼 to_addr = to_addr_in to_addrs = to_addr.split(',') msg = MIMEMultipart() msg['From'] = _format_addr('Python愛(ài)好者 <%s>' % from_addr) # 顯示的發(fā)件人 # msg['To'] = _format_addr('管理員 <%s>' % to_addr) # 單個(gè)顯示的收件人 msg['To'] = ",".join(to_addrs) # 多個(gè)顯示的收件人 msg['Subject'] = Header('來(lái)自SMTP的問(wèn)候……', 'utf-8').encode() # 顯示的郵件標(biāo)題 # 需要傳入的路徑 # filepath = r'D:\test' filepath = filepath_in r = os.path.exists(filepath) if r is False: msg.attach(MIMEText('no file...', 'plain', 'utf-8')) else: # 郵件正文是MIMEText: msg.attach(MIMEText('send with file...', 'plain', 'utf-8')) # 遍歷指定目錄,顯示目錄下的所有文件名 pathDir = os.listdir(filepath) for allDir in pathDir: child = os.path.join(filepath, allDir) print child.decode('gbk') # .decode('gbk')是解決中文顯示亂碼問(wèn)題 # 添加附件就是加上一個(gè)MIMEBase,從本地讀取一個(gè)文件 with open(child, 'rb') as f: # 設(shè)置附件的MIME和文件名,這里是txt類型: mime = MIMEBase('file', 'xls', filename=allDir) # 加上必要的頭信息: mime.add_header('Content-Disposition', 'attachment', filename=allDir) mime.add_header('Content-ID', '<0>') mime.add_header('X-Attachment-Id', '0') # 把附件的內(nèi)容讀進(jìn)來(lái): mime.set_payload(f.read()) # 用Base64編碼: encoders.encode_base64(mime) # 添加到MIMEMultipart: msg.attach(mime) try: server = smtplib.SMTP(smtp_server, 25) # server.starttls() server.set_debuglevel(1) # 用于顯示郵件發(fā)送的執(zhí)行步驟 server.login(from_addr, password) # print to_addrs server.sendmail(from_addr, to_addrs, msg.as_string()) server.quit() except Exception, e: print "Error: unable to send email" print traceback.format_exc() if __name__ == '__main__': send_email('*******@qq.com,*******@163.com','D:\\test')
3、在 PyCharm 里面執(zhí)行結(jié)果如下
顯示郵件已經(jīng)發(fā)送成功了,可在相應(yīng)的郵箱里面查看,相應(yīng)的文件夾下存在附件文本
如果不存在附件文本(這是截圖的網(wǎng)易郵箱,上面截圖的是QQ郵箱表示兩個(gè)郵箱都已經(jīng)收到郵件):
以上這篇python實(shí)現(xiàn)自動(dòng)發(fā)送郵件發(fā)送多人、群發(fā)、多附件的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- python發(fā)送郵件的實(shí)例代碼(支持html、圖片、附件)
- python中使用smtplib和email模塊發(fā)送郵件實(shí)例
- Python實(shí)現(xiàn)自動(dòng)發(fā)送郵件功能
- Python實(shí)現(xiàn)SMTP發(fā)送郵件詳細(xì)教程
- Python實(shí)現(xiàn)給qq郵箱發(fā)送郵件的方法
- python同時(shí)給兩個(gè)收件人發(fā)送郵件的方法
- python實(shí)現(xiàn)發(fā)送郵件及附件功能
- Python SMTP發(fā)送郵件遇到的一些問(wèn)題及解決辦法
- 利用Python自動(dòng)監(jiān)控網(wǎng)站并發(fā)送郵件告警的方法
- python實(shí)現(xiàn)發(fā)送郵件
相關(guān)文章
10個(gè)必須要掌握的Python內(nèi)置函數(shù)
Python?解釋器自帶的函數(shù)叫做?內(nèi)置函數(shù),這些函數(shù)不需要import?導(dǎo)入就可以直接使用。本文小編為大家總結(jié)了十個(gè)必須要掌握的Python內(nèi)置函數(shù),實(shí)用且高效,需要的可以參考一下2022-02-02詳解python實(shí)現(xiàn)簡(jiǎn)單區(qū)塊鏈結(jié)構(gòu)
區(qū)塊鏈?zhǔn)且环N數(shù)據(jù)結(jié)構(gòu),也是一個(gè)分布式數(shù)據(jù)庫(kù)。這篇文章主要介紹了python實(shí)現(xiàn)簡(jiǎn)單區(qū)塊鏈結(jié)構(gòu)的相關(guān)知識(shí),需要的朋友可以參考下2021-04-04Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能示例
這篇文章主要介紹了Django框架登錄加上驗(yàn)證碼校驗(yàn)實(shí)現(xiàn)驗(yàn)證功能,結(jié)合實(shí)例形式分析了Django框架基于Pillow模塊的圖形驗(yàn)證碼生成與使用相關(guān)操作技巧,需要的朋友可以參考下2019-05-05Python中easy_install 和 pip 的安裝及使用
本篇文章主要介紹了Python中easy_install 和 pip 的安裝及使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06代碼總結(jié)Python2 和 Python3 字符串的區(qū)別
在本篇文章里小編給大家整理的是一篇關(guān)于Python2 和 Python3 字符串的區(qū)別以及實(shí)例代碼,需要的朋友們學(xué)習(xí)下。2020-01-01淺談Python類的__getitem__和__setitem__特殊方法
下面小編就為大家?guī)?lái)一篇淺談Python類的__getitem__和__setitem__特殊方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Python將HTML快速轉(zhuǎn)換成PDF的方法實(shí)現(xiàn)
在Web開(kāi)發(fā)和報(bào)告任務(wù)中,將HTML內(nèi)容轉(zhuǎn)換為PDF是一種常見(jiàn)需求,本文主要介紹了Python將HTML快速轉(zhuǎn)換成PDF的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01