利用爬虫+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()