day-08_列表结合字典的应用、文件操作、名词概念、邮件的发送、多人邮件信息一致、不同人信息不同邮件发送

"""
例如: 使用容器存储班级的学生信息
学生的特征有 学号  姓名  年龄  性别  手机号
    来描述一个学生就需要使用一个容器来进行存储 【因为一个学生就有多个信息】

    班级中多个学生  需要一个容器嵌套的形式 来描述班级中的多个学生信息 【列表嵌套字典】
    字典用来描述学生的特征信息 【用列表也可以描述单个学生的信息 但是不如字典直观  可以直接看出数据代表的特征值】
        比如 [20, '张乐乐', 20, '男', '15678392982']
        使用字典 {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392982'}
    列表用存储多个学生
        [
        {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392982'},
        {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392982'},
        {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392982'},
        {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392982'}
        ]

刻在脑子里
    列表中的成员是什么类型的????  字典!!!!!!!!
        遍历列表的时候  for 变量 in 列表
            这个变量接受的是字典类型的数据 !!!!!
"""
students = [
        {'学号': 20, '姓名': '张乐乐', '年龄': 20, '性别': '男', '手机号': '15678392989'},
        {'学号': 21, '姓名': '董佳乐', '年龄': 18, '性别': '男', '手机号': '15787392986'},
        {'学号': 22, '姓名': '苏茜茜', '年龄': 19, '性别': '女', '手机号': '13589839298'},
        {'学号': 23, '姓名': '付佳佳', '年龄': 20, '性别': '女', '手机号': '13788392982'}
        ]

# 获取第二个学生的姓名
# students[1] 获取的列表中第2个数据 这个数据是字典类型的
# 在字典中取值   字典数据[键]
print(students[1]['姓名'])

print('=======')
# 获取手机号以13开头的学生姓名
"""
1. 先去获取学生
    遍历列表  获取每个学生的信息
2. 根据学生获取到手机号
    学生是字典类型的  根据键通过学生获取到手机号 
3. 判断手机号是否是以13开头 是的话输出学生的姓名
"""
for stu in students:  # stu是字典类型的 代表的是学生
    # 获取学生的手机号
    if stu['手机号'].startswith('13'):
        print(stu['姓名'])
"""
1. 获取年龄在19岁以上的学生的姓名
2. 获取倒数第二个学生的手机号
"""
for student in students:  # student 表示的当前获取的学生  是一个字典类型的数据
    # 需要获取学生的年龄
    if student['年龄'] > 19:
        print(student['姓名'])

print([student['姓名'] for student in students if student['年龄'] > 19])

# 获取倒数第二个学生的手机号
print(students[-2]['手机号'])
"""
通过Python程序与文件交互, 可以读取文件中的内容或者是向文件中写入内容

通过计算机上的文件系统 来打开文件读内容 或者是打开一个文件向里面写入内容的流程是什么
    1. 找到要操作的文件  【通过文件路径找到文件】
            文件路径有两种格式的,分别为绝对路径和相对路径
                绝对路径是 从盘开始到具体的文件这个路径称为绝对路径
                    比如 C:\WorkContent\各班代课\SHJCPython2302\day07_列表与字典常见操作\作业\day07作业.txt
                相对路径  参照物: 当前编辑的文件
                    在相对路径中有两个符号需要记住 【通过这两个符号来偏移路径进行定位的】
                        .  编辑文件当前所在的文件夹
                        .. 编辑文件当前所在的文件夹的上一级
                    比如 当前编辑文件是 02_文件操作.py
                        先拿绝对路径 C:\WorkContent\各班代课\SHJCPython2302\day08_文件操作与邮件发送\代码\Day08\02_文件操作.py

                    .表示的是 哪个文件夹???  Day08
                    .. 表示的是 哪个文件夹???  代码
                    通过相对路径 定位 image.png这个文件  这个路径该怎么写???
                         先通过.或者.. 定位给到 参照物和目标文件共同的文件夹 再从这个文件夹为出发点找目标文件
                         .\images\image.png
                    通过相对路径找到  C:\WorkContent\各班代课\SHJCPython2302\day08_文件操作与邮件发送\代码\test.txt
                        相对路径怎么写???
                        ..\test.txt

                    通过相对路径找到  C:\WorkContent\各班代课\SHJCPython2302\day08_文件操作与邮件发送\笔记\day08听写.md
                        相对路径怎么写??
                          参照物与目标文件 共同的文件夹  day08_文件操作与邮件发送
                          怎么定位到这个???
                          ..\.. [上一级的上一级]
                          ..\..\笔记\day08听写.md

    2. 打开文件  操作文件【要么读 要么写】
    3. 关闭文件
"""
# 在程序中如何打开文件
"""
open(文件路径, 操作文件模式, encoding=文件编码)
    文件路径
        一般在程序中使用文件路径时  都是相对  需要的文件都在项目下存放 【因为项目进行传递 防止传递后 资源无法访问】
    操作文件模式
        分为两大类:按照操作数据格式分类的
            1. 操作的是文本数据 【这个文本数据在程序中就是字符串】
                    只读  r
                    只写  w/a  文件路径不存在 会创建文件  如果存在w代表的是清空写   a代表的追加写
            2. 操作的是二进制数据 【程序中将文本转化为字节串】
                    字符串中的encode  把文本编码成计算机能直接处理的字节串 【十六进制】
                    只读 rb   [b--binary 二进制格式处理形式]
                    只写 wb/ab

                    向图片 音视频等等这写文件全部都是需要使用字节模式处理的

    encoding=文件编码
        数据传递的时候 本质上操作的二进制数据  编码模式决定了二进制数据存储机制    
"""

