Python邮件封装

news2024/10/2 20:28:37

一、smtplib库

是SMTP 简单邮件传输协议的操作模块,发送邮件时起到服务器之间的通信作用。

发送一封邮件分为:设置服务器信息-编写邮件主体信息-进行登录发送

发送一个文本邮件

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

# 设置服务器信息
mail_host = "smtp.qq.com"
mail_user = "372109913"
mail_pass = "输入授权码"
sender = '372109913@qq.com'
receivers = ['smilepassed@163.com']

# 编写邮件主体
message = MIMEText('这是一个测试内容','plain','UTF-8')
message['Subject'] = '一封来自测试的信'  # 邮件标题
message['From'] = Header("Jie的QQ邮箱","utf-8") # 邮件主体中发送者名称
message['To'] = Header("Jie的163邮箱","utf-8") # 邮件主体中接收者名称

# 进行登录发送
try:
	smtpobj = smtplib.SMTP()
	smtpobj.connect(mail_host,25)
	smtpobj.login(mail_user,mail_pass)
	smtpobj.sendmail(sender,receivers,message.as_string())
	print('success')
except Exception as e:
	print(f'error: {e}')
finally:
    smtpobj.quit()

1、设置服务器信息

mail_host : SMTP 服务器主机;

mail_user:邮箱登录账号;

mail_pass:邮箱登录授权码;

sender:发送邮件的邮箱地址;

receivers:要接收邮件的地址,是一个list,即可实现群发邮件;

2、编写邮件主体

MIMEText('这是一个测试内容','html','UTF-8') :邮件主体内容三个参数('文本内容','文本格式','文本编码');

message['Subject'] :邮件标题;

message['From'] :邮件主体中发送者名称;

message['To']:邮件主体中接收者名称;

3、进行登录发送

smtplib.SMTP( ):创建SMTP对象;

通过connect( )连接SMTP服务器,参数(服务器地址,端口号);

通过login( )进行登录,参数(用户名,登录授权码);

sendmail 进行发送,参数(发送者邮箱,接收邮箱列表,邮件主体)  

在发送方邮箱设置中需要,打开POP3,也是在这里获取登录的“授权码”

 

发送一个带附件的邮件

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

# 设置服务器信息
mail_host = "smtp.qq.com"
mail_user = "372109913"
mail_pass = "输入授权码"
sender = '372109913@qq.com'
receivers = ['smilepassed@163.com']

# 编写邮件主体
message = MIMEMultipart() # 生成包含多个部分的邮件主体对象
message['Subject'] = '一封来自测试的信'  # 邮件主题
message['From'] = Header("Jie的QQ邮箱","utf-8") # 邮件主体中发送者名称
message['To'] = Header("Jie的163邮箱","utf-8") # 邮件主体中接收者名称
body = MIMEText('正文文本内容','plain','utf-8')
message.attach(body)
att_body = open(file_path, 'rb') # 以二进制的格式打开附件
att = MIMEApplication(att_body.read()) # 导入附件
att_body.close()
att.add_header('Content-Disposition','attachment',filename='allure测试报告.zip')
message.attach(att)

# 进行登录发送
try:
	smtpobj = smtplib.SMTP()
	smtpobj.connect(mail_host,25)
	smtpobj.login(mail_user,mail_pass)
	smtpobj.sendmail(sender,receivers,message.as_string())
  smtpobj.quit()
	print('success')
except Exception as e:
	print(f'error: {e}')

1、创建 message = MIMEMultipart() 对象用于构造带附件的邮件主体;

2、通过 body = MIMEText('正文文本内容','plain','utf-8') 定义邮件主体的文本内容;

3、message.attach(body) 把文本内容添加到邮件主体中;

4、att =MIMEApplication(open(file_path, 'rb').read()) 把要上传的附件以二进制打开读取后作为作为附件导入

5、att.add_header('Content-Disposition','attachment',filename='allure测试报告.zip') 通过filename定义可下载的附件名;

6、message.attach(att) 把定义好的附件添加到message主体中;

邮件发送模块的封装

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


