【python办公自动化(19)】利用python发送邮件(每天向邮箱发送一条定时新闻)

模块的安装及介绍

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)

–> 输出结果为:
在这里插入图片描述
在这里插入图片描述

注意:

由于在sublime运行代码,如果程序运行结束,系统会自动的显示整个程序的运行时间,这里我们的邮件发送成功后,并没有程序运行时间的提醒,主要是下面有个while循环,也就是说只要这个文件程序不进行修改,每天都会向邮箱发送新闻信息,而且想退订都没有可能。这只是一个小训练,建议在完成功能后进行程序的拆解,比如把最后的while循环注释掉即可
发布了37 篇原创文章 · 获赞 10 · 访问量 4635

猜你喜欢

转载自blog.csdn.net/lys_828/article/details/104117389