模块的安装及介绍
yagmail模块介绍
支持Yet Another GMAIL/SMTP client
非常方便的SMTP包
超简单的Python发邮件模块
需要独立安装
keyring模块介绍
从Python访问系统密匙环服务
方便、安全地存储你的密码
schedule模块简介
超容易理解的定时任务执行器
需要单独安装、不包含在标准模块里面
imbox模块:
简易的Python IMAP包
进行IMAP相关的操作
模块安装:
cmn下 使用命令语句:pip iinstall yagmail keyring schedule imbox
邮件相关的基础知识
POP3:Post Office Protocol3的简称,即邮局协议的第三个版本,它规定怎么样将个人计算机连接 到internet的邮件服务器和下载电子邮件的电子协议
SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议
IMAP: nternet Mail Access Proocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一
写代码发邮件时一定要注意不能频繁发送,容易被当做垃圾邮件屏蔽
准备
注册一个邮箱,开通POP3/SMTP/IMAP服务,会要求设置授权码,点击开启
注意找到各服务器的域名:SMTP服务器对应为smtp.163.com
安全支持:POP3/SMTP/IMAP服务全部支持SSL连接
比如以自己的163邮箱(发送方地址)为例,点击上图的选中的内容下一个选项“客户端授权密码”,在这里“开启”授权码,如果忘记了密码,可以选择“重置授权码”,只要通过“绑定的”手机发送相应的提示信息后,重新输入信息就可以进行授权码的修改。STMP服务器地址可以从上图中的到,即为“smtp.163.com”。
发送方地址:己方邮箱地址
发送方客户端授权密码:12345678(为例)
STMP服务器地址:smtp.163.com
至此,邮件的发送方的准备工作完毕
保存密码
可以直接打开Python交互解析器,存入你的邮件地址和密码(不建议在代码里面直接写用户名和密码)
操作步骤:打开cmd命令行
输入:python
键入:import yagmail’
enter后再键入:yagmail.register(“[email protected]”,‘pwd’)
注意这里的pwd就是刚刚设置好的授权码
发送第一封邮件
yagmail.SMTP(user = 用户名, host= SMTP服务器域名)
import yagmail
yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
contents = ['这是第一段的内容',
'这是第二段的内容']
yag.send('[email protected]','这是一封邮件',contents)
–> 输出结果为:
发送带HTML样式的文件
import yagmail
yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
contents = ['这是第一段的内容',
'这是第二段的内容',
'<a href = "https://www.baidu.com">百度网站</a>']
yag.send('[email protected]','这是一封邮件',contents)
–> 输出结果为:
发送附件
contents = ['这是第一段的内容',
'这是第二段的内容',
'<a href = "https://www.baidu.com">百度网站</a>',
'demo.png']
–> 输出结果为:
发送内嵌图片的邮件
contents = ['这是第一段的内容',
'这是第二段的内容',
'<a href = "https://www.baidu.com">百度网站</a>',
yagmail.inline('demo.png')]
–> 输出结果为:
群发邮件
import yagmail
import os
os.chdir("D:\\python_major\\auto_office")
yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
contents = ['这是第一段的内容',
'这是第二段的内容',
'<a href = "https://www.baidu.com">百度网站</a>',
yagmail.inline('demo.png')]
yag.send(['[email protected]','[email protected]'],'这是一封邮件',contents)
在yag.send()括号内使用列表的形式将收件方的地址放到里面
定时任务
schedule定时任务
import schedule
import time
def job():
print("我在干活呢!")
schedule.every(10).minutes.do(job)
schedule.every().hour.do(job)
schedule.every().day.at('10:30').do(job)
schedule.every(5).to(10).minutes.do(job)
schedule.every().monday.do(job)
schedule.every().wednesday.at("13:15").do(job)
schedule.every().minute(":17").do(job)
#every()后面的内容不填的话就是默认是1
while True:
schedule.run_pending()
time.sleep(1)
综合应用
编写一个Python程序,要求
(1)每天早上8点半启动任务
(2)读取2019年10月网易新闻.csv,随机抽一行新闻内容
(3)将新闻内容发送到自己的邮箱
步骤一、前期准备
import os
os.chdir("D:\\python_major\\auto_office")
import time
import yagmail
import random
import schedule
该部分代码完成的工作是:设置程序运行路径,加载相关的库
步骤二、获取随机一行的数据
首先要确定的是.csv文件,我们并没有学过如何进行读取或者操作(之后的pandas库可以),可以直接尝试进行with open as的语句进行文件的读取和处理(获得的是无序文本数据),但是这里我并不是采用这种方式,因为我们前面刚学的是python对于Excel表格数据的处理,要想获得一行数据是太简单了,没有必要在去对没有序的文本进行处理。因此关于随机获取一行数据的问题就可以封装一个函数get_data()
def get_data():
from openpyxl import load_workbook
workbook = load_workbook(filename = '2019年10月网易新闻.xlsx')
sheet = workbook.active
data_size = sheet.dimensions
size_ls = data_size.split(":")
col_min,row_min,col_max,row_max = size_ls[0][0],int(size_ls[0][1])+1,size_ls[1][0],size_ls[1][1:]
#这里最后的行从第二行开始取,过滤掉第一行标题的内容
#print(col_min,row_min,col_max,row_max)
#输出为A 2 G 59
num = random.randint(2,60)
ls_data = []
for col in range(ord(col_min),ord(col_max)+1):
ls_data.append(sheet[chr(col)+str(num)].value)
return ls_data
get_data()函数返回的就是一行以列表保存的随机数据,其中忽略了标题内容
步骤三、数据发送
这里直接封装一个get_news()函数,用来将获得的一行随机数据发送到邮箱,记得设置提醒,如果可以运行成功,就在最后面加上一句print语句,用作提醒
def get_news():
yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
contents = get_data()
yag.send('[email protected]','每日新闻一条',contents)
print('发送成功')
步骤四、定时任务
这里就直接使用上面整理过后的代码修改一下时间,由于要进行调试,所以选择了最近的时间,要求是早上八点半可以把时间修改一下就可以了
schedule.every().day.at('23:02').do(get_news)
while True:
schedule.run_pending()
time.sleep(1)
全部代码及输出结果
import os
os.chdir("D:\\python_major\\auto_office")
import time
import yagmail
import random
import schedule
def get_data():
from openpyxl import load_workbook
workbook = load_workbook(filename = '2019年10月网易新闻.xlsx')
sheet = workbook.active
data_size = sheet.dimensions
size_ls = data_size.split(":")
col_min,row_min,col_max,row_max = size_ls[0][0],int(size_ls[0][1])+1,size_ls[1][0],size_ls[1][1:]
#这里最后的行从第二行开始取,过滤掉第一行标题的内容
#print(col_min,row_min,col_max,row_max)
#输出为A 2 G 59
num = random.randint(2,60)
ls_data = []
for col in range(ord(col_min),ord(col_max)+1):
ls_data.append(sheet[chr(col)+str(num)].value)
return ls_data
def get_news():
yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
contents = get_data()
yag.send('[email protected]','每日新闻一条',contents)
print('发送成功')
schedule.every().day.at('23:02').do(get_news)
while True:
schedule.run_pending()
time.sleep(1)
–> 输出结果为: