python内建模块:smtplib

Posted cooper_wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python内建模块: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服务,方可进行发送

 

以上是关于python内建模块:smtplib的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫-smtplib模块发送邮件

python学习-smtplib模块

Python 收发邮件

python模块----yagmail模块smtplib模块 (电子邮件)

python模块----yagmail模块smtplib模块 (电子邮件)

[新星计划] Python smtplib模块 | 轻松学会收发E-mail(电子邮件)