Advertisement

最完整的python2.7邮件发送示例(包含文本,附件,正文图片等)

阅读量:

要想具备发送能力的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_addrs、cc_addrs以及attachments均为列表

复制代码
    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 href="https://lockeycheng.github.io/iooi/index.html">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
    
    
      
    
    代码解释
这里写图片描述

全部评论 (0)

还没有任何评论哟~