【python办公自动化(20)】利用python读取邮件(目标邮件的筛选及定时刷新收件箱)

读取keyring密码

前提是已经通过yagmail设置好密码了

import os
os.chdir("D:\\python_major\\auto_office")
import keyring

password = keyring.get_password("yagmail0","[email protected]")
print(password)

–> 输出结果为: 00000000(当初设置的授权码)

读取邮件

对于163、126邮箱,需要提前设置一下

网址:https://config.mail.163.com/settings/imap/[email protected]

注意:将最后的uid换成自己的账号就可以了;谷歌和火狐浏览器会屏蔽这个链接,只需要忽视它继续运行就可以了
在这里插入图片描述
解除屏蔽后的界面
在这里插入图片描述

登录后进行下一步
在这里插入图片描述
最后进行手机验证即可
在这里插入图片描述

读取所有的邮件

lmbox(IMAP服务器地址,邮箱地址,密码,是否开启SSL加密)

import os
os.chdir("D:\\python_major\\auto_office")
from imbox import Imbox
import keyring

pwd = keyring.get_password('yagmail','[email protected]')

with Imbox('imap.163.com','[email protected]',pwd,ssl=True) as imbox:
    all_inbox_messages = imbox.messages()
    for uid, message in all_inbox_messages:
        print(message.subject)
        print(message.body['plain'])

–> 输出结果为:
在这里插入图片描述
此外每个邮件可以读取的参数:

message.sent_from 发件人
message.sent_to 收件人
message.subject 主题
message.date 时间
message.body[‘plain’] 文本格式内容
message.body[‘html’] html格式内容
message.attchments 附件

查看不同类型的邮件

未读邮件:imbox.message(unread = True)

unread_inbox_messages = imbox.messages(unread = True) 

红旗邮件: imbox.messages(flagged = True)

inbox_flagged _messages = imbox.messages(flagged = True)  

某发件人的邮件: imbox.messages(sent_from=“[email protected]”)

inbox_messages_from = imbox.messages(sent_from="[email protected]")

某收件人的邮件: inbox_messages_to = imbox.messages(sent_to = ‘[email protected]’)

按照日期进行筛选邮件(两个下划线):

date__lt 某天前

date__gt 某天后

date__on 指定某一天

inbox_messages_received_before = index.messages(date__lt = datetime.date(2020,1,31))
inbox_messages_received_after = index.messages(date__gt = datetime.date(2020,1,31))
inbox_messages_received_on_date = index.messages(date__on = datetime.date(2020,1,31))

标记已读和删除邮件

标记已读: imbox.mark_seen(uid)

删除邮件: imbox.delete(uid)

for uid,message in all_inbox_messages:
    if '满足某种条件的邮件':
        imbox.delete(uid)

综合应用

编写一个程序,要求:

(1)每分钟读一次邮件

(2)如果发件人是自己,邮件主题是’每日新闻一条’

(3)将新闻内容发送邮件到另一个邮箱

关于第一个要求,在调试的过程中发现,系统获取主题的时候是从最开始时间获取的,由于自己的往期邮件较多,而且获取新闻是最近进行的,因此这中间的跨度有点大,系统运行的时间比较长,为了调试方便,将要求一改成了最近的时间进行调试,关于要求二中,其实发件人就是自己,这一步直接在筛选主题的时候加上一个and做并列筛选就可以了

步骤一、前期准备

import os 
os.chdir("D:\\python_major\\auto_office_1")
from imbox import Imbox
import keyring
import schedule
import time
import yagmail

该部分代码完成的工作是:设置程序运行路径,加载相关的库

步骤二、封装send_mail()函数

def send_mail():
	pwd = keyring.get_password('yagmail','[email protected]')

	with Imbox('imap.163.com','[email protected]',pwd,ssl=True) as imbox:
	    all_inbox_messages = imbox.messages()
	    for uid, message in all_inbox_messages:
	        #print(message.subject)
	        if message.subject == '每日新闻一条' and message.sent_from[0]['email'] == '[email protected]':
	        	#print(message.body['plain'])
	        	yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
	        	contents = message.body['plain']
	        	yag.send('[email protected]','每日新闻一条',contents)
	        	print('发送成功')
	        	#代码运行此处是没有问题的

在准备工作完成之后运行这段代码也是可以直接将邮件发送成功的

步骤三、定时任务

schedule.every().day.at('01:17').do(send_mail)
start = time.perf_counter()
while True:
    schedule.run_pending()
    end = time.perf_counter()
    print('程序运行一次共用时:{:.2f}s'.format(end - start))
    time.sleep(1)

这里为了调试成功,选择了最近的时间,可以在成功之后将定时的时间按照要求进行改正,为了可视化进程可以设置一个计时输出,还是一样,邮件发送成功后记得将最后的定时任务给注释掉

全部代码及输出结果

全部代码如下

import keyring
import schedule
import time
import yagmail

def send_mail():
	pwd = keyring.get_password('yagmail','[email protected]')

	with Imbox('imap.163.com','[email protected]',pwd,ssl=True) as imbox:
	    all_inbox_messages = imbox.messages()
	    for uid, message in all_inbox_messages:
	        #print(message.sent_from)
	        if message.subject == '每日新闻一条' and message.sent_from[0]['email'] == '[email protected]':
	        	#print(message.body['plain'])
	        	yag = yagmail.SMTP(user = '[email protected]', host = 'smtp.163.com')
	        	contents = message.body['plain']
	        	yag.send('[email protected]','每日新闻一条',contents)
	        	print('发送成功')
	        	#代码运行此处是没有问题的

schedule.every().day.at('01:17').do(send_mail)

start = time.perf_counter()

while True:
    schedule.run_pending()
    end = time.perf_counter()
    print('程序运行一次共用时:{:.2f}s'.format(end - start))
    time.sleep(1)

sublime里输出界面显示
在这里插入图片描述
qq邮箱收件箱显示内容
在这里插入图片描述
文件打开后的内容
在这里插入图片描述

发布了37 篇原创文章 · 获赞 10 · 访问量 4634

猜你喜欢

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