class SendEmail:

    # 初始化服务器信息
    def __init__(self,mail_host, mail_user, mail_pass, sender, receives):
        self.mail_host = mail_host
        self.mail_user = mail_user
        self.mail_pass = mail_pass
        self.sender = sender
        self.receivers = receives

    # 以文本的形式发送邮件
    def make_email_by_text(self,context, subject, from_address, to_address):
        message = MIMEText(context, 'plain', 'UTF-8')
        message['Subject'] = subject  # 邮件标题
        message['From'] = Header(from_address, "utf-8")  # 邮件主体中发送者名称
        message['To'] = Header(to_address, "utf-8")  # 邮件主体中接收者名称
        self.send_email(message)

     # 以文本和附件的形式发送邮件
    def make_email_by_att(self,file_path,subject, from_address, to_address):
        message = MIMEMultipart()
        message['Subject'] = subject  # 邮件标题
        message['From'] = Header(from_address, "utf-8")  # 邮件主体中发送者名称
        message['To'] = Header(to_address, "utf-8")  # 邮件主体中接收者名称
        body = MIMEText('dear all: 测试报告详情请查看附件','plain','utf-8')
        message.attach(body)
        att_body = open(file_path, 'rb') # 以二进制的格式打开附件
        att = MIMEApplication(att_body.read()) # 导入附件
        att_body.close()
        att.add_header('Content-Disposition','attachment',filename='allure测试报告.pdf') # 添加附件名称
        message.attach(att)
        self.send_email(message)

    # 登录并进行发送
    def send_email(self,message):

        # 进行登录发送
        try:
            smtpobj = smtplib.SMTP()
            smtpobj.connect(self.mail_host,25)
            smtpobj.login(self.mail_user,self.mail_pass)
            smtpobj.sendmail(self.sender,self.receivers,message.as_string())
            smtpobj.quit()
            print('success')
        except Exception as e:
            print(f'error: {e}')
            raise e



if __name__ == '__main__':
   pass

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

静态独享长效IP的优点有哪些?静态独享长效IP有哪些应用场景?

随着互联网的不断发展,IP地址作为网络通信中的重要标识,其重要性日益凸显。静态独享长效IP作为一种特殊的IP地址类型,具有许多优点,适用于多种应用场景。本文将详细介绍静态独享长效IP的优点以及适用场景。 一、静态独享长效IP的优…

RegGAN:打破医学图像转换困境 --- 数据未对齐、噪声干扰和未配对图像

RegGAN:打破医学图像转换困境 医学图像转换困境网络结构效果总结 论文:https://arxiv.org/pdf/2110.06465.pdf 代码:https://github.com/Kid-Liet/Reg-GAN.git 医学图像转换困境 一、传统的Pix2Pix方法要求输入图像必须是精确成对且对齐的。…

day32_CSS

今日内容 0 复习昨日 1 css属性 2 盒子模型 【重点】 3 css扩展属性 4 Bootstrap【重点】 0 复习昨日 1 表格标签 table表格里面有tr , (行)行内有单元格,td行合并,rowspan列合并,colspan 2 写出input标签type属性的值 文本框 text 密码框 password 单选框 radio 复选框 checkb…

Sublime Text 3配置 Java 开发环境

《开发工具系列》 《开发语言-Java》 Sublime Text 3配置 Java 开发环境 一、引言二、主要内容1. 初识 Sublime Text 32. 初识 Java3. 接入 Java3.1 JDK 下载3.2 安装和使用 java3.3 环境变量配置 4. 配置 Java 开发环境5. 编写 Java 代码6. 编译和运行 Java 代码7. 乱码问题 三…

PuLP库-多数线性规划问题

投标价格重预算 背景 甲方需要采购一批物资,采购数量为甲方给定的预计采购数量,并限制了采购总价。例甲方采购预算清单如下,采购总预算为不超过 3175 元 采购内容采购数量投标单价投标报价合计电脑10空调20洗衣机8桌子7打印机35合计 注&a…

Shell脚本④循环语句for、while、until

目录 一.for 1. 九九乘法表 2.求1到10奇数和 3.累计加到100 (1)方法一 (2)方法2 二.while 1.猜价格小游戏 2.累加到100的方法三 三.until循环 1.累加到100方法四 四.嵌套循环 五.循环语句中break、exit和continue 1…

网络防御——NET实验

一、实验拓扑 二、实验要求 1、生产区在工作时间(9:00---18:00)内可以访问服务区,仅可以访问http服务器; 2、办公区全天可以访问服务器区,其中,10.0.2.20可以访问FTP服务器和HTTP服…

Google浏览器Provisional headers are shown. Disable cache to see full headers.

Google浏览器Provisional headers are shown. Disable cache to see full headers. 问题 解决方法 勾选禁用缓存,刷新 成功

制造领域 物料清单(BOM)与零件明细表的区别