# 演示读取文件中的数据
# 1. 按照路径 以及操作模式 和处理数据的编码打开一个文件
# file = open('./day07作业讲解.py', 'r', encoding='utf-8')
# # 2. 读取数据
# data = file.read()
# print(data)
# # 3. 关闭文件
# file.close()


# 读取的是字节数据  【注意事项  不用设置文件的编码的】
# ValueError: binary mode doesn't take an encoding argument
# 二进制模式 不需要解读成可识别的字符串的  所以不用设置编码
file = open('./day07作业讲解.py', 'rb')
data = file.read()
print(data)
# 可以对数据解码
print(data.decode('utf-8'))
file.close()
"""
客户端(Client)与服务器端(Server)
    计算机网络中进行通信的两个主要角色

    客户端:【客户:产品的使用者称为客户】
        使用客户端软件或者浏览器等应用程序向服务器发送请求的计算机或者设备 称为客户端
    服务器:【服务:为客户端服务的】
        为客户端提供服务的计算机或者设备

计算机进行通信 有3要素
1. IP地址 【计算机设备的身份标识】
        常见到的是域名  www.baidu.com
            对IP地址进行了一层封装  192.168.33.29【ip地址】
        作用:定位进行通信的两台计算机的
2. 端口号  应用程序在设备中的唯一标识
3. 通信协议 【通信是遵守的规则】
        常见到的 浏览器和服务器之间的通信协议 HTTP 、HTTPS
            HTTPS是在HTTP的基础上进行了 SSL加密协议

        发送邮件遵守的协议  SMTP
"""

# 使用程序将网络图片存储与本地 如何操作
"""
自己在浏览器上的操作就是  找到图片 点击下载【向图片所在的服务器请求资源 把资源传到了本地】
使用程序模拟浏览器向服务器发送请求 获取数据资源
这个过程需要一个工具库  requests
"""
# 1. 导入工具库
import requests

# 2. 模拟浏览器发送请求获取资源 【服务器会资源反馈回来】
# 请求 : 客户端向服务器要数据这个过程叫做请求
# 响应: 服务器把数据给客户端这个过程称为响应
"""
响应中需要先了解两个内容
    响应状态码  标记内容是否正常返回
        200  代表内容正常返回到客户端
        404  代表请求的资源不存在
        403  服务器禁止访问
        500  服务器错误
        418  描述 i am a tea pot  我是一个茶壶 【爬虫会遇到的】 检测是爬虫了
    响应体 【具体的响应内容】
"""
# requests.get 请求获取数据
resp = requests.get('https://ts1.cn.mm.bing.net/th/id/R-C.995d1da8c53e25e8441b1fb981e08036?rik=nBU%2fTaPbkqHwKg&riu=http%3a%2f%2fpic30.photophoto.cn%2f20140320%2f0008020975081373_b.jpg&ehk=6Fy4LSBwAq1D2%2f1eR9dVRzxVjGicv002I1ZIv5LXjKA%3d&risl=&pid=ImgRaw&r=0')
# resp用来接受服务器的响应
# 获取相应状态码 检测数据是否正常返回
print(resp.status_code)
if resp.status_code == 200:
    print('请求成功')
    # 请求的资源是图片  图片数据是字节的  获取字节格式的响应内容
    data = resp.content
    # print(data)
    # 将数据写入到本地文件中
    file = open('./images/bg.png', 'wb')
    file.write(data)
    file.close()
else:
    print('请求失败')
