风变编程-python基础语法-第17关用python发邮件
liuian 2025-06-12 14:13 85 浏览
复习一下上一关的内容 ,模块的相关知识,以及学习模块的方法(2图)
得了,我们可以开始今天的项目实操了
1. 明确项目目标
这一关的主题,其实最早是来源于往期学员的一个问题:学员小贾是一名外贸人员,每到了节假日,要给客户发祝福邮件。
虽然现在群发邮件比较方便,但还是要每次手动添加收件人的邮箱。小贾想:要是能够自动发送邮件给这些人就好了。他找到了助教求助。
之前跟你聊过,希望学习Python知识,是能够帮助大家解决实际问题的。而小贾的问题,就是一个可以完美地被Python解决的需求,而且在职场中也是一个普遍存在的需求。
为了完成这个项目呢,我们要学会自学新的模块
2. 分解过程,拆解项目
我们可以把这个项目拆解成三个版本,各个版本功能逐步完善 。如图示
3. 逐步执行,代码实现
3.1 版本1.0:学习模块,发一封简单邮件
3.1.1搜索模块资料
在编程世界中,我们不需要什么知识都一把抓,而是遇到问题之后,产生了某种需求,才会去找对应的解决方案。
这个方案可能是某个模块,也可能是某个函数~
经过搜索大法后,我们可以知道需要实现这一版本的功能需要用到python的两个内置模块 smtplib,email
可以初步画一下这个简单的结构图 ,如图示
这里在搜索的时候跟你们说个技巧吧,比如你想要找到stmplib 这个 模块,那么你搜索‘stmplib python’,如果你英文足够好的话,那你可以去看官方文档,如果你只喜欢看中文的话,我建议你去这个网站去搜索资料 ‘CSDN博客’,这个网站上有最优秀和经验最丰富的码师可以交流,他们的很多博客也可以借鉴、参考。
这是我费了很大力气找到的smtplib的方法 ,如图示
我们可以看到,为了减少变量重复出现的次数,一般将 smtplib.SMTP() 赋值给server,我本身也认同这样的办法
这里给大家简单科普一下,SMTP (Simple Mail Transfer Protocol)翻译过来是“简单邮件传输协”的意思,SMTP 协议是由源服务器到目的地服务器传送邮件的一组规则。
可以简单理解为:我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器。
第四行代码,就是干这个工作的,连接(connect)指定的服务器。
host是指定连接的邮箱服务器,你可以指定服务器的域名。通过搜索“xx邮箱服务器地址”,就可以找到。
port 是“端口”的意思。端口属于计算机网络知识里的内容,你可以自行搜索了解,现在我们只要知道它是一个【整数】即可。
我们需要指定SMTP服务使用的端口号,一般情况下SMTP默认端口号为25。
风变编程官网的服务器名称是mail.forchange.tech,端口是587。
3.1.2 用QQ做案例讲解
因为一般二十几岁的年轻人使用最多的还是QQ邮箱,所以我会以QQ邮箱作为讲解例子
QQ 邮箱采用的加密方式是SSL,我们需要写成这样:如图示
然后接下来我要讲一个tips,其实我们一般qq邮箱默认是关闭SMTP服务的,你需要自行手动开启,进入你的QQ邮箱后,点击位于顶部的【设置】按钮,选择【账户设置】,进入到这个界面,如图示,蓝色方框的那个要保持开启,照着他的流程做便可以开启
成功开启以后,网页会给你一个授权码,把它保存下来,接下来的代码中,发邮件的时候用到的是授权码,而不是你的QQ密码了。它是4*4=16位的,也就是**** **** **** **** 这样的,还有不要随意泄露,不然的话可能会被癫佬拿去打广告。
好了,一步一步讲解代码
login是登录的意思,也就是登录你指定的服务器用的,需要输入两个参数:登录邮箱和授权码。如图示
把两个参数放在最前面。这部分的代码我们也可以写出来了:如图示
第六行代码sendmail是“发送邮件”的意思,是发送邮件用的,sendmail()方法需要三个参数:发件人,收件人和邮件内容。如图示
msg.as_string()是一个字符串类型:as_string()是将发送的信息msg变为字符串类型。最后一行代码,quit是“退出”的意思,就是退出服务器。
3.1.3 对smtplib 做一个初步总结,如图示
3.1.4 email 模块
email 模块:也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。如图示
每种形式对应的导入方式是这样的:如图示
这里再次给大家科普一下,
你可以复制上面的内容到本地的编辑器上,按住 ctrl 点击查看含义。
请你按住ctrl同时点击mime,你会看到一个名为init.py的空文件,这说明 email是其实是一个“包”。当然,并不是“包治百病”的那个“包”。
这就要谈到“模块”和“包”的区别了,模块(module)一般是一个文件,而包(package)是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。
但为什么看到那个空文件,就能知道email是包呢?这是因为Python中的包都必须默认包含一个init.py的文件。
init.py控制着包的导入行为。假如这个文件为空,那么我们仅仅导入包的话,就什么都做不了。所以直接import email是行不通的。
所以,我们就需要使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】。比如从email包下的text文件中引入MIMEText方法。中文说起来有点复杂,看代码就懂了:如图示
通过简单的学习,我们就能发现MIMEText()方法需要输入三个参数:文本内容,文本类型和文本编码。如图示
文本类型和文本编码,我们默认用'plain'和'utf-8'。文本内容,我就写一句最简单的“send by python”吧,你可以写自己想写的话啦。如图示
3.1.5综合两个模块的代码结构为,如图示
那么细致化结构接就是,如图示
3.1.6 那么版本1.0 的代码为,(带注释)两图
这里再给大家科普一下啊,就是如果你的python版本 是3.7 以上的,可能会报错,
ValueError: server_hostname cannot be an empty string or start with a leading dot.
因为Python 3.7修改了ssl.py,导致smtplib.SMTP_SSL也连带产生了问题。那你需要这样子做,如图示
经过九牛二虎之力,我终于是收到了人生第一封由python发来的QQ邮件,如图示
说实话,自己还感觉挺不可思议的
3.2 版本2.0:给自己发一封完整邮件
3.2.1 完整的邮件就是说,增加多两个功能,完善一下。如图示
我们要增加这几行代码,如图示
第一行代码,从email包引入Header()方法。Header()是用来构建邮件头的。标准邮件需要三个头部信息:From , To 和 Subject ,第三到五行代码就提供了这三个信息。这里我们可以自定义,比如from发件人邮箱地址,to收件人邮箱地址,主题“python test”。
等我们增加了邮件头的代码后,收到邮件会有所不同,如图示
而且你还可以定义,如图示
原本邮件内容是写在这里:如图示
如果你想要写很长的内容,建议先设置一个变量text用来放正文内容。如图示
3.2.2 所以版本2.0 的最终代码为,如图示(3图)
3.3 版本3.0:群发完整邮件
3.3.1 这里主要讲解一下,用python群发邮件的三种方法,如图示
一,是将收件人信箱的变量设置成一个可以装多个内容的列表:需要注意的是,to_addrs变量也将作为参数被传入Header方法中:
直接运行程序的话,这里就会发生错误:AttributeError: 'list' object has no attribute 'decode'。
我们要将to_addrs变成一个字符串,将列表变成一个字符串,这个时候我们就要用到join()函数了
一分钟回顾一下join()函数的用法,大家看案例代码 ,代码以及运行结果如图示
join()的用法是str.join(sequence)
二,接下来是while循环,代码以及运行结果如图示
三,将邮箱地址写入csv模块的方法是write(),步骤是:1.引入csv模块;2.提供需要写入csv文件的数据,3.建文件并写入。代码如图示
好了,关于python发邮件的全部知识就讲解到这了。
4. 1 第17关课后练习-自制二维码
练习介绍
练习目标
我们会通过今天的作业,学习一个新的模块:MyQR,制作一个动态二维码。
练习要求
在昨天的练习里,你已经可以通过自己的学习,完成代码的升级。
所以,今天我们不妨多做些新的尝试。
这次的练习,没有提示,没有准备好的网址。
需求很明确:请你在本地编辑器(如vscode、Pycharm),用 Python 制作一个动态二维码。
所以,请你运用在课堂上看到的提示和知识,去思考,去搜索,去学习,完成今天的练习。
代码实操
你应该已经知道了这个模块是:MyQR,也能读懂相关的代码。
请你自学相关模块知识后,自行下载一个gif,然后在本地编辑器(如vscode、Pycharm)完成代码吧。
因为系统里无法展示最后的动态二维码,当你在本地编辑器完成代码并运行成功后,直接点击右侧的运行进入下一步即可。
对了,不要忘了先安装myqr模块,Windows终端里运行'pip install myqr',Mac终端运行'pip3 install myqr'
示例代码以及运行结果如图示(2图)
这个生成的二维码就是风变编程官网的链接
4.2 进阶练习-绝对值得多种求法
练习介绍
练习目标:
通过这个练习,你至少可以用3种方法去求某个数的绝对值。
练习要求:
请你通过搜索和步骤中的提示,用不同的方法求绝对值。
建议将其封装成函数,如“abs_value1()”。
——Directly made by 潜·2·index-crossing
相关推荐
- 教你把多个视频合并成一个视频的方法
-
一.情况介绍当你有一个m3u8文件和一个目录,目录中有连续的视频片段,这些片段可以连成一段完整的视频。m3u8文件打开后像这样:m3u8文件,可以理解为播放列表,里面是播放视频片段的顺序。视频片段像这...
- 零代码编程:用kimichat合并一个文件夹下的多个文件
-
一个文件夹里面有很多个srt字幕文件,如何借助kimichat来自动批量合并呢?在kimichat对话框中输入提示词:你是一个Python编程专家,完成如下的编程任务:这个文件夹:D:\downloa...
- Java APT_java APT 生成代码
-
JavaAPT(AnnotationProcessingTool)是一种在Java编译阶段处理注解的工具。APT会在编译阶段扫描源代码中的注解,并根据这些注解生成代码、资源文件或其他输出,...
- Unit Runtime:一键运行 AI 生成的代码,或许将成为你的复制 + 粘贴神器
-
在我们构建了UnitMesh架构之后,以及对应的demo之后,便着手于实现UnitMesh架构。于是,我们就继续开始UnitRuntime,以用于直接运行AI生成的代码。PS:...
- 挣脱臃肿的枷锁:为什么说Vert.x是Java开发者手中的一柄利剑?
-
如果你是一名Java开发者,那么你的职业生涯几乎无法避开Spring。它如同一位德高望重的老国王,统治着企业级应用开发的大片疆土。SpringBoot的约定大于配置、SpringCloud的微服务...
- 五年后,谷歌还在全力以赴发展 Kotlin
-
作者|FredericLardinois译者|Sambodhi策划|Tina自2017年谷歌I/O全球开发者大会上,谷歌首次宣布将Kotlin(JetBrains开发的Ja...
- kotlin和java开发哪个好,优缺点对比
-
Kotlin和Java都是常见的编程语言,它们有各自的优缺点。Kotlin的优点:简洁:Kotlin程序相对于Java程序更简洁,可以减少代码量。安全:Kotlin在类型系统和空值安全...
- 移动端架构模式全景解析:从MVC到MVVM,如何选择最佳设计方案?
-
掌握不同架构模式的精髓,是构建可维护、可测试且高效移动应用的关键。在移动应用开发中,选择合适的软件架构模式对项目的可维护性、可测试性和团队协作效率至关重要。随着应用复杂度的增加,一个良好的架构能够帮助...
- 颜值非常高的XShell替代工具Termora,不一样的使用体验!
-
Termora是一款面向开发者和运维人员的跨平台SSH终端与文件管理工具,支持Windows、macOS及Linux系统,通过一体化界面简化远程服务器管理流程。其核心定位是解决多平台环境下远程连接、文...
- 预处理的底层原理和预处理编译运行异常的解决方案
-
若文章对您有帮助,欢迎关注程序员小迷。助您在编程路上越走越好![Mac-10.7.1LionIntel-based]Q:预处理到底干了什么事情?A:预处理,顾名思义,预先做的处理。源代码中...
- 为“架构”再建个模:如何用代码描述软件架构?
-
在架构治理平台ArchGuard中,为了实现对架构的治理,我们需要代码+模型描述所要处理的内容和数据。所以,在ArchGuard中,我们有了代码的模型、依赖的模型、变更的模型等,剩下的两个...
- 深度解析:Google Gemma 3n —— 移动优先的轻量多模态大模型
-
2025年6月,Google正式发布了Gemma3n,这是一款能够在2GB内存环境下运行的轻量级多模态大模型。它延续了Gemma家族的开源基因,同时在架构设计上大幅优化,目标是让...
- 比分网开发技术栈与功能详解_比分网有哪些
-
一、核心功能模块一个基本的比分网通常包含以下模块:首页/总览实时比分看板:滚动展示所有正在进行的比赛,包含比分、比赛时间、红黄牌等关键信息。热门赛事/焦点战:突出显示重要的、关注度高的比赛。赛事导航...
- 设计模式之-生成器_一键生成设计
-
一、【概念定义】——“分步构建复杂对象,隐藏创建细节”生成器模式(BuilderPattern):一种“分步构建型”创建型设计模式,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建...
- 构建第一个 Kotlin Android 应用_kotlin简介
-
第一步:安装AndroidStudio(推荐IDE)AndroidStudio是官方推荐的Android开发集成开发环境(IDE),内置对Kotlin的完整支持。1.下载And...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)