自动化发送邮件

article/2025/10/4 23:37:51

自动化发送邮件

  • 自动化发送邮件
    • 背景
    • SMTP了解一下
    • 邮件系统
    • 实现过程
      • 1.连接建立
      • 2.邮件传输
      • 3.连接释放
      • 4.注意项目
    • 信息格式
    • MIME新增关键字
    • multipart
    • 自动发邮件
      • 构建过程
    • 封装代码
    • 必要的设置

背景

室友选修的《机器学习》,结课作业是对8万+的数据进行分析。他向我抱怨,说这么多数据至少得运算半个多小时,还得语法逻辑不出错,不然得重来。
“总不能守着电脑吧,想出去玩,又拿不准程序准确结束时间。”
我想python作为编程界的万金油,几乎不存在它不能染指的地方。所以有了以下基于smtp协议、利用python自带模块email,smtplib实现自动化发送邮件的代码。

SMTP了解一下

有必要简单了解一下SMTP的概念,可以加深对代码的理解。

所以什么是SMTP呢?
SMTP是简单邮件传输协议,不过只能传送可打印的7位ASCII码邮件,这样存在过大的局限性。于是后来有了MIME,即通用互联网邮件扩充。MIME在邮件首部中说明了邮件的数据类型(如文本,声音,图像,视像等),且通过MIME邮件可以同时传送多种类型的数据(附件)。

邮件系统

一个邮件系统应该具有三个主要组成构建。用户代理、邮件服务器,邮件发送协议(SMTP)和邮件读取协议(POP3,又:邮局协议)
这里写图片描述

实现过程

1.连接建立

SMTP客户端(发送方的邮件服务器)每隔一定时间对邮件缓存扫描,如果发现有邮件,就用25端口与接收方的SMTP服务器建立TCP连接。连接建立后,接收方服务器发出“服务就绪”,SMTP客户端向SMTP服务器发送HELO命令,附上发送方的主机名。SMTP服务器如果有能力接受邮件,就回复“250”(OK),如果服务不可用回复“421”。

2.邮件传输

3.连接释放

邮件发送完毕后,SMTP客户发送QUIT命令。SMTP服务器返回“221”(服务关闭),表示同意释放TCP连接。邮件传输过程结果。

4.注意项目

1. SMTP不使用中间邮件服务器,一定是发送方服务器到接收方服务器
2. 为什么要通过邮件服务器而不是直接发送方用户代理–>接收方用户代理呢?原因很简单,被人给你发送邮件的时候你并不一定在

信息格式

一个邮件分为信封内容两大部分,内容包含首部主体
1. 首部(header),有规定格式,比较重要有以下:
“To” 接收方邮件地址
“Subject” 邮件主题
“From” 发送方邮件地址
2. 主体(body),允许用户自由撰写

MIME新增关键字

  1. MIME-Version:标志MIME的版本
  2. Content-Description:可读字符串,说明邮件主体是否是图像、音频或视频
  3. Content-Id:邮件的唯一标识符
  4. Content-Transfer-Encoding:传送邮件时邮件的主体是如何编码的(常用三种编码:ASCII,quoted-printable,base64)
  5. Content-Type:说明邮件主体的数据类型和子类型。MIME规定Content-Type必须含有两个标识符,即类型子类型,中间中“/”分开(举例:text/plain)
  6. Content-Disposition:disposition-type;disposition-parm 参数意义:disposition-type表示以什么方式下载(通常值为attachment,即以附件形式下载);disposition-parm表示文件保存的默认名

multipart

  1. 邮件主体的数据类型之一,表示多种类型的组合(只介绍这一个数据类型是因为,后面会基于这个类型用python实现)
  2. 常用子类型:mixed,表示允许单个报文含有多个相互独立的子报文(理解邮件中的“附件”概念)
  3. boundary关键字,定义分隔报文各部分所用的字符串(邮件系统定义,用户不用关心)

自动发邮件

有了以上对SMTP知识简单的梳理之后,就可以很容易理解后面的代码。而这里我是通过登陆自己的邮箱来实现发送邮件,这样做的目的是:如果不登陆自己的邮箱,发送出去的邮件很容易被误认为垃圾邮件,或是被屏蔽,或是在垃圾箱,接收方不能及时收取。

python内置两个模块,email和smtplib,前者负责构建一封邮件,后者实现发送

构建过程

基于python创建一封邮件,使用的是email模块,我会用不严谨、但尽可能生动的语言来解释对象的内置方法

