首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【Python笔记】freemail@163.com

出于某种不可名状的原因,时常会被邮箱大师的恐惧支配,只好自己动手,丰衣足食,上次有人回复我说没给源代码,这次直接上源代码吧,写得很笨拙,请指教:

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文档并且和附件保存在同一个文件夹里面了:

开源分享给大家,大家有什么有趣的想法都可以往里面加~

爱笑的工科小子,继续折腾些有趣也许没用的东西

哈哈,无用书生

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180710G0FZYW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券