有许多人分不清物料清单(BOM)与零件明细表的区别,其实它们在企业的生产管理软件中起着不同的作用,各有各的特色,但是却有不尽相同。接下来我们就来区分一下吧 物料清单(BOM),是详细记录一个项目所用到的所有下阶材料及相关属性,亦即母件与所有子件的从属…

代码随想录刷题笔记 DAY15 | 翻转二叉树 No.226 | 对称二叉树 No.101

Day 15 01. 翻转二叉树(No. 226) 题目链接 代码随想录题解 1.1 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9…

代码随想录 Leetcode429. N 叉树的层序遍历

题目&#xff1a; 代码(首刷自解 2024年1月24日&#xff09;&#xff1a; /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node() {}Node(int _val) {val _val;}Node(int _val, vector<Node*> _children) {val _val;childre…

在云服务器上通过FileZilla配置FTP(通过FileZilla配置FTP升级版)

有兴趣的读者可以看看博主的博客&#xff0c;有很全面的教程 阿里云之申请云服务器–配置jdk,tomcat,安全策略–能够在他人电脑上显示本电脑的Tomcat 通过FileZilla配置FTP 修改我们的安全组&#xff0c;将21&#xff0c;和50000-50010端口添加进去 加入实例即可&#xff0c;剩…

怎样使用CSS技术美化网页?(知识点2)

知识引入 引入CSS样式表 CSS提供了行内式、内嵌式、外链式、导入式四种引入方式&#xff0c;具体介绍如下。 行内式 行内式也被称为内联样式&#xff0c;是通过标签的style属性来设置标签的样式&#xff0c;其基本语法格式如下。 <标签名 style“属性&#xff1a;属性值…

Denoising diffusion implicit models 阅读笔记2

Denoising diffusion probabilistic models (DDPMs)从马尔科夫链中采样生成样本&#xff0c;需要迭代多次&#xff0c;速度较慢。Denoising diffusion implicit models (DDIMs)的提出是为了在复用DDPM训练的网络的前提下&#xff0c;加速采样过程。 加速采样的基本思路是&#…

Shell脚本⑤函数与数组

一.函数 封装的可重复利用的具有特定功能的代码 格式&#xff1a; 方法一&#xff1a; [function] 函数名 (){ 命令序列 [return x] #使用return或者exit可以显式的结束函数 } 方法二&#xff1a; 函数名(){ 命令序列 } 1.函数的调用方法 &#xff08;1&…

【Flink】记录Flink 任务单独设置配置文件而不使用集群默认配置的一次实践

前言 我们的大数据环境是 CDP 环境。该环境已经默认添加了Flink on Yarn 的客户端配置。 我们的 Flink 任务类型是 Flink on Yarn 的任务。 默认的配置文件是在 /etc/flink/conf 目录下。如今我们的需求是个别任务提供的配置仅用于配置执行参数&#xff0c;例如影响作业的配置…

python 基础知识点(蓝桥杯python科目个人复习计划24)

今日复习内容&#xff1a;基础算法中的模拟 1.模拟题 &#xff08;1&#xff09;定义&#xff1a;直接按照题目含义模拟即可&#xff0c;一般不涉及算法。 &#xff08;2&#xff09;注意&#xff1a;读懂题&#xff1a;理清楚题目流程&#xff1b; 代码和步骤一一对应&…

爷爷问:IPv6为什么还没有完全替换掉IPv4 ?区别是什么?

首先IPV6之所以提出&#xff0c;很大一部分原因是IPV4的地址不够用了&#xff0c;再出现新设备就没得地址分配&#xff0c;所以才会提出新的IP版本以满足分配需求。在对IPV6进行一个基本了解后来看看两者的区别。 IPV6基本了解 1.层次化的地址结构 地址长度为128bit&#xf…

鸿蒙ArkUI开发-实现增删Tab页签

场景介绍 部分应用在使用过程中需要自定义添加或删除标签的场景&#xff0c;比如在浏览器中的顶部标签栏中需要新打开或关闭网页页签&#xff0c;而这种场景与Tabs组件效果类似&#xff0c;但Tabs组件不提供增加或删除页签的功能&#xff0c;不能自由的增加删除页签&#xff0…

Java编程的利器:Pair和Triple无缝解决多值返回问题,助力编写高效代码

在实际编码中&#xff0c;经常会遇到一个方法需要返回多个值的情况&#xff0c;你编写一个方法&#xff0c;需要同时返回某个操作的结果和一些相关的附加信息。使用传统的方式&#xff0c;你可能需要创建一个包含这些信息的自定义类或者使用集合&#xff08;如 Map&#xff09;…