day 06 自动发送邮件 课堂笔记
- 准备工作
- 邮箱账号:
- 授权码:登录之后——设置——账户——下拉pop/imap/smtp——开启服务状态保存授权码
- smtplib库
一、自动发送邮件流程
1、代码发送普通邮件
-
登录邮箱
# 引入 smtplib 库 import smtplib # 连接邮箱服务器 ''' 连接对象 = smtplib.SMTP_SSL(服务器地址, 邮箱服务端口) - 服务器地址:smtp.qq.com 、 smtp.163.com - 邮箱服务端口:465 或 25 eg: connect = smtp.SMTP_SSL('smtp.qq.com', 465) ''' # 登录邮箱 ''' 连接对象.login(邮箱账号, 授权码) eg: connect.login('*********@qq.com', '******') '''
-
准备邮件内容
# 使用 email 库里的函数 from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header # 创建邮件对象 邮件对象 = MIMEMultipart() # 设置邮件主题 Header(邮件标题, 编码方式).encode() : 主题对象 邮件对象['Subject'] = Header(邮件标题, 编码方式).encode() # 设置邮件收件人 邮件对象['To'] = '收件人' # 设置发送人 邮件对象['From'] = '用户名 <邮箱地址>' # 用户名可以随意修改,最好用英文 # 添加文字内容 (内容为字符串时,类型写 plain) 文字内容对象 = MIMEText(内容, 类型, 编码方式) - 内容就是文字字符串 - 类型:plain(简单的文字内容)、html(超文本) 邮件对象.attach(文字内容对象)
-
发送邮件
# 发送邮件 连接对象.sendmail(发件人, 收件人, 邮件对象.as_string()) # 退出连接 连接对象.close()
2、代码发送附件
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
# 1.连接邮箱服务器
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
# 2.登录邮箱服务器
connect.login('********@qq.com', '**********')
# 3.构建邮件
# 创建邮件对象
mail = MIMEMultipart()
# 设置邮件主题
mail['Subject'] = Header('附件传输', 'utf-8').encode()
# 邮件发送者与接收者
mail['From'] = '**** <*********@qq.com>'
mail['To'] = '*********@163.com'
# 附件:MIMEText(二进制类型的文件内容, 'base64', 'utf-8')
# 打开附件对应文件,并获取文件内容(打开方式为rb)
data = open('files/smtplib_sendmail.pdf', 'rb').read()
# 创建附件对象
file1 = MIMEText(data, 'base64', 'utf-8')
# 设置附件在邮件中显示的位置和格式(注意:filename后面的附件名称不能有中文)
# 注意:filename是发送过去后,对方接收到该文件时,看见的文件名,可修改,其他地方是固定写法
# content-disposition:附件位置 attachment:附件
file1['Content-Disposition'] = 'attachment; filename="123.pdf"'
# 将附件添加到邮件中
mail.attach(file1)
# 4.发送邮件
connect.sendmail('*********@qq.com', '*********@163.com', mail.as_string())
# 5.关闭
connect.close()
二、格式字符串
-
语法:包含格式占位符的字符串 % (数据1, 数据2, 数据3, …)
-
说明:格式占位符如下
- %s - 任何类型的占位符
- %d - 数字(整数)占位符,填充时会自动将数据转换为整型
- %f - 数字(浮点数)占位符,填充时会让数字保留6位小数
- %.nf - 浮点数占位符的变形,填充时让数字保留n位小数
# *先生/女士,你今年**岁啦! name = input('请输入姓名:') age = int(input('请输入年龄:')) gender = input('请输入性别:') n_gender = '先生' if gender == '女': n_gender = '女士' print('%s%s,你今年%d岁啦!' % (name[0], n_gender, age))
三、发送超文本
- 在代码文件夹下的files文件夹下有一个你需要发送的超文本文件
# 引库
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
# 输入姓名和性别,判断是先生还是女士
name = input('请输入姓名:')
gender = input('请输入性别:')
n_gender = '先生'
if gender == '女':
n_gender = '女士'
# 连接邮箱服务器并登录
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
connect.login('*********@qq.com', '**授权码**')
email = MIMEMultipart()
email['Subject'] = Header('发送超文本', 'utf-8').encode()
email['To'] = '*********@163.com'
email['From'] = '*********@qq.com'
# 构建html格式正文,(读取html文件内容,获取文件对应字符串)
data = open('files/data.html', encoding='utf-8').read() % (name[0], n_gender, name)
msg = MIMEText(data, 'html')
email.attach(msg)
connect.sendmail('**from**@qq.com', '****to***@163.com', email.as_string())
connect.close()
三、批量发送文件
基本功能:
给下面data列表中所有用户发送邮件,若积分大于500,在称呼前加’尊敬的’
data = [
{'name': '余婷', 'gender': '女', 'score': 1000, 'email': '*********@qq.com'},
{'name': '张三', 'gender': '男', 'score': 567, 'email': '*********.com'},
{'name': '朱聪', 'gender': '男', 'score': 478, 'email': '*********@163.com'},
{'name': '马诗雨', 'gender': '女', 'score': 672, 'email': '*********@qq.com'},
{'name': '李相葛', 'gender': '男', 'score': 325, 'email': '*********@qq.com'},
{'name': '胡洋', 'gender': '男', 'score': 666, 'email': '*********@163.com'}
]
# 引库
import smtplib
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.text import MIMEText
# 1.连接邮箱服务器(打开邮箱网站);登录(登录自己的邮箱)
connect = smtplib.SMTP_SSL('smtp.qq.com', 465)
connect.login('*********@qq.com', '*********')
dear = ''
for i in data:
n_gender = '先生'
if i['gender'] == '女':
n_gender = "女士"
if i['score'] >= 500:
dear = '尊敬的:'
# 2.构建邮箱(点击写信)
email = MIMEMultipart() # 创建一个空的邮件对象
email['Subject'] = Header('订票通知', 'utf-8').encode() # 邮件主题
email['From'] = '12306YOUXIANG<*********@qq.com> ' # 发件人信息
email['To'] = '%s' % (i['email']) # 收件人信息
data1 = open('files/data.html', encoding='utf-8').read() % (dear, i['name'][0], n_gender, i['name'])
msg = MIMEText(data1, 'html') # 创建正文内容
email.attach(msg) # 将正文添加到邮箱中
# 3.发送邮件
connect.sendmail('*********@qq.com', '%s' % (i['email']), email.as_string()) #发送邮件
connect.close() # 关闭网页
四、os常见函数
- os是python提供的专门用于处理文件或文件夹的模块
- 菜鸟教程
1、路径
-
绝对路径
- 文件或文件夹在计算机中的全路径
- windows电脑从盘开始写,写绝对路径时,需在字符串前加r(因为路径与 \ 结合可能会产生转义)
path = r'F:\qianfeng_study\python_project\src\day6\files\data'
-
相对路径
- 使用前提:需要操作的文件或文件夹在工程目录中时才可以使用相对路径
- a. 用 . 开头表示当前目录(当前代码文件所在的文件夹)
- b. 用… 开头表示当前目录的上一层目录(当前代码所在文件夹的上一层目录)
# 1.创建文件夹 # os.mkdir(文件夹路径) # 注意:创建文件夹时,如果文件夹已经存在,会报错! ''' os.mkdir('./names') #在当前文件夹下创建一个名为 names 的文件夹 os.mkdir('./files/abc') #在当前文件夹下的 files 文件夹下创建一个名为 abc 的文件夹 ''' # 2.判断文件或文件夹是否已经存在 # os.path.exists(文件或文件夹路径) result = os.path.exists('files/a') print(result) result = os.path.exists('files/data.html') print(result)
- 使用前提:需要操作的文件或文件夹在工程目录中时才可以使用相对路径