风变编程-python基础语法-第17关用python发邮件
liuian 2025-06-12 14:13 105 浏览
复习一下上一关的内容 ,模块的相关知识,以及学习模块的方法(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
相关推荐
- 搭建一个20人的办公网络(适用于20多人的小型办公网络环境)
-
楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...
- 笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)
-
1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...
- 汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)
-
使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...
- xpsp3安装版系统下载(windowsxpsp3安装教程)
-
xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...
- 没有备份的手机数据怎么恢复
-
手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。 2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。 3、...
- 电脑怎么激活windows11专业版
-
win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...
- 华为手机助手下载官网(华为手机助手app下载专区)
-
华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...
- 光纤线断了怎么接(宽带光纤线断了怎么接)
-
宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...
- win7旗舰版和专业版区别(win7旗舰版跟专业版)
-
1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...
- 万能连接钥匙(万能wifi连接钥匙下载)
-
1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...
- 雨林木风音乐叫什么(雨林木风是啥)
-
雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...
- aics6序列号永久序列号(aics6破解序列号)
-
关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...
- 手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)
-
答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...
- 一周热门
- 最近发表
- 标签列表
-
- 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)
