码迷,mamicode.com
首页 > 编程语言 > 详细

python内建模块(四):smtplib

时间:2019-01-16 19:19:21      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:end   filename   html   列表   参数   test   alt   ring   lse   

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

标签:end   filename   html   列表   参数   test   alt   ring   lse   

原文地址:https://www.cnblogs.com/cooper-wang/p/10278450.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!