Python发送邮件以及对其封装

枫铃3年前 (2021-10-03)Python251

Python发送邮件分为四步

  • 连接到smtp服务器
  • 登陆smtp服务器
  • 准备邮件
  • 发送邮件

导入所需要的包

import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart

一、连接到smtp服务器

方式一:不使用ssl加密

smtp = smtplib.SMTP(host="smtp.163.com", port=25)

方式二:使用ssl加密

smtp = smtplib.SMTP_SSL(host="smtp.163.com", port=465)

注意:传host参数时,如果是QQ邮箱就改成’smtp.qq.com’

二、登陆smtp服务器

mtp.login(user="发件人地址", password="授权码")

三、准备邮件

①:发送文本邮件

1、准备内容

f_user = "发件人地址"
t_user = "收件人地址"
content = "邮件的正文"
subject = "邮件的主题"

2、使用email构造邮件

'''
Python学习交流,免费公开课,免费资料,
免费答疑,系统学习加QQ群:579817333 
'''
msg = MIMEText(content, _subtype='plain', _charset="utf8")
# 添加发件人
msg["From"] = f_user
# 添加收件人
msg["To"] = t_user
# 添加邮件主题
msg["subject"] = subject

②:发送带附件的邮件

1、准备内容

f_user = "发件人地址"
t_user = "收件人地址"
content = "邮件的正文"
subject = "邮件的主题"
# 读取要发送附件的内容
file_content = open("附件文件名", "rb").read()

2、使用email构造邮件

(1)构造一封多组件的邮件

msg = MIMEMultipart()

(2)往多组件邮件中加入文本内容

text_msg = MIMEText(content, _subtype='plain', _charset="utf8")
msg.attach(text_msg)

(3)往多组件邮件中加入文件附件

file_msg = MIMEApplication(file_content)
file_msg.add_header('content-disposition', 'attachment', filename='发送附件的名称(可自定义)')
msg.attach(file_msg)

3、添加发件人、收件人、邮件主题

'''
Python学习交流,免费公开课,免费资料,
免费答疑,系统学习加QQ群:579817333 
'''
# 添加发件人
msg["From"] = f_user
# 添加收件人
msg["To"] = t_user
# 添加邮件主题
msg["subject"] = subject

四、发送邮件

smtp.send_message(msg, from_addr=f_user, to_addrs=t_user)

像这样上面这样写发送邮件,写一次还好,如果说一个项目中多个地方都需要用发送邮件,那就显得笨重了,所以呢,这个时候就需要给上面内容做一个封装,供项目中所有用到发送邮件的地方都可以直接调用.

1.首先,创建一个配置文件conf.ini

[email]
# smtp服务地址
host = smtp.163.com
# 端口
port = 465
# 发件人
user = 163邮箱
# 授权码
pwd = 授权码
# 收件人
to_user = 收件人邮箱
# 邮件正文
content = 正文
# 邮件主题
subject = 主题

2.对发送邮件进行封装

封装了两个方法:

  • send_text:发送文本邮件

  • send_file:发送文件附件邮件

以下代码带[]的都是要从配置文件中获取的

class SendEMail(object):
    """封装发送邮件类"""

    def __init__(self):
        # 第一步:连接到smtp服务器
        self.smtp_s = smtplib.SMTP_SSL(host=[host],
                                       port=[port])
        # 第二步:登陆smtp服务器
        self.smtp_s.login(user=[user],
                          password=[pwd])

    def send_text(self, to_user, content, subject):
        """
        发送文本邮件
        :param to_user: 对方邮箱
        :param content: 邮件正文
        :param subject: 邮件主题
        :return:
        """
        # 第三步:准备邮件
        # 使用email构造邮件
        msg = MIMEText(content, _subtype='plain', _charset="utf8")
        # 添加发件人
        msg["From"] = [user]
        # 添加收件人
        msg["To"] = to_user
        # 添加邮件主题
        msg["subject"] = subject
        # 第四步:发送邮件
        self.smtp_s.send_message(msg, from_addr=[user], to_addrs=to_user)

    def send_file(self, to_user, content, subject, reports_path, file_name):
        """
        发送测试报告邮件
        :param to_user: 对方邮箱
        :param content: 邮件正文
        :param subject: 邮件主题
        :param reports_path: 测试报告路径
        :param file_name: 发送时测试报告名称
        """
        # 读取报告文件中的内容
        file_content = open(reports_path, "rb").read()
        # 2.使用email构造邮件
        # (1)构造一封多组件的邮件
        msg = MIMEMultipart()
        # (2)往多组件邮件中加入文本内容
        text_msg = MIMEText(content, _subtype='plain', _charset="utf8")
        msg.attach(text_msg)
        # (3)往多组件邮件中加入文件附件
        file_msg = MIMEApplication(file_content)
        file_msg.add_header('content-disposition', 'attachment', filename=file_name)
        msg.attach(file_msg)
        # 添加发件人
        msg["From"] = [user]
        # 添加收件人
        msg["To"] = to_user
        # 添加邮件主题
        msg["subject"] = subject
        # 第四步:发送邮件
        self.smtp_s.send_message(msg, from_addr=[user], to_addrs=to_user)

相关文章

django中使用POST方法 获取POST数据

在django中获取post数据,首先要规定post发送的数据类型是什么。 1.获取POST中表单键值数据 如果要在django的POST方...

Python69个内置函数分类总结

Python3解释器中内置了69个常用函数,属于底层的函数,它们到处可用,是新手学习的重要内容。 当然࿰...

python中super的用法实例解析

概念 super作为python的内建函数。主要作用如下: 允许我们避免使用基类跟随多重继承来使用 实例 在单个继承的场景下࿰...

Python如何实现单例模式?其他23中设计模式python如何实现?

单例模式主要有四种方法:new、共享属性、装饰器、import。 # __ new__方法: class Singleton(...

警告!你的Python代码命名太烂了,命令你熟读本篇迷你命名指南!

拒绝通用词 1、写代码的时候,不管是全局变量还是局部变量,都应该避免使用 ‘list’、‘dict’、‘elements’ 等词...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。