您好,登錄后才能下訂單哦!
要想實現一個能夠發送帶有文本、圖片、附件的python程序,首先要熟悉兩大模塊:
email以及smtplib
然后對于MIME(郵件擴展)要有一定認知,因為有了擴展才能發送附件以及圖片這些媒體或者非文本信息
最后一個比較細節的方法就是MIMEMultipart,要理解其用法以及對應參數所實現的功能區別
發送郵件三部曲:
創建協議對象
連接郵件服務器
登陸并發送郵件
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()
對于實際發送程序,要注意個參數的類型,比如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 >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,運行測試程序
~$ python sendGo.py
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。