python 发送email 邮箱

2019-02-16  本文已影响0人  一只肥豚鼠
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Created by susecjh on 2017/10/23

from re import match
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr


# 封装qq邮箱,gmail邮箱,163邮箱的发送
class EmailPost(object):
    def __init__(self, tp, from_addr, password):
        """
        :param type: 你发送邮箱的方式,可选内容为:qq,QQ,gmail,163
        :param from_addr: 你的邮箱账号
        :param password: 你的邮箱密码,其中qq方式的发送password为授权码
        """
        if not isinstance(tp, str):
            raise ValueError('type is not a str, please input "qq","QQ","gmail","163"!')
        if tp == 'qq' or tp == 'QQ':
            if match(r'^\w+@qq.com$', from_addr) is None:
                raise ValueError('The email, %s , is not a %s email' % (from_addr, tp))
        if tp == 'gmail':
            if match(r'^\w+@gmail.com$', from_addr) is None:
                raise ValueError('The email, %s , is not a %s email' % (from_addr, tp))
        if tp == '163':
            if match(r'^\w+@163.cn$', from_addr) is None:
                raise ValueError('The email, %s , is not a %s email' % (from_addr, tp))
        self.__type = tp
        self.__from_addr = from_addr
        self.__password = password
        self.open()
    
    def open(self):
        """
        :param type: 邮箱类型
        :return: 返回一个SMTP_SSL对象
        """
        if self.__type == 'qq' or self.__type == 'QQ':
            self.__server = self.open_qq()
        if self.__type == 'gmail':
            self.__server = self.open_gmail()
        if self.__type == '163':
            self.__server = self.open_163()
        
        self.__server.login(self.__from_addr, self.__password)
    
    def open_qq(self):
        return smtplib.SMTP_SSL('smtp.qq.com', 465)
    
    def open_gmail(self):
        return smtplib.SMTP_SSL('smtp.gmail.com', 587)
    
    def open_163(self):
        return smtplib.SMTP_SSL('smtp.163.com', 465)
    
    def post(self, to_addr, msg, subject, subtype='plain', **kwargs):
        """
            msg:你想要发送的内容,可以是html的方式
            subject----主题
            kwargs:
                subtype:发送内容的格式----   
                                           'plain'---发送的文本内容,是默认值
                                           'html'----发送html方式
                                           'all'----用时支持以上两种方式
                html_msg----'all' 存在时生效,存储html方式的内容
                from_name----发送人昵称
                to_name----接受人昵称
                file_path-----附加文件地址
        """
        if subtype != 'plain' and subtype != 'html' and subtype != 'all':
            raise ValueError('The subtype is %s ,please input "plain" , "html" or "all".' % subtype)
        # 设置message内容
        message = MIMEText(msg, subtype, 'utf-8')
        message['From'] = _format_addr('%s<%s>' % (self.__from_addr, kwargs.get('from_addr', 'susecjh')))
        message['To'] = _format_addr('%s<%s>' % (to_addr, kwargs.get('to_addr', '用户')))
        message['Subject'] = Header(subject, 'utf-8').encode()
        self.__server.set_debuglevel(1)
        self.__server.sendmail(from_addr=self.__from_addr, to_addrs=to_addr, msg=message.as_string())
    
    def __del__(self):
        self.__server.quit()


def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))
上一篇下一篇

猜你喜欢

热点阅读