python2.7實(shí)現(xiàn)郵件發(fā)送功能
要想實(shí)現(xiàn)一個能夠發(fā)送帶有文本、圖片、附件的python程序,首先要熟悉兩大模塊:
email以及smtplib
然后對于MIME(郵件擴(kuò)展)要有一定認(rèn)知,因?yàn)橛辛藬U(kuò)展才能發(fā)送附件以及圖片這些媒體或者非文本信息
最后一個比較細(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ā)送程序,要注意個參數(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)定時備份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定時利用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)文章
如何使用 Poetry 進(jìn)行 Python 項(xiàng)目管理
本文介紹了如何安裝、卸載和管理Poetry,以及如何查看其版本和位置,此外,還詳細(xì)說明了如何使用Poetry安裝項(xiàng)目依賴,包括依賴解析、鎖定、虛擬環(huán)境管理等優(yōu)勢,感興趣的朋友一起看看吧2024-11-11
使用TensorFlow實(shí)現(xiàn)二分類的方法示例
這篇文章主要介紹了使用TensorFlow實(shí)現(xiàn)二分類的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02
Python的Django框架可適配的各種數(shù)據(jù)庫介紹
這篇文章主要介紹了Python的Django框架可適配的各種數(shù)據(jù)庫,簡單總結(jié)為就是流行的幾種數(shù)據(jù)庫Python基本上全部能用XD 需要的朋友可以參考下2015-07-07
python中tkinter的應(yīng)用:修改字體的實(shí)例講解
今天小編就為大家分享一篇python中tkinter的應(yīng)用:修改字體的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python實(shí)現(xiàn)統(tǒng)計(jì)單詞出現(xiàn)的個數(shù)
這篇文章主要介紹了Python實(shí)現(xiàn)統(tǒng)計(jì)單詞出現(xiàn)的個數(shù),本文給出了實(shí)現(xiàn)代碼以及使用方法,需要的朋友可以參考下2015-05-05

