解析校内网邮箱
2016-03-14 21:17
369 查看
一并写的参考了前人的资料,修复了一些程序中存在的bug,对于中文附件文件名解析的时候会出现需要迭代解码的情况,
写邮箱登陆容易,对邮箱的解析确是一件麻烦的事情
遇到不懂的地方,多用Pycharm调试,看看错在哪
config.ini配置文件
邮箱登陆部分
解析邮件内容部分
写邮箱登陆容易,对邮箱的解析确是一件麻烦的事情
遇到不懂的地方,多用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()
相关文章推荐
- SourceProvider.getJniDirectories
- Linux 自检和 SystemTap
- Trac 中文语言安装
- Python 七步捉虫法
- 软件 bug 的生命周期
- Firefox2中输入框丢失光标bug的解决方法
- 路由器的配置与调试
- 对于技术人员的出现了运行时间错误,是否要进行调试的解决方法
- 使用Ajax实时检测"用户名、邮箱等"是否已经存在
- for命令的一些bug分析
- 邮箱网站不能用mail.xxx.com:8888的方式访问原因
- 修正IE下使用CSS属性overflow的bug
- 解决IE6 3像素Bug的css写法
- hotmail,MSN 邮箱无法登陆的解决方法 秘密通道
- 讲解WordPress开发中一些常用的debug技巧
- 跟我学习JScript的Bug与内存管理
- jQuery实现Email邮箱地址自动补全功能代码
- jquery实现邮箱自动填充提示功能
- JS注释所产生的bug 即使注释也会执行
- JavaScript程序设计之JS调试