出于某种不可名状的原因,时常会被邮箱大师的恐惧支配,只好自己动手,丰衣足食,上次有人回复我说没给源代码,这次直接上源代码吧,写得很笨拙,请指教:
import poplib
from email.parser import Parser
from email.header import decode_header
from email.utils import parseaddr
import os
import datetime
import time
import email
import xlrd
import xlwt
import webbrowser as web #对导入的库进行重命名
# indent用于缩进显示:
def print_info(msg, indent=0):
global name_file
global addr_file
global emails
global date2
global name_path
global sender_name
if indent == 0:
for header in ['From', 'To', 'Subject']:
value = msg.get(header, '')
if value:
if header=='Subject':
value = decode_str(value)
else:
hdr, addr = parseaddr(value)
name = decode_str(hdr)
value = u'%s ' % (name, addr)
if header=='From':
name_file=name
addr_file=addr
print('%s%s: %s' % (' ' * indent, header, value))
if (msg.is_multipart()):
parts = msg.get_payload()
#for n, part in enumerate(parts):
part=parts[0]
#print('%spart %s' % (' ' * indent, 1))
#print('%s--------------------' % (' ' * indent))
print_info(part, indent + 1)
else:
content_type = msg.get_content_type()
if content_type=='text/plain' or content_type=='text/html':
content = msg.get_payload(decode=True)
charset = guess_charset(msg)
if charset:
content = content.decode(charset)
try:
if name_file == '':
now = datetime.datetime.now()
os.mkdir("F:\\%s\\未知联系人"%emails)
name_path="F:\\%s\\未知联系人\\"%emails
#names='F:\%s\未知联系人\%s-%s-%s-%s-%s-%s-%s.txt' % (emails,addr_file,now.year,now.month,now.day,now.hour,now.minute,now.second)
names='F:\%s\未知联系人\%s-%s-%s-%s-%s.txt' % (emails,addr_file,date2,now.hour,now.minute,now.second)
sender_name='%s-%s-'%(addr_file,date2)
else:
now = datetime.datetime.now()
os.mkdir("F:\\%s\\%s"%(emails,name_file))
#names='F:\%s\%s\%s-%s-%s-%s-%s-%s-%s.txt' % (emails,name_file,name_file,now.year,now.month,now.day,now.hour,now.minute,now.second)
names='F:\%s\%s\%s-%s-%s-%s.txt' % (emails,name_file,date2,now.hour,now.minute,now.second)
name_path="F:\\%s\\%s\\"%(emails,name_file)
sender_name='%s-%s-'%(name_file,date2)
except:
if name_file == '':
now = datetime.datetime.now()
#names='F:\%s\未知联系人\%s-%s-%s-%s-%s-%s-%s.txt' % (emails,addr_file,now.year,now.month,now.day,now.hour,now.minute,now.second)
names='F:\%s\未知联系人\%s-%s-%s-%s-%s.txt' % (emails,addr_file,date2,now.hour,now.minute,now.second)
name_path='F:\\%s\\未知联系人\\' % (emails)
sender_name='%s-%s-'%(addr_file,date2)
else:
now = datetime.datetime.now()
#names='F:\%s\%s\%s-%s-%s-%s-%s-%s-%s.txt' % (emails,name_file,name_file,now.year,now.month,now.day,now.hour,now.minute,now.second)
names='F:\%s\%s\%s-%s-%s-%s.txt' % (emails,name_file,date2,now.hour,now.minute,now.second)
name_path="F:\\%s\\%s\\"%(emails,name_file)
sender_name='%s-%s-'%(name_file,date2)
else:
print('this file have issues, probably needs attention')
file_flag=1
#此处表示文件名称有问题
return file_flag
try:
f = open(names,'w')
f.write(addr_file)
f.write(2*'\n')
f.write(content)
f.close()
file_flag=0
return file_flag
except:
file_flag=1
#表示文件写入错误
return file_flag
print('%sText: %s' % (' ' * indent, content + '...'))
else:
print('%sAttachment: %s' % (' ' * indent, content_type))
def decode_str(s):
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def guess_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
def decode_str(s):#字符编码转换
value, charset = decode_header(s)[0]
if charset:
value = value.decode(charset)
return value
def get_att(msg):
global name_path
global sender_name
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]))#将附件名称可读化
print(filename)
#filename = filename.encode("utf-8")
data = part.get_payload(decode=True)#下载附件
now = datetime.datetime.now()
filenames='%s%s%s-%s-%s-%s'%(name_path,sender_name,now.hour,now.minute,now.second,filename)
att_file = open(filenames,'wb')#在指定目录下创建文件,注意二进制文件需要用wb模式打开
attachment_files.append(filename)
att_file.write(data)#保存附件
att_file.close()
return attachment_files
web.open_new_tab('http://mp.weixin.qq.com/mp/homepage?__biz=MzU3MjAzMTM5MA==&hid=3&sn=7dbd3d149a382917b53eff4bbfc09fa8&scene=18#wechat_redirect')
print('支持原创,欢迎交流')
print('原创者唐诗扬微信号:tsy2018tsy')
# 输入邮件地址, 口令和POP3服务器地址:
email = input('请输入您的163邮箱: ')
print('freemail@163 has started')
#pop3_server = input('POP3 server: ')
global date2
password = input('请输入您的授权码(注意不是密码)注意和密码的区别')
pop3_server = 'pop.163.com'
emails = email[:-4]
try:
os.mkdir("F:\\%s"%(emails))
except:
print('folder already generated')
while True:
now = datetime.datetime.now()
if (now.hour == 5 or now.hour == 6 or now.hour == 9 or now.hour == 12 or now.hour == 15 or now.hour == 18 or now.hour == 21 or now.hour == 0) and now.minute == 0:
# 连接到POP3服务器:
server = poplib.POP3(pop3_server)
# 可以打开或关闭调试信息:
server.set_debuglevel(1)
# 可选:打印POP3服务器的欢迎文字:
print(server.getwelcome().decode('utf-8'))
# 身份认证:
server.user(email)
server.pass_(password)
num_msg,sizes=server.stat()
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
while index!=0:
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
try:
resp, lines, octets = server.retr(index)
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 稍后解析出邮件:
msg = Parser().parsestr(msg_content)
date1 = time.strptime(msg.get("Date")[0:24],'%a, %d %b %Y %H:%M:%S') #格式化收件时间
date2 = time.strftime("%Y%m%d", date1)#邮件时间格式转换
except:
index=index-1
if index==0:
break
file_flag=0
continue
try:
file_flag=print_info(msg, indent=0)
except:
index=index-1
if index==0:
break
file_flag=0
continue
if file_flag==1:
index=index-1
if index==0:
break
continue
# 可以根据邮件索引号直接从服务器删除邮件:
server.dele(index)
f_list = get_att(msg)#获取附件
# 关闭连接:
index=index-1
if index==0:
break
time.sleep(60)
else:
time.sleep(60)
continue
server.quit()
之后的效果就是把邮箱中所有的邮件全部整理成txt文档并且和附件保存在同一个文件夹里面了:
开源分享给大家,大家有什么有趣的想法都可以往里面加~
爱笑的工科小子,继续折腾些有趣也许没用的东西
哈哈,无用书生
领取专属 10元无门槛券
私享最新 技术干货