POP3协议登陆邮箱并获取所有邮件

本文涉及的产品
云解析DNS-重点域名监控,免费拨测 20万次(价值200元)
简介: POP3协议登陆邮箱并获取所有邮件

POP3协议登陆邮箱并获取所有邮件

import re
import poplib
# 引入用来解析邮件相关信息的模块
import time
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
# 引入相关时间库
from datetime import datetime
from selenium import webdriver
# 输入自己163的邮箱地址。
user_email_address = ''
# 邮箱的授权码,注意:不是登录密码
user_password = ''
# 这个是163邮箱的pop3的服务器地址,各个邮箱平台的POP3的服务器地址都是不同的
# 例如:qq邮箱的pop3服务器地址是:pop.qq.com
pop_server_host = 'pop3.mxhichina.com'
# 邮箱对应的pop服务器的监听端口
# (如果设置POP3的SSL加密方式连接的话,则端口为:995),否则就是端口为110
pop_server_port = 995
driver = webdriver.Chrome()
driver.maximize_window()
def connect_email_by_pop3(number,key_words):
    try:
        # 连接pop服务器。如果没有使用SSL,将POP3_SSL()改成POP3(),且监听端口改为:110即可
        email_server = poplib.POP3_SSL(host=pop_server_host, port=pop_server_port, timeout=10)
        print("连接pop服务器-------正常,开始验证用户邮箱")
    except:
        print("连接pop服务器-------异常,退出")
        exit(1)
    try:
        # 验证用户邮箱
        email_server.user(user_email_address)
        print("用户邮箱验证-------正常,开始验证邮箱授权码")
    except:
        print("用户邮箱验证-------异常,退出")
        exit(1)
    try:
        # 验证邮箱密码是否正确,注意不是登录密码,是授权码
        email_server.pass_(user_password)
        print("邮箱授权码验证-------正常,开始接受邮箱以及附件")
    except:
        print("邮箱授权码验证-------异常,退出")
        exit(1)
    # 开始处理邮箱相关信息
    parse_email_server(email_server,number,key_words)
def parse_email_server(email_server,number,key_words):
    _, mails, _ = email_server.list()
#     num, total_size = email_server.stat()
    # mails存储了邮件编号列表,
    index = len(mails)
    # 倒序遍历邮件
    for i in range(index, index-number, -1):
        # 倒序遍历邮件,这样取到的第一封就是最新邮件
        _, lines, _ = email_server.retr(i)
        # lines存储了邮件的原始文本的每一行,
        # 邮件的原始文本:# lines是邮件内容,列表形式使用join拼成一个byte变量
        msg_content = b'\r\n'.join(lines).decode('utf-8')
        # 解析邮件:
        msg = Parser().parsestr(msg_content)
        # 解析邮件具体内容,包括正文,标题,和附件
        parser_content(msg, 0,key_words,driver)
    # 退出
    email_server.quit()
def parser_content(msg, indent,key_words,driver):
    is_chendu = False
    if indent == 0:
        # 邮件的From, To, Subject存在于根对象上:
        # 调用解析邮件头部内容的函数
        is_chendu,head = parser_email_header(msg,key_words)
    if not is_chendu:
        return
    if (msg.is_multipart()):
        # 如果邮件对象是一个MIMEMultipart,
        # get_payload()返回list,包含所有的子对象:
        parts = msg.get_payload()
        for n, part in enumerate(parts):
            # 递归打印每一个子对象:
            return parser_content(part, indent + 1,key_words,driver)
    else:
        # 解析正文
        content_type = msg.get_content_type()
        if content_type == 'text/plain' or content_type == 'text/html':
            # 纯文本或HTML内容:
            content = msg.get_payload(decode=True)
            # 要检测文本编码:
            charset = guess_charset(msg)
            if charset:
                content = content.decode(charset)
                if "2023年毕业" in content:
                    ms = parse_content(content)
                    print(head,ms)
                    if driver.current_url != 'data:,':
                        windows = driver.window_handles
                        driver.execute_script("window.open('','_blank');")
                        driver.switch_to.window(windows[-1])
                    driver.get(ms)
#                 print('%s正文内容为: %s' % ('  ' * indent, content))
    return 1
def open_chrome(url):
    pass
def parse_content(content):
    pattern = r'<tr><td style="font-weight:600;font-size: 20px;color: #00a9e0;">([^><]+)</td></tr>'
    info = re.findall(pattern, content)
#     print(info)
    
    rpattern = r'<a href="(https://hr.shixiseng.com/#/email/view/.+)" style="display:block;width:120px;text-align:center;padding: 10px 0;vertical-align:middle; color: #ffffff;background-color: #00a9e0;text-decoration: none;">查看完整简历</a></td></tr>'
    res = re.findall(rpattern, content)
