python写的一个邮件收发工具

import smtplib
import mimetypes
import os
from email import encoders
from email.header import Header
from email.message import Message
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText


CONTENT_ENCODING = 'UTF-8'
COMMASPACE = ','


def _header(s):
    if type(s) == str:
        return s
    elif type(s) == unicode:
        return Header(s.encode(CONTENT_ENCODING), CONTENT_ENCODING).encode()


class MailSender(object):
    def __init__(self, smtp_host, username, password,
                 verify_ssl, default_sender, timeout=30.0):
        self.set_smtp(smtp_host, username, password, verify_ssl)
        self.default_sender = default_sender
        self.timeout = timeout

    def set_smtp(self, smtp_host, username, password, verify_ssl):
        self.smtp_host = smtp_host
        self.username = username
        self.password = password
        self.verify_ssl = verify_ssl

    def sendmail(self, to_list, subject, text, cc_list=[],
                 file_paths=[], bcc_list=[], sender=None):
        if not sender:
            sender = self.default_sender
        msg = self.compose_msg(to_list, subject, text,
                               cc_list, file_paths, sender)
        to_addrs = to_list + cc_list + bcc_list
        server = smtplib.SMTP(self.smtp_host, timeout=self.timeout)
        if self.verify_ssl:
            server.ehlo()
            server.starttls()
            server.ehlo()
        else:
            server.ehlo()
        if self.username:
            server.login(self.username, self.password)
        server.sendmail(sender, to_addrs, msg)
        server.quit()

    def compose_msg(self, to_list, subject, text, cc_list=[],
                    file_paths=[], sender=None):
        if not sender:
            sender = self.default_sender

        outer = MIMEMultipart()
        outer['Subject'] = _header(subject)
        outer['To'] = COMMASPACE.join(to_list)
        if cc_list:
            outer['CC'] = COMMASPACE.join(cc_list)
        outer['From'] = sender

        if type(text) == unicode:
            textpart = MIMEText(text.encode(CONTENT_ENCODING),
                                'plain', CONTENT_ENCODING)
        else:
            textpart = MIMEText(str(text), 'plain', CONTENT_ENCODING)
        outer.attach(textpart)

        for path in file_paths:
            file_name = os.path.basename(path)
            ctype, encoding = mimetypes.guess_type(path)
            if ctype is None or encoding is not None:
                ctype = 'application/octet-stream'
            maintype, subtype = ctype.split('/', 1)
            fp = open(path, 'rb')
            data = fp.read()
            fp.close()
            if maintype == 'text':
                msg = MIMEText(data, _subtype=subtype)
            elif maintype == 'image':
                msg = MIMEImage(data, _subtype=subtype)
            elif maintype == 'audio':
                msg = MIMEAudio(data, _subtype=subtype)
            else:
                msg = MIMEBase(maintype, subtype)
                msg.set_payload(data)
                encoders.encode_base64(msg)
            if type(file_name) == unicode:
                #s_filename = ('utf-8', '', file_name.encode(CONTENT_ENCODING))
                s_filename = file_name.encode(CONTENT_ENCODING)
            else:
                s_filename = str(file_name)
            msg.add_header('Content-Disposition',
                           'attachment', filename=s_filename)
            outer.attach(msg)

        return outer.as_string()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值