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格式发送电子邮件。的主要内容,如果未能解决你的问题,请参考以下文章

Python:多部分 html 电子邮件通过嵌入式图像和附件发送

Python:解析带有嵌入图像的电子邮件

是否可以像 Outlook RTF/TNEF 那样在 html 电子邮件中嵌入非图像附件?

python [Python]发送包含嵌入式图像和应用程序附件的电子邮件

Word邮件合并不能发送HTML格式以及怎么带附件?

我可以防止 MIME 嵌入的 html 图像显示为附件吗?