#     print(res)
    
#     print(info[0],res[0])
    return res[0]
    
# 解析邮件
def parser_email_header(msg,keywords):
    # 解析邮件标题
    subject = msg['Subject']
    value, charset = decode_header(subject)[0]
    if charset:
        value = value.decode(charset)
    
    info = filter(lambda x:x in value,key_words)
    return 1 if list(info) else 0,value
# 解码
def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value
# 猜测字符编码
def guess_charset(msg):
    # 先从msg对象获取编码:
    charset = msg.get_charset()
    if charset is None:
        # 如果获取不到,再从Content-Type字段获取:
        content_type = msg.get('Content-Type', '').lower()
        for item in content_type.split(';'):
            item = item.strip()
            if item.startswith('charset'):
                charset = item.split('=')[1]
                break
    return charset
# 邮件时间处理函数
def parse_mail_time(mail_datetime):
    GMT_FORMAT = "%a, %d %b %Y %H:%M:%S"
    GMT_FORMAT2 = "%d %b %Y %H:%M:%S"
    index = mail_datetime.find(' +0')
    if index > 0:
        mail_datetime = mail_datetime[:index]  # 去掉+0800
    formats = [GMT_FORMAT, GMT_FORMAT2]
    for ft in formats:
        try:
            mail_datetime = datetime.strptime(mail_datetime, ft)
            return mail_datetime
        except:
            pass
    raise Exception("邮件时间格式解析错误")
# 比较规范写法,象征着程序入口
if __name__ == "__main__":
    number = 50
    key_words = ["成都","四川","西南"]
    connect_email_by_pop3(number,key_words)
#     parse_content(html)
相关文章
|
安全 网络安全 API
Hotmail邮箱设置Exchange的方法步骤
如何使用Exchange协议设置Hotmail邮箱:在邮件客户端(如Outlook)中添加新账户,选择Exchange服务,输入邮箱全址(@hotmail.com)和服务器地址(outlook.office365.com),启用SSL加密,完成设置后即可在各设备同步邮件、日历和联系人。AokSend提供触发式验证码发信服务,支持SMTP/API接口,高触达,独立IP和服务器。
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
1891 2
|
机器学习/深度学习 算法 调度
AdEMAMix: 一种创新的神经网络优化器
9月发布的一篇论文中,Pagliardini等人提出了AdEMAMix,一种新的优化算法,旨在克服Adam及其变体(如AdamW)在利用长期梯度信息方面的局限性。通过结合两种不同衰减率的指数移动平均(EMA),AdEMAMix能够更有效地利用历史梯度信息。实验结果显示,AdEMAMix在语言建模和视觉任务中均显著优于AdamW,不仅能加速模型收敛,还能提高学习稳定性。尽管引入了额外计算步骤,但开销极小,展示了在大规模神经网络训练中的潜力。论文详细探讨了其核心思想、实验设置及未来研究方向。
380 8
AdEMAMix: 一种创新的神经网络优化器
|
机器学习/深度学习 自然语言处理 算法
深度学习在图像识别中的应用及实践
本文将探讨深度学习在图像识别领域的应用,并分享一个使用Python和Keras库实现的简单代码示例。我们将介绍深度学习的原理、常用模型以及如何在实际应用中解决问题。通过阅读本文,您将了解深度学习在图像识别中的潜力,并学会如何构建一个简单的神经网络模型。
183 0
|
存储 监控 关系型数据库
如何升级MySQL版本?
如何升级MySQL版本?
827 2
|
存储 NoSQL 关系型数据库
数据的存储--MongoDB文档存储(一)
数据的存储--MongoDB文档存储(一)
595 3
|
数据采集 JSON 网络协议
Python编程异步爬虫——aiohttp的使用
Python编程异步爬虫——aiohttp的使用
598 0
|
负载均衡 网络协议 算法
【springcloud】Ribbon详解
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。简单点说,其主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接,权重等)去连接这些机器。
535 0
|
消息中间件 缓存 NoSQL
Redis stream 用做消息队列完美吗
Redis Stream 是 Redis 5.0 版本中引入的一种新的数据结构,它用于实现简单但功能强大的消息传递模式。 这篇文章,我们聊聊 Redis Stream 基本用法 ,以及如何在 SpringBoot 项目中应用 Redis Stream 。
Redis stream 用做消息队列完美吗
|
前端开发 Java Windows
JDK1.8下载、安装和环境配置教程(详细)
JDK1.8下载、安装和环境配置教程(详细)
32671 1
JDK1.8下载、安装和环境配置教程(详细)