from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMETextaLetter = MIMEMultipart() #实例化“一个包裹”
# attach(),往包裹里面放东西
# MIMEText()可以看做一封信,第一个参数表示内容,第二个表示类型,第三个表示编码格式
aLetter.attach(MIMEText("hello,what are you doing?", "plain", "utf-8")) 
# 在“包裹”上写上发给谁(to),发的什么(subject),谁发的(from)
aLetter["To"] = "xxxxx@qq.com"
aLetter["Subject"] = "Make A Friend"
aLetter["From"] = "myemail@qq.com"# 实例化一封附加信
attachment = MIMEText("i miss you,and you?", "plain", "utf-8")
# 说明邮件数据的主题类型和子类型
attachment["Content-Type"] = "text/plain"
# 以附件形式下载,默认文件名为happy.txt
attachment["Content-Disposition"] = "attachment;filename=happy.txt"
# 将附加信丢入包裹中
aLetter.attach(attachment)print(aLetter) # 打印输出效果

于是有了下面一个“包裹”
这里写图片描述


有了包裹,就需要邮寄出去,这里需要用到smtplib模块来发送邮件,流程如下:
这里写图片描述

# 实例化一个smtp对象
smtp = smtplib.SMTP_SSL()
# 连接邮件服务器
smtp.connect("smtp.qq.com")
# 登陆自己的邮箱
smtp.login("578******@qq.com", "htn******cga")
# 发送邮件
smtp.sendmail("578******@qq.com", "gu******995@163.com", aLetter.as_string())
# 退出连接
smtp.quit()

如此就是一个完整的发送邮件的过程
这里写图片描述

封装代码

为了更高效的利用代码,为了使代码具有更好的扩展性,利用面向对象的思想来封装代码自然是不可少的。

这里写图片描述
首先我写了一个AutoEmail的父类,其下有6个方法,依次对应:登陆信息,发送信息,生成邮件,生成附件,发送邮件,选择服务器。
由于网易163邮箱和QQ邮箱连接的服务器不同,前者“smtp.163.com”,后者“smtp.qq.com”,且网易针对smtplib.SMTP()实例化对象,而QQ邮箱需要针对smtp.SMTP_SSL()

当然,为了对用户更友好,这里我写了两个派生类来继承AutoEmail。
这里写图片描述

父类的choose_server()方法,通过区分实例化对象的类名,来提供相对应的方法
这里写图片描述

获取实例化对象的类名:__class__.__name__
这里写图片描述

必要的设置

  1. 如果是网易邮箱
    这里写图片描述

  2. 如果是QQ邮箱
    这里写图片描述
    这里写图片描述

代码中的邮箱密码,不是邮箱的真实代码,而是授权密码。

完整代码请查看GitHub


http://chatgpt.dhexx.cn/article/CEQquyWB.shtml

相关文章

利用Python自动发送邮件

自动发送邮件 我们把报表做出来以后一般都是需要发给别人查看,对于一些每天需要发的报表或者是需要一次发送多份的报表,这个时候可以考虑借助Python来自动发送邮件。 使用邮箱的第一步 一般我们在使用QQ邮箱、163邮箱、126邮箱等这些比较常用的邮箱时…

Java实现发送邮件(定时自动发送邮件)

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 该系列文章持续更新,更多的文章请点击我的主页查看哦! 文章目录 目录 系列文章目录 文章目录 前言 一…

使用Excel和OutLook实现自动发送邮件

参考我的资源: https://download.csdn.net/download/paul50060049/11805973 问题的产生 我们在平时工作中可能会遇到要批量发送邮件的工作,例如财务部根据每个人的工资情况发放工资条到个人的邮箱,因为邮件因人而异,所以需要完成大量而细致…

Python实现自动发送邮件

最近比较闲的慌,在自己学习Python爬虫,学到了用Python发送邮件,觉得这个可能以后比较实用。以下项目用QQ邮箱为例。 需要用到的模块: smtplib,email 提醒!QQ 邮箱一般默认关闭SMTP服务,我们得…

python自动发送邮件实现

目录 1 前言2 准备工作2.1 电子邮件的基础知识。2.2 python邮件库2.3 邮箱设置 3 python实现邮件自动发送3.1 SMTP()和send()方法介绍3.2 python实现实例 参考信息 1 前言 python功能强大,可以实现我们日常办公的很多任务。诸如批量处理word,excel,pdf等等文件&…

