python 使用嵌入的附件和图像以HTML格式发送电子邮件。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 使用嵌入的附件和图像以HTML格式发送电子邮件。相关的知识,希望对你有一定的参考价值。

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
This module is used to send emails in HTML format, with embedded attachments and images.
"""

__version__ = '0.2'
__date__ = '2016-04-25'
__author__ = 'Guangning Yu'

import os
import smtplib
import mimetypes
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email.MIMEImage import MIMEImage
from email import encoders
from optparse import OptionParser

def send_mail(mail_host='192.168.0.1', subject=None, sender='noreply@example.com', to=[], cc=[], bcc=[], content=None, attach=[], images=[]):

    def split(text):
        return text.strip().replace(' ','').replace(',',';').split(';')

    def filter_valid(list):
        list = [i for i in list if '@example.com' in i]
        return list

    def to_str(list):
        return ';'.join(list)

    def print_info():
        print 'Subject: %s' % subject
        if sender:
            print 'From: %s' % sender
        if to:
            print 'To: %s' % to_str(to)
        if cc:
            print 'Cc: %s' % to_str(cc)
        if bcc:
            print 'Bcc: %s' % to_str(bcc)
        if attachs:
            print 'Attachments:'
            for i in attachs:
                print '    %s' % i
        if images:
            print 'Images:'
            for i in images:
                print '    %s' % i

    # Deal with parameters
    subject = subject
    sender  = sender
    to      = filter_valid(split(to)  if to  else [])
    cc      = filter_valid(split(cc)  if cc  else [])
    bcc     = filter_valid(split(bcc) if bcc else [])
    content = content
    attachs = [os.path.abspath(file) for file in split(attach)] if attach else []
    images  = [os.path.abspath(file) for file in split(images)] if images else []

    # Compose the message
    receivers = []
    msg = MIMEMultipart('related')
    if subject:
        msg['Subject'] = subject
    if sender:
        msg['From'] = sender
    if to:
        msg['To'] = to_str(to)
        receivers += to
    if cc:
        msg['Cc'] = to_str(cc)
        receivers += cc
    if bcc:
        receivers += bcc

    # 1.attach email body
    body = MIMEMultipart('alternative')
    if content:
        with open(content, 'rb') as f:
            content = f.read()
        content = MIMEText(content, _subtype='html')
        body.attach(content)
    else:
        content = MIMEText('')
        body.attach(content)
    msg.attach(body)

    # 2.attach attachments
    if attachs:
        for f in attachs:
            ctype, encoding = mimetypes.guess_type(f)
            maintype = None
            subtype = None
            if ctype:
                maintype, subtype = ctype.split('/', 1)
            attach = MIMEBase(maintype, subtype)
            with open(f, 'rb') as fp:
                attach.set_payload(fp.read())
            file_name = f.split('/')[-1]
            encoders.encode_base64(attach)
            attach.add_header('Content-Disposition','attachment', filename=file_name)
            msg.attach(attach)

    # 3.attach images (note: the "img src" should have been added in the body)
    if images:
        for i in images:
            image_name = i.split('/')[-1]
            with open(i, 'rb') as f:
                image_content = f.read()
            image = MIMEImage(image_content)
            image.add_header('Content-ID', '<%s>' % image_name)
            msg.attach(image)

    # Send the email
    if sender and receivers:
        print_info()
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.sendmail(sender, receivers, msg.as_string())
        s.close()
    else:
        raise Exception("请指定发件人和收件人")

if __name__ == '__main__':

    parser = OptionParser()
    parser.add_option("-s", dest="subject", default=None,               help='e.g."Weekly Report"')
    parser.add_option("-f", dest="sender",  default='noreply@example.com', help='e.g."noreply@example.com"')
    parser.add_option("-r", dest="to",      default=None,               help='e.g."lilei001@example.com;hanmeimei001@example.com"')
    parser.add_option("-c", dest="cc",      default=None,               help='e.g."lily@example.com;lucy@example.com"')
    parser.add_option("-v", dest="bcc",     default=None,               help='e.g."polly@example.com"')
    parser.add_option("-b", dest="content", default=None,               help='e.g."result.html"')
    parser.add_option("-a", dest="attach",  default=None,               help='e.g."result.csv;result.gz"')
    parser.add_option("-i", dest="images",  default=None,               help='e.g."img1.jpg;img2.jpg"')
    (options, args) = parser.parse_args()

    send_mail(
        subject = options.subject,
        sender  = options.sender,
        to      = options.to,
        cc      = options.cc,
        bcc     = options.bcc,
        content = options.content,
        attach  = options.attach,
        images  = options.images
    )

以上是关于python 使用嵌入的附件和图像以HTML格式发送电子邮件。的主要内容,如果未能解决你的问题,请参考以下文章