风变编程-python基础语法-第17关用python发邮件
liuian 2025-06-12 14:13 6 浏览
复习一下上一关的内容 ,模块的相关知识,以及学习模块的方法(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
相关推荐
- 办公小技巧:定时提醒不慌张 Excel制作智能提醒器
-
平时工作或学习中总有许多事情需要提醒,比如参加高考的日子、女友的生日、每周例会等。我们可以利用Excel的函数制作实用的智能提醒器,就不用担心忽略这些重要的日子了。每周例会轻松提醒公司规定每个月的最后...
- 使用vba将Excel 文件转成 CSV 文件
-
使用vba将Excel中的内容写入文本文件,保存为txt或csv格式。方法一:SubtoCSV()DimshtAsWorksheetDimiAsInteger,j...
- 用Excel编写俄罗斯方块(vb做俄罗斯方块)
-
看到这个题目,想必你一定会感到非常惊讶,什么,Excel居然能开发游戏?没错,Excel的强大取决于使用者,遇强则强,遇弱则弱。但我这篇文章并不是为了展示Excel使用过程中的奇技淫巧,而是主要写给那...
- 该死的手抄滚开(该死的手抄滚开表情包)
-
碰到形式主义惯犯或硬拔存在感的,顶不住要手抄怎么办?电脑时代这一切都不是问题,除了纸张背面少点中性笔划下的凸痕。网络上有大量的手写体,比较大众化(就是丑)的有李国夫手写体、陈静的字体、萌妹子等,我们也...
- Excel二维表转换一维表,三种方法一网打尽!
-
今天高顿网校小编向大家分享二维表格转一维表的三种方法,分别用到函数、数据透视表和VBA代码。三种方法各有利弊,表亲可以自行选择。如下图,A1:E5是数据源,A7:C22是最终要实现的结果样式:一起动手...
- PMC用到的所有函数,大咖总结,实用干货,PMC必备神器!
-
PMC用到的所有函数你和PMC大咖之间的差异,就是这些Excel函数!1.PMC日常用到的所有函数如下,大咖总结,实用干货,PMC必备神器!每个函数都有实例讲解,不怕你不会。序号PMC工作需求EXCE...
- Excel VBA应用-13:统计业务员业绩,目标完成率分析表
-
在评价业务员销售业绩时,往往会给业务员设定销售目标,根据实际业务计算业务员的目标完成率。报表格式如下图:要计算目标完成率,首先要有销售目标的数据,可以在Excel表中建立一个销售目标表,这种方式的好处...
- VBA高级应用30例应用2实现在列表框内及列表框间实现数据拖动
-
《VBA高级应用30例》(版权10178985),是我推出的第十套教程,教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开,这套教程案例与理论结合,紧贴“实战”,并做“战术总结”,以便大家能...
- 技术分析:一款流行的VBA宏病毒(vba宏是什么)
-
1.通过邮件传播的宏病毒近期流行的一个宏病毒通过邮件进行传播,捕捉到的一个样本,其邮件头如下:邮件的内容是这样子的(为节省篇幅,省略号处省略部分内容):YourbillsummaryAccount...
- Excel规划求解怎么用?最简单的3*3不同数字填充技...
-
Excel有什么样的功能,它到底有多强大?Excel表格中有函数公式、图表、操作技巧、vba操作等不同类型的使用方法,但还有一种更加重要的用法就是数据分析,需要用到的就是我们的Excel规划求解。规划...
- excel vba vb.net考勤时间处理通用方法(2)
-
接上期:excelvbavb.net考勤时间处理通用方法(1)DimstartTicksAsIntegerstartTicks=My.Computer.Clock.Ti...
- aardio + VBA ( Excel ) 快速开发,3 分钟可入门
-
aardio很小,下载就可以使用,没有任何复杂步骤。aardio与ExcelVBA(兼容WPSJSA)可以相互调用函数,不需要任何复杂的封装。3分钟够用,下面开始:一、aardio...
- VBA+SQL实战:根据时间智能匹配比赛场次,获取最近3场比赛数据
-
“每天有大量比赛数据,如何快速判断某时间属于哪一场比赛,并自动获取最近3场记录?”本文介绍VBA和SQL双方案,实现:自动匹配时间所属场次(如“第一场/第二场/第三场”)智能返回最近3场比赛数据(跨...
- Excel VBA 每天一段代码:自定义分页函数
-
3月12日视频《ExcelVBA网友答疑:ActiveX控件实现数据分页、翻页》中,我自定义了函数窗体数据查询(),现将代码公布如下:参数说明:1、ItemNum每页显示的数据数量(由复合框下...
- VBA布尔矩阵筛选在财会场景的六大高阶应用
-
基于内存位运算与矩阵预编译技术,布尔矩阵可大幅提升财务数据处理效率。以下是针对2025年财务自动化需求的创新实践案例,覆盖审计、税务、合并报表等核心场景:1.多维度税务异常检测场景:在500万条交易...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
- 标签列表
-
- 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)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)