当前位置: 首页 > news >正文

用Python发送电子邮件?这也太丝滑了吧(21)

小朋友们好,大朋友们好!

我是猫妹,一名爱上Python编程的小学生。

欢迎和猫妹一起,趣味学Python。

今日主题

猫爸赚钱养家,细想起来真的不容易啊!

起早贪黑,都是6点早起做早饭,送我到学校后,匆匆忙忙去上班,下班忙起来时也不得不披星戴月。

有句话咋说的?

起得比鸡早,睡得比狗晚。

世人慌慌张张,不过图碎银几两,偏偏这碎银几两,能解世间惆怅。

可让父母晚年安康,呵护幼子成长入学堂。

他的工资条长这样:

猫爸自己也常常纳闷,工资条是通过邮件发送的,里面有文字和图片。

如果不小心发错怎么办?

比如把张三的工资条贴到了李四的邮件里。

这应该是程序实现的发送邮件吧?

我猜是,你呢?

咱们今天的主题就是如何用Python发送邮件,完全可以实现类似效果。

电子邮件email

电子邮件又叫email,它是一种用电子手段提供信息交换的通信方式。

通过网络的电子邮件系统,用户可以以非常低廉的价格(不管发送到哪里,都只需负担网费)、非常快速的方式(几秒钟之内可以发送到世界上任何指定的目的地),与世界上任何一个角落的网络用户联系。

电子邮件可以是文字、图像、声音等多种形式。

同时,用户可以得到大量免费的新闻、专题邮件,并轻松实现轻松的信息搜索。

咱们今天实现以下三个功能:

  • 发送纯文本格式邮件

  • 发送HTML格式邮件

  • 发送带附件的邮件

在学习之前,需要准备两个邮箱。

这两个电子邮箱,不要属于同一家邮件服务商。

比如(和猫妹学Python)准备一个QQ邮箱、一个163邮箱。

163邮箱设置

对于163电子邮箱,需要设置客户端授权密码,不然邮件会发送失败。

具体看以下截图,如果版本有差异,操作方式也是类似的。

开启IMAP/SMTP服务

开启POP3/SMTP服务

什么是SMTP

SMTP,Simple Mail Transfer Protocol,简单邮件传输协议,一种提供可靠且有效的电子邮件传输的协议。

SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。

我们不需要了解SMTP具体实现,只要会使用它就可以了。

毕竟,我们目标不是开发一套电子邮件系统,而是如果用Python来发送邮件。

smtplib

Python之所以强大,之所以被称为胶水语言。

就是因为它有许多现成的模块,可以拿来就用,简单,高效。

Python提供了smtplib模块,可以用它来发邮件。

一般需要四个步骤:

  1. 连接服务器

  2. 登录服务器

  3. 发送邮件

  4. 退出服务器

第1步

smtplib.SMTP创建一个SMTP对象。

host是服务器主机IP或域名,port是端口号。

每个公司的邮件服务商和端口号都可以不同,可以在网上查询下。

smtplib.SMTP可以用smtplib.SMTP_SSL替换。

smtplib.SMTP,非SSL端口,不加密。

smtplib.SMTP_SSL,SSL端口,加密。

建议使用smtplib.SMTP_SSL,更加安全。

smtp.ehlo()表示向服务器进行反馈,反馈成功后就表示可以登录服务器了。

第2步

登录服务器

smtp.login(sender, pwd)

sender就是登录邮箱名

pwd就是密码

第3步

发送邮件

smtp.sendmail(sender, receiver, message)

sender表示发送者的邮箱

receiver表示接收者的邮箱

message邮件内容

第4步

退出服务器

smtp.quit()

发送纯文本格式邮件

代码和效果如下图:

1~3:导入smtplib模块,并引入MIMEText和Header。

这两个类是用来构建邮件内容的。

它们都属于email模块。

要想用Python发邮件,需要用到stmplib模块和email模块。

stmplib用来发送邮件。

email用来构建邮件内容。

6~7:输入邮箱账户名和密码,这里的密码不是邮件的密码,而是授权密码,当在设置smtp时会看到。

10:接收邮件的邮箱地址,它是列表,如果同时发送多个人,这里可以多设置几个地址。

11~14:填充邮件内容。

MIMEText一共有三个参数:

  • 邮件正文,如果内容较多,可以多行。

  • 邮件类型,plain表示纯文本。

  • 邮件编码,一般是utf-8。

17~24:采用try except实现异常处理,如果有报错,网上搜索下原因。

发送HTML格式邮件

万事开头难,有了发送纯文本邮件的经验。

