smtplib

python3

pycharm

 

利用smtplib及SMTP服务器进行自动发送邮件

可以发送普通文本的正文、html格式的正文

可以添加单个附件,多个附件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import re


# 提取文件路径中的文件名
def file_name(path):
    '''
    提取文件路径中的文件名称
    :param path:文件路径
    :return:文件名称
    '''
    reg = r'([^<>/\\\|:""\*\?]+\.\w+$)'
    result = re.compile(reg).findall(path)[0]
    return result


class Mail:

    def __init__(self,user='xxxx@yy.com',
                 password='********',
                 receivers=None):
        '''
        初始化邮件,指定谁发送,发送给谁
        :param user:发送人邮箱
        :param password:邮箱密码,若qq邮箱,则为授权码
        :param receivers:收件人,若多个收件人,写成列表形式
        '''

        #确定发送人
        self.user = user  # 发件人邮箱
        self.password = password  # 发件人密码

        #根据邮箱判断服务器、正则匹配
        reg = r"@(.+?).com"
        result=re.compile(reg).findall(user)[0]

        if result == 'qq':
            self.host='smtp.qq.com'

        if result == 'fulaan':
            self.host='smtp.exmail.qq.com'

        if result == '163':
            self.host='smtp.163.com'

        if result == '126':
            self.host='smtp.126.com'

        if result == '188':
            self.host='smtp.188.com'

        if result == 'netease':
            self.host='smtp.netease.com'

        if result == 'yeah':
            self.host='smtp.yeah.net'

        if result == 'gmail':
            self.host='smtp.gmail.com'


        # 确定接收人,为列表形式,若多个接收人,则在列表中加入多个元素
        if receivers == None:
            raise Exception('Error:请输入收件人')
        elif isinstance(receivers,str) == True:              # 判断传入的receviers类型,若不是列表,转换为列表
            self.receivers = receivers.split()    
        elif isinstance(receivers,list) == True:
            self.receivers = receivers


    def send(self,Subject,Content,From,type='plain',payload=None):
        '''
        指定发送内容(正文,抬头),是否添加附件
        :param Subject:邮件标题
        :param Content:邮件正文
        :param From: 从哪里发来
        :param type:正文格式,html  或者  plain
        :param payload:附件,默认为None,无附件;若要一并发送附件,该参数请输入附件路径;多个写成列表
        :发送邮箱默认为发件人的邮箱
        :return:
        '''
        To = ''.join(self.receivers)  # 发给谁,默认填写发件人邮箱

        # 不添加附件
        if payload == None:
            message = MIMEText(Content, type, 'utf-8')  # 创建一个不带附件的实例,加入正文
            message['Subject'] = Header(Subject, 'utf-8')  # 加入标题
            message['From'] = Header(From, 'utf-8')  # 加入From
            message['To'] = Header(To, 'utf-8')  # 加入To

        # 添加附件
        else:
            message = MIMEMultipart()  # 构造一个带附件的实例
            message.attach(MIMEText(Content, type, 'utf-8'))  # 加入正文
            message['Subject'] = Header(Subject, 'utf-8')  # 加入标题
            message['From'] = Header(From, 'utf-8')  # 加入From
            message['To'] = Header(To, 'utf-8')  # 加入To

            #判断附件个数,若为1个,转为列表
            if isinstance(payload,str) == True:
                list=payload.split()
            elif isinstance(payload,list) == True:
                list=payload

            # 构造附件
            for i in list:
                payload_add = MIMEText(open('{}'.format(i), 'rb').read(), 'base64', 'utf-8')  # 选择附件
                payload_add["Content-Type"] = 'application/octet-stream'  # 定义附件类型
                payload_add.add_header(
                    'Content-Disposition',
                    'attachment',
                    filename=('gbk', '', file_name(i))  # 所发出的文件名默认为原文件名,这里要加入编码设置,不然中文会显示乱码
                )
                # 加入附件
                message.attach(payload_add)      # 一个附件,执行一次;多个附件,执行多次

        # 连接服务器,并且发送邮件
        try:
            smtp = smtplib.SMTP()
            smtp.connect(self.host)
            smtp.login(self.user, self.password)
            smtp.sendmail(self.user, self.receivers, message.as_string())
            print('发送成功!')
        except:
            raise Exception('Error:发送失败,请检查密码是否正确,邮箱是否开启SMTP服务,正文格式')

使用

from mail import Mail


mail=Mail(receivers='4903xxxxxx@qq.com')    #user、password使用默认值
mail.send(
    Subject='python test',
    Content='<html><p style="color: red">你好,这是一封测试邮件!!!</p></html>',
    From='xxxx',
    type='html',
    payload="D:\hello\\test\\2019-1-16测试报告.txt"
          )

---------------

发送成功!

注:若要使用smtplib发送邮件,发送的邮箱需进行设置,开启SMTP服务,方可进行发送

 

posted @ 2019-01-16 17:58  cooper_wang  阅读(367)  评论(0编辑  收藏  举报