其他分享
首页 > 其他分享> > 利用爬虫+POP3收发邮件

利用爬虫+POP3收发邮件

作者:互联网

利用爬虫+POP3收邮件的附件

开启邮箱的POP3协议并获取第三方客户端授权码(密码)

开启邮箱的POP3

以163邮箱为例,点击设置→POP3/SMTP/IMAP
在这里插入图片描述
点击开启
在这里插入图片描述

获取第三方客户端授权码(密码)

在这里插入图片描述

根据邮箱的主题名将邮件进行分类,并将各个附件分别保存

main.py 借鉴其他代码来进行修改: python+pop3进行附件下载.

// An highlighted block
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#poplib库 用来从pop3收取邮件
import poplib
#email 用来处理邮件信息的库
import email
#datetime 用来组成日期的库
import datetime
import time
import os
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr



# 输入邮件地址, 验证码和POP3服务器地址:
email = 'xxx@163.com'
password = 'xxx'
pop3_server = 'pop.163.com'


def decode_str(s):  # 字符编码转换
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value

def mkdir(path):
    if not os.path.exists(path):
        os.makedirs(path)
        print(path)
    else:
        pass

def get_att(msg):
    import email
    attachment_files = []
    for part in msg.walk():
        file_name = part.get_filename()  # 获取附件名称类型
        contType = part.get_content_type()
        if file_name:
            h = email.header.Header(file_name)
            dh = email.header.decode_header(h)  # 对附件名称进行解码
            filename = dh[0][0]
            if dh[0][1]:
                filename = decode_str(str(filename, dh[0][1]))  # 将附件名称可读化
                subject = decode_str(msg["subject"]).rstrip()
                print(subject+"\\"+filename)
                # filename = filename.encode("utf-8")
            data = part.get_payload(decode=True)  # 下载附件
            source_dir = os.path.join('G:\\研一大文件\\课外事\\大数据作业\\test\\',subject)
            mkdir(source_dir)
            att_file = open(os.path.join(source_dir,filename),
                            'wb')  # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
            attachment_files.append(filename)
            att_file.write(data)  # 保存附件
            att_file.close()
    return attachment_files


# 连接到POP3服务器,有些邮箱服务器需要ssl加密,对于不需要加密的服务器可以使用poplib.POP3()
# server = poplib.POP3_SSL(pop3_server)
server = poplib.POP3(pop3_server)
server.set_debuglevel(1)
# 打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
server.pass_(password)
# 返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# # list()返回所有邮件的编号:
# resp, mails, octets = server.list()
# # 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
# print(mails)
# index = len(mails)
index,_ = server.stat()
for i in range(index, 0, -1):
    # 倒序遍历邮件
    resp, lines, octets = server.retr(i)
    # lines存储了邮件的原始文本的每一行,
    # 邮件的原始文本:
    msg_content = b'\r\n'.join(lines).decode('utf-8')
    # 解析邮件:
    msg = Parser().parsestr(msg_content)
    # print(decode_str(msg["subject"]))
    # 获取邮件时间
    date1 = time.strptime(msg.get("Date")[0:24],
                          '%a, %d %b %Y %H:%M:%S')  # 格式化收件时间
    date2 = time.strftime("%Y%m%d", date1)  # 邮件时间格式转换
    if (date2 <='20200607') & (date2 > '20200519'):
        print("正在获取附件中")
        f_list = get_att(msg)  # 获取附件
    else:
        break

    # print_info(msg)

server.quit()

标签:decode,爬虫,server,POP3,收发,msg,email,邮件
来源: https://blog.csdn.net/weixin_43537192/article/details/106600303