您的位置:首页 > 其它

解析校内网邮箱

2016-03-14 21:17 369 查看
一并写的参考了前人的资料,修复了一些程序中存在的bug,对于中文附件文件名解析的时候会出现需要迭代解码的情况,

写邮箱登陆容易,对邮箱的解析确是一件麻烦的事情

遇到不懂的地方,多用Pycharm调试,看看错在哪

config.ini配置文件

[mail]
smpthost=mail.bjtu.edu.cn
pophost=mail.bjtu.edu.cn
name=xxxxxxxxxxxxxx
passwd=xxxxxxxxxx


邮箱登陆部分

from  poplib import *
import logging
import  configparser

# import getpass, poplib
#
# M = poplib.POP3('localhost')
# M.user(getpass.getuser())
# M.pass_(getpass.getpass())
# numMessages = len(M.list()[1])
# for i in range(numMessages):
#     for j in M.retr(i+1)[1]:
#         print(j)
class MailHelper(object):
configpath='config.ini'
configmail=configparser.ConfigParser()
configmail.read(configpath)
def __init__(self):
self.pophost=self.configmail.get('mail','pophost')
self.smtphost=self.configmail.get('mail','smtphost')
self.username=self.configmail.get('mail','name')
self.passwd=self.configmail.get('mail','passwd')
def Login(self):
try:
self.pop=POP3_SSL(self.pophost)
self.pop.set_debuglevel(0)
self.pop.user(self.username)
self.pop.pass_(self.passwd)
self.total=self.pop.stat()[0]
self.s=self.pop.list()

print('登陆成功',self.total)
except Exception as e:
print('登陆失败'+str(e))
def AcceptMail(self):
from functools import reduce
msg=self.pop.retr(541)[1]
f=open(r"C:\Users\sunqi\Desktop\新建文本文档.txt",'wb')
s=list(map(lambda x:x+b'\r\n',msg))
f.writelines(s)
f.close()
print('ok')

s=MailHelper()
s.Login()
s.AcceptMail()


解析邮件内容部分

# coding=utf-8

import email

fp = open("C:\\Users\\sunqi\\Desktop\\新建文本文档.txt", 'r')
msg = email.message_from_file(fp) # 直接文件创建message对象,这个时候也会做初步的解码
subject = msg.get("subject") # 取信件头里的subject, 也就是主题
from email.header import decode_header
s=decode_header(subject)[0]  #列表里面包含一个集合提取从集合
print(s[0].decode(s[1]))
# 下面的三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC?=这样的subject
# h = email.header.Header(subject)
# dh = email.header.decode_header(h)
# subject = dh[0][0]
# print("subject:", subject)
print("from: ", email.utils.parseaddr(msg.get("from"))[1]) # 取from
print("to: ", email.utils.parseaddr(msg.get("to"))[1]) # 取to
print("Date: ", email.utils.parsedate(msg.get("Date")))

# 循环信件中的每一个mime的数据块
for par in msg.walk(): #遵循深度优先的遍历树形图中所有元素
if not par.is_multipart(): # 这里要判断是否是multipart,是的话,里面的数据是无用的,至于为什么可以了解mime相关知识。
name = par.get_param("name") #如果是附件,这里就会取出附件的文件名
if name:
#有附件
# 下面的89/三行代码只是为了解码象=?gbk?Q?=CF=E0=C6=AC.rar?=这样的文件名
h = email.header.Header(name)
dh = email.header.decode_header(h)[0][0].decode()
if dh.endswith('?='):
#若果文件名为中文
dh = email.header.decode_header(dh)[0]
fname=dh[0].decode(dh[1])
else:
fname=dh
#print(dh)
print('附件名:', fname)
data = par.get_payload(decode=True) # 解码出附件数据,然后存储到文件中

try:
f = open(fname, 'wb') #注意一定要用wb来打开文件,因为附件一般都是二进制文件
except Exception as e:
print('附件名有非法字符,自动换一个\n出现异常:',str(e))
f = open('aaaa', 'wb')
f.write(data)
f.close()
else:
#不是附件,是文本内容
print(par.get_payload(decode=True).decode('gbk')) # 解码出文本内容,直接输出来就可以了。

print('+'*60) # 用来区别各个部分的输出

fp.close()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bug 邮箱 调试