再发送HTML格式邮件,就简单多了。

格式:

message=MIMEText("正文内容","html","utf-8")

发送带附件的邮件

如果想要在邮件中添加附件怎么办?

带附件的邮=邮件正文+各个附件

邮件正文使用的是MIMEText,附件呢?

一般使用的是MIMEApplication对象,然后再使用一个MIMEMultipart对象把两个对象包含进去就可以了。

MIMEMultipart=MIMEText+MIMEApplication

还记得我们之前学习的文件操作吗?

文件分为文本文件和二进制文件。

那么附件有没有类型呢?

有的,也分为文本类型和其他类型。

文本类型附件语法

message=MIMEMultipart()实例化一个MIMEMultipart对象。

MIMEText()实例化一个MIMEText对象,三个参数含义为读取文件内容、网络传输编码方式、unicode编码方式。

open这句代码表示打开文件并读取文件,rb表示二进制模式打开一个只读文件。

它等同于下面两句代码:

file=open(r"文件路径","rb")

txt=file.read()

atta["Content-Tpye"]和atta["Content-Disposition"]是固定的,暂时不需要关心其具体含义。

只需要知道,这两句代码等同于如下:

atta.add_header("Content-Type", "application/octet-stream")

atta.add_header("Content-Disposition", "attachment; filename='文件名'")

message.attach(atta)表示把上述附件添加到邮件附件中。

如果附件中有中文,可能有乱码。

atta.add_header("Content-Disposition", "attachment", filename=("test"))

可以改为

atta.add_header("Content-Disposition", "attachment", filename=("gbk","","test"))

文本类型附件语法

当附件为其他类型(如pdf、xlsx、zip、mp3等)时,我们需要用到email模块的两个类:MIMEMultipart类和MIMEApplication类。

语法:

MIMEApplication用于实例化一个MIMEApplication对象,有一个参数,用于读取文件内容。

atta.add_header()表示调用MIMEApplication对象的add_header方法。

最后,使用MIMEMultipart对象的attach将附件添加到MIMEApplication对象中。

为什么用编程方式发送邮件

如果要发100封邮件怎么办?

编程可以批量、高效,你觉得呢?

好了,我们今天就学到这里吧!

如果遇到什么问题,咱们多多交流,共同解决。

我是猫妹,咱们下次见!

相关文章:

用Python发送电子邮件?这也太丝滑了吧(21)

小朋友们好,大朋友们好! 我是猫妹,一名爱上Python编程的小学生。 欢迎和猫妹一起,趣味学Python。 今日主题 猫爸赚钱养家,细想起来真的不容易啊! 起早贪黑,都是6点早起做早饭,送…...

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测

分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测 目录分类预测 | MATLAB实现CNN-GRU-Attention多输入分类预测分类效果模型描述程序设计参考资料分类效果 模型描述 Matlab实现CNN-GRU-Attention多变量分类预测 1.data为数据集,格式为excel,12个输…...

C++提高编程(1)

C提高编程1.模板1.1模板的概念1.2函数模板1.2.1函数模板语法1.2.2函数模板注意事项1.2.3函数模板案例1.2.4普通函数与函数模板的区别1.2.5普通函数与函数模板的调用规则1.2.6模板的局限性1.3类模板1.3.1类模板语法1.3.2类模板和函数模板区别1.3.3类模板中成员函数创建时机1.3.4…...

day26 回溯算法的部分总结

回溯算法的部分总结 回溯算法是一种常用于解决排列组合问题、搜索问题的算法,它的基本思想是将问题的解空间转化为一棵树,通过深度优先搜索的方式遍历树上的所有节点,找到符合条件的解。回溯算法通常使用递归实现,每次递归时传入…...

带你玩转Python爬虫(胆小者勿进)千万别做坏事·······

这节课很危险,哈哈哈哈,逗你们玩的 目录 写在前面 1 了解robots.txt 1.1 基础理解 1.2 使用robots.txt 2 Cookie 2.1 两种cookie处理方式 3 常用爬虫方法 3.1 bs4 3.1.1 基础介绍 3.1.2 bs4使用 3.1.2 使用例子 3.2 xpath 3.2.1 xpath基础介…...

【JavaScript 】严格模式,With关键字,测试框架介绍,assert

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录静态类型语言弱类型严格模式将过失错误转化为异常简化变量的使用With测试框架try-catch选择性捕获…...

mybatis实现一个简单的CRUD功能的小案例(后端)编写流程

下面是一个使用mybatis实现增删改查功能的示例程序: 1.创建一个数据库 首先需要创建一个名为test_db的数据库,里面包含一个名为user_info的表,其中包含id、name、age三个字段。 2.配置mybatis 在项目的pom.xml文件中添加mybatis和mysql依…...

腾讯云轻量应用服务器价格表(2023版)

2023腾讯云轻量应用服务器2核2G4M带宽88元一年、2核4G6M带宽159元/年、4核8G10M优惠价425元、8核16G14M价格1249、16核32G20M服务器2499元一年,今天分享2023腾讯云服务器配置及精准报价。 腾讯云轻量应用服务器优惠价格表 腾讯云服务器分为轻量应用服务器和云服务器…...

网络层IP协议和数据链路层

目录IP协议协议头格式分片网段划分特殊的IP地址IP地址的数量限制NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器私有IP地址和公网IP地址路由路由表生成算法数据链路层认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMTU对IP协议的影响MT…...

零基础学习Java 03

目录 数组 动态初始化数组 静态初始化 数组的应用 数组两种典型的异常 length关键字求出数组的长度 数组遍历在IDEA中输出快捷语句 对象数组 数组的遍历:foreach方法 二维数组 枚举(enum) 数组 1在方法中可以返回一个数组,但是在定义方法时类型要…...

PG数据库超时退出 TCP设定

数据库在使用psql工具以及jdbc进行远程连接时,在经过一定时间之后报错-致命错误: terminating connection due to client no input timeout。 排查安全参数,hg_clientnoinput 0; 问题原因 操作系统TCP相关参数设置不正确&…...

每日学术速递4.4

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CL 1.Baize: An Open-Source Chat Model with Parameter-Efficient Tuning on Self-Chat Data 标题:Baize:一种对自聊天数据进行参数高效调优的开源聊天模型 作者…...

ChatGPT将引发大量而普遍的网络安全隐患

ChatGPT是一个基于人工智能的语言生成模型,它可以在任何给定的时间,使用自然语言生成技术,生成文本、对话和文章。它不仅可以被用来编写文本,还可以用来编写语言、生成图像和视频。目前, ChatGPT已广泛应用于语言翻译、…...

购买学生护眼台灯几瓦最好?有哪些推荐护眼灯

现今的近视已然成为普遍现象,而且有往低年龄段发展的趋势。究其原因,长期使用电子设备是一方面,还是就是我们日常工作、学习、生活没有很好的护眼环境,很多时候我们不经意的错误习惯,久而久之就有可能诱发近视。对孩子…...

什么是 SYN 攻击?如何避免 SYN 攻击?

SYN 攻击方式最直接的表现就会把 TCP 半连接队列打满,这样当 TCP 半连接队列满了,后续再在收到 SYN 报文就会丢弃,导致客户端无法和服务端建立连接。 避免 SYN 攻击方式,可以有以下四种方法: 调大 netdev_max_backlo…...

数据分析练习——学习一般分析步骤

目录 一、准备工作 二、导入库和数据 1、导入必要的库: 2、模拟数据 三、数据分析过程 1、读取数据: 2、数据概览和描述性统计: 2.1、查看数据概览: 2.2、查看描述性统计: 3、数据清洗: 3.1、处…...

Linux环境下挂载exfat格式U盘,以及安装exfat文件系统

目录Linux一般支持的文件系统有:1.安装exfat软件安装工具环境以及exfat件依赖的系统软件下载exfat源码包并安装2.挂载exfat格式U盘查看U盘在那个目录执行挂载命令Linux一般支持的文件系统有: 文件系统名称详情ext专门为Linux核心做的第一个文件系统&…...

网格布局grid

grid网格定义 css网格是一个用于web的二维(行和列的组合)布局,利用网格,你可以把内容按照行和列的格式进行排版,另外,可以轻松的实现复杂布局。 1.定义网格和fr单位 1.1定义网格 在父元素加上&#xff…...

《扬帆优配》环境更优!这类资金,迎利好!

近来,第一批主板注册制新股连续发动申购,网下询价中,组织出资者频繁现身打新商场,公募基金、社保基金、养老金、保险资金等中长时间资金,成为全面注册制下新股发行商场的重要参加者。 多位业内人士对此表明&#xff0c…...

RK3568平台开发系列讲解(内存篇)内存管理的相关结构体

🚀返回专栏总目录 文章目录 一、硬件架构二、Linux 物理内存管理结构体沉淀、分享、成长,让自己和他人都能有所收获!😄 📢应用程序想要使用内存,必须得先找操作系统申请,我们有必要先了解一下 Linux 内核怎么来管理内存,这样再去分析应用程序的内存管理细节的时候,…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...