"""
发送邮件的流程步骤:
    1. 确定发送邮件的平台
            确定的平台使用的QQ邮箱
            发送邮件的时候
                客户端  使用者使用的一段
                服务器  接受发送的邮件 让其传递给接收者
            服务端和客户端进行通信的时候 遵守的协议的  这个协议 smtp

            QQ邮箱平台 发送邮件的服务器是....
                    smtp.qq.com   端口号465

            因为使用Python发送邮件 需要连接qq邮箱发送邮件的服务器 向其发起连接请求 传递邮件相关信息

    2. 登录到平台上
            QQ邮箱客户端登录的话  使用的是用户名和密码

            使用Python程序这个过程称为授权认证 【允许这个用户借助这个平台发送邮件】
                使用的是用户名和授权码 【rgvpbpgxaupehijc】
                    这个授权码记不住没关系 可以无限次生成


    3. 构造邮件
            包含收件人、主题、邮件内容
    4. 点击发送

如果要用Python程序完成这个流程 需要两个工具库的
1. smtplib
        连接服务器 授权认证身份  发送邮件的
2. email
        构造邮件的库
"""
import smtplib

# 1. 连接服务器
# host=服务器地址或者域名, port=端口号
connect = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
# 2. 授权认证
# user用户名, password授权码
connect.login(user='1114354656@qq.com', password='jrlbkxeyqhvzfiif')

# 3. 构造邮件
# from 工具报名 import 内容  直接在工具包下将内容导入
from email.mime.multipart import MIMEMultipart  # 构造邮件的
from email.mime.text import MIMEText  # 构造邮件正文的

email = MIMEMultipart()
# 设置邮件的头部信息 【发件人 收件人  主题】  设置的时候是以键值对形式设置的
# 发件人对应的键From  收件人对应的键是To  主题对应的键是Subject
email['From'] = '1114354656@qq.com'
email['To'] = '15650726528@163.com'
email['Subject'] = '今天星期几'

# 构造正文
# _text 设置的正文内容,
# _subtype='plain', 正文的格式 plain纯文本   html超文本
# _charset=None 内容的编码方式
text = MIMEText(_text='今天星期三,离放假还有2天', _subtype='plain', _charset='utf-8')
# 将正文添加到邮件中
email.attach(text)  # 在邮件上附上正文


# 4. 发送邮件: 通过连接给服务器传递过去
# from_addr,  发件人
# to_addrs, 收件人  【如果有多个收件人 可以是列表类型的数据】
# msg 待发送的邮件  【需要转换成字符串】
connect.sendmail(from_addr='1114354656@qq.com', to_addrs='15650726528@163.com', msg=email.as_string())

# 5. 断开连接
connect.close()
# 1. 导入需要的工具库
import smtplib
from email.mime.multipart import MIMEMultipart  # 构造邮件的
from email.mime.text import MIMEText  # 构造正文的

# 2. 数据的准备
sender = '1114354656@qq.com'  # 发件人
# 收件人
receivers = ['15650726528@163.com', '1141780323@qq.com']

# 3. 连接发送邮件的服务器 授权认证
connect = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
connect.login(user=sender, password='jrlbkxeyqhvzfiif')

# 4. 构造邮件
email = MIMEMultipart()
# 设置邮件头部信息
email['From'] = sender
# 多个收件人之间的分隔符是逗号
email['To'] = ','.join(receivers)
# 设置主题
email['Subject'] = 'Python'

# 构造正文
text = MIMEText(_text='人生苦短 我用Python', _subtype='plain', _charset='utf-8')
# 附在邮件上
email.attach(text)

# 5. 发送邮件
connect.sendmail(from_addr=sender,
                 to_addrs=receivers,
                 msg=email.as_string())
# 6. 关闭连接
connect.close()
# 1. 导入库
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

# 2. 数据准备
# 发送者
sender = '1114354656@qq.com'
# 接收者
receivers = [
    {'邮箱': '15650726528@163.com', '主题': '人生苦短', '内容': '人生苦短 我用Python'},
    {'邮箱': '1141780323@qq.com', '主题': '邮件练习', '内容': '你学废了吗'}
]

# 3. 连接授权认证
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
connect.login(user=sender, password='jrlbkxeyqhvzfiif')

# 构造邮件 不同人收到的邮件是不一样的 有几个人构造几份邮件
for receiver in receivers:  # receiver 当前接受人  是字典类型
    email = MIMEMultipart()
    email['From'] = sender
    email['To'] = receiver['邮箱']
    email['Subject'] = receiver['主题']

    text = MIMEText(_text=receiver['内容'], _subtype='plain', _charset='utf-8')
    email.attach(text)

    # 给这个人发送过去
    connect.sendmail(from_addr=sender, to_addrs=receiver['邮箱'], msg=email.as_string())

# 关闭连接
connect.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值