Python自动化小技巧14——自动批量发送邮件(带各种附件)

案例背景 我的博客下面评论都是各种要数据的......一个一个发其实很浪费时间的,每次输入评论者的邮箱,然后打开数据所在的文件夹,上传,填写标题正文,发送....... 一模一样的流程,所以这种重复性的劳动肯定…

【Python 】20行代码,实现自动发送邮件

快下班了,今天给大家分享一下,平常我都是怎么发送电子邮件,这个方法能够帮助大家提高工作效率、,摆脱繁重的重复性工作。一般我都会借用Python来实现自动化邮件发送,相信你用过这个方法之后就会爱上它。(资…

Python 自动发送邮件实战案例,人人都可以学会

自动发送邮件能应用于许多场景,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了。为什么不把这一套流程放到服务器上,然后到点自动运行并发送邮件呢&#xf…

干货 | 解放双手,用Python实现自动发送邮件

使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,节省非常多的时间。 Python有两个内置库:smtplib和email,能够实现邮件功能,smtplib库负责发送邮件,email库负责构造邮件格式和内容。 邮件发…

小区物业管理系统设计与开发论文

目录 第1章 需求规格说明书... 1 1.1 目的... 1 1.2 系统概述... 1 1.3 系统总体功能描述... 1 1.4 运行环境... 2 1.5 系统角色分工... 2 1.5.1xxx模块功能描述.. 4 1.5.2 xxx模块功能描述.. 5 1.5.3 xxx模块功能描述... 5 1.5.4 xxx模块功能描述... 6 第2章 系统设计说明书..…

基于安卓 android studio的考试APP开发设计 前台和后台管理系统

一 项目概述 考试APP系统分为前台APP端和后台管理系统,前台APP可以注册,登录,试卷列表,开始测试,个人中心,试卷打分,试题解析,退出系统,后台管理系统 主要有 老师注册 登…

产品开发的组织架构和开发管理

摘要:产品开发的组织架构和产品开发过程管理是一个软件企业开发管理的两个侧面,开发组织架构指软件项目的立项和项目开发有效的人员调配和组织,开发过程管理指在项目确定后,软件开发过程的管理。本文根据作者在建立软件企业管理体…

图书馆管理系统的开发

课程设计的目的与要求 课程设计目的软件工程课程设计是学习软件工程课程后所进行的实践环节,目的是培养学生用工程化的思想和标准文档化的思想进行软件开发。本次课程设计通过开发一个小型实用的软件系统,亲身体验软件生命周期中的各个环节,以加深对软件工程课程的深入理解、…

微信小程序 一键授权 给第三方平台代开发管理(一,创建第三方平台)

不是重点,可以忽略: 本人 七月的胜利。代表七月份我出生啦,嘻嘻 博客就是平常记录一些常用到的开发常用到的技术,方法等,看见好东西了就自己整理一下防止以后自己遇到了再找不到。 如果有幸帮到你,欢迎点赞…

使用go语言开发运维管理平台

前言 经过对go语言的一段时间学习,打算实践一下,正好公司缺个运维平台,于是我就对Zeus二次开发,完成了一个初步的效果,在这里分享给大家,大家有什么建议可以提出来哈,一起进步 采用技术 前端&am…

微信小程序云开发实践--搭建一个管理小程序

概述 : 开发者可以使用云开发开发微信小程序、小游戏,无需搭建服务器,即可使用云端能力。 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即…

基于Servlet+jsp+mysql开发javaWeb学生成绩管理系统

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,或者没有积分想获取项目,欢迎指教: 企鹅:869192208 文章目录 一、开发背景二、 需求分析三、开发环境四、运行效果五、开发流程工程目…

用Django半天时间开发一个员工管理系统实例教程分享

熟悉python的朋友都知道,django简直是web开发领域的一个大杀器。 请求、模板、ORM、admin 都自带,程序员可以很轻松的开发出一个网站或者管理系统。 今天小编给大家分享一个超简单的员工管理系统 源码地址: https://github.com/newpanjin…

微信小程序云开发-内容管理系统(CMS)小案例

一、前言 最近有朋友问到如何在CMS上实现审核小程序端提交的数据,例如发布的内容审核,订单审核等等。因而出一篇小案例。 二、原理说明 这个由腾讯开源的这个内容管理系统,实际上就是对于云开发数据库的可视化操作(又或者说其实…