python2.7實(shí)現(xiàn)郵件發(fā)送功能
要想實(shí)現(xiàn)一個(gè)能夠發(fā)送帶有文本、圖片、附件的python程序,首先要熟悉兩大模塊:
email以及smtplib
然后對于MIME(郵件擴(kuò)展)要有一定認(rèn)知,因?yàn)橛辛藬U(kuò)展才能發(fā)送附件以及圖片這些媒體或者非文本信息
最后一個(gè)比較細(xì)節(jié)的方法就是MIMEMultipart,要理解其用法以及對應(yīng)參數(shù)所實(shí)現(xiàn)的功能區(qū)別
發(fā)送郵件三部曲:
創(chuàng)建協(xié)議對象
連接郵件服務(wù)器
登陸并發(fā)送郵件
from email.header import Header from email.mime.base import MIMEBase from email.mime.text import MIMEText import mimetypes from email.mime.multipart import MIMEMultipart import os import smtplib from email import Encoders as email_encoders class Message(object): def __init__(self, from_addr, to_addr, subject="", html="", text=None, cc_addr=[], attachment=[]): self.from_addr = from_addr self.subject = subject if to_addr: if isinstance(to_addr, list): self.to_addr = to_addr else: self.to_addr = [d for d in to_addr.split(',')] else: self.to_addr = [] if cc_addr: if isinstance(cc_addr, list): self.cc_addr = cc_addr else: self.cc_addr = [d for d in cc_addr.split(',')] else: self.cc_addr = [] if html is not None: self.body = html self.body_type = "html" else: self.body = text self.body_type = "plain" self.parts = [] if isinstance(attachment, list): for file in attachment: self.add_attachment(file) def add_attachment(self, file_path, mimetype=None): """ If *mimetype* is not specified an attempt to guess it is made. If nothing is guessed then `application/octet-stream` is used. """ if not mimetype: mimetype, _ = mimetypes.guess_type(file_path) if mimetype is None: mimetype = 'application/octet-stream' type_maj, type_min = mimetype.split('/') with open(file_path, 'rb') as fh: part_data = fh.read() part = MIMEBase(type_maj, type_min) part.set_payload(part_data) email_encoders.encode_base64(part) part_filename = os.path.basename(file_path) part.add_header('Content-Disposition', 'attachment; filename="%s"' % part_filename) part.add_header('Content-ID', part_filename) self.parts.append(part) def __to_mime_message(self): """Returns the message as :py:class:`email.mime.multipart.MIMEMultipart`.""" ## To get the message work in iOS, you need use multipart/related, not the multipart/alternative msg = MIMEMultipart('related') msg['Subject'] = self.subject msg['From'] = self.from_addr msg['To'] = ','.join(self.to_addr) if len(self.cc_addr) > 0: msg['CC'] = ','.join(self.cc_addr) body = MIMEText(self.body, self.body_type) msg.attach(body) # Add Attachment for part in self.parts: msg.attach(part) return msg def send(self, smtp_server='localhost'): smtp = smtplib.SMTP() smtp.connect(smtp_server) smtp.sendmail(from_addr=self.from_addr, to_addrs=self.to_addr + self.cc_addr, msg=self.__to_mime_message().as_string()) smtp.close()
對于實(shí)際發(fā)送程序,要注意個(gè)參數(shù)的類型,比如from_addr是字符串,to_addr和cc_addr以及attachment都是列表
from mail_base import Message import datetime from_addr = 'xxx' mail_to = 'xxx' def send_go(): time_now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') attach_files = ['testcsv.xlsm','test1.jpg','test2.jpg','test3.jpg'] mail_msg = """ <p>Hi Lockey:</p> <p><img src="cid:test1.jpg"></p>####要特別注意這里,正文插入圖片的特殊格式!?。? <hr/> <p style="text-indent:16px">Here is the latest paper link from The Economist, you can click <a rel="external nofollow" >Go</a> for a full view!</p> <hr/> <p>Best Regards</p> <p> Any question please mail to <a href='mailto:iooiooi23@163.com'>Lockey23</a>. </p> <p>Sent at {} PST</p> """.format(time_now) subject = '[Halo] - ' + 'A new paper published!' msg = Message(from_addr=from_addr, to_addr=[mail_to], cc_addr=[mail_to], subject=subject, attachment=attach_files, html=mail_msg ) msg.send() if __name__ == '__main__': send_go()
對于測試程序我們命名為sendGo.py,運(yùn)行測試程序
~$ python sendGo.py
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python實(shí)現(xiàn)郵件發(fā)送功能
- python生成每日報(bào)表數(shù)據(jù)(Excel)并郵件發(fā)送的實(shí)例
- python實(shí)現(xiàn)QQ郵箱/163郵箱的郵件發(fā)送
- python3.4實(shí)現(xiàn)郵件發(fā)送功能
- python模塊smtplib實(shí)現(xiàn)純文本郵件發(fā)送功能
- python郵件發(fā)送smtplib使用詳解
- Python實(shí)現(xiàn)的查詢mysql數(shù)據(jù)庫并通過郵件發(fā)送信息功能
- Python實(shí)現(xiàn)定時(shí)備份mysql數(shù)據(jù)庫并把備份數(shù)據(jù)庫郵件發(fā)送
- python實(shí)現(xiàn)12306搶票及自動郵件發(fā)送提醒付款功能
- python實(shí)現(xiàn)自動發(fā)送郵件發(fā)送多人、群發(fā)、多附件的示例
- 利用python實(shí)現(xiàn)簡單的郵件發(fā)送客戶端示例
- python定時(shí)利用QQ郵件發(fā)送天氣預(yù)報(bào)的實(shí)例
- python實(shí)現(xiàn)SMTP郵件發(fā)送功能
- python使用smtplib模塊通過gmail實(shí)現(xiàn)郵件發(fā)送的方法
- python實(shí)現(xiàn)郵件自動發(fā)送
相關(guān)文章
python利用不到一百行代碼實(shí)現(xiàn)一個(gè)小siri
這篇文章主要介紹了關(guān)于python利用不到一百行代碼實(shí)現(xiàn)了一個(gè)小siri的相關(guān)資料,文中介紹的很詳細(xì),對大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來一起看看吧。2017-03-03windows10系統(tǒng)中安裝python3.x+scrapy教程
本文給大家主要介紹了在windows10系統(tǒng)中安裝python3以及scrapy框架的教程以及有可能會遇到的問題的解決辦法,希望大家能夠喜歡2016-11-11TensorFlow實(shí)現(xiàn)Batch Normalization
這篇文章主要為大家詳細(xì)介紹了TensorFlow實(shí)現(xiàn)Batch Normalization,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03淺談Python中用datetime包進(jìn)行對時(shí)間的一些操作
下面小編就為大家?guī)硪黄獪\談Python中用datetime包進(jìn)行對時(shí)間的一些操作。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06Opencv-Python圖像透視變換cv2.warpPerspective的示例
今天小編就為大家分享一篇關(guān)于Opencv-Python圖像透視變換cv2.warpPerspective的示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-04-04Python數(shù)據(jù)挖掘中常用的五種AutoEDA 工具總結(jié)
大家好,我們都知道在數(shù)據(jù)挖掘的過程中,數(shù)據(jù)探索性分析一直是非常耗時(shí)的一個(gè)環(huán)節(jié),但也是繞不開的一個(gè)環(huán)節(jié),本篇文章帶你盤點(diǎn)數(shù)據(jù)挖掘中常見的5種 AutoEDA 工具2021-11-11使用Python實(shí)現(xiàn)將PDF轉(zhuǎn)為PDF/A和PDF/X
PDF/A和PDF/X是兩種有特定用途的PDF格式,本文主要介紹了如何使用Python將PDF轉(zhuǎn)換為PDF/A和PDF/X,以及如何將PDF/A格式轉(zhuǎn)換回標(biāo)準(zhǔn)的PDF格式,需要的可以參考下2024-04-04