py 收邮件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | import poplib import sys from importlib import reload from email.parser import Parser from email.parser import BytesParser from email.header import decode_header from email.utils import parseaddr import email.iterators #解析消息头中的字符串 def decode_str(s): value, charset = decode_header(s)[ 0 ] if charset: value = value.decode(charset) return value #将邮件附件或内容保存至文件 #即邮件中的附件数据写入附件文件 def savefile(filename, data, path): try : filepath = path + filename print ( 'Save as: ' + filepath) f = open (filepath, 'wb' ) except : print (filepath + ' open failed' ) #f.close() else : f.write(data) f.close() #获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找 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 #解析邮件的函数,首先打印收件人、发件人、标题 #然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次) #邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录 #由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码 #如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容 def print_info(msg): 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(addr) value = name + ' < ' + addr + ' > ' print (header + ':' + value) for part in msg.walk(): filename = part.get_filename() content_type = part.get_content_type() charset = guess_charset(part) if filename: filename = decode_str(filename) data = part.get_payload(decode = True ) if filename ! = None or filename ! = '': print ( 'Accessory: ' + filename) savefile(filename, data, mypath) else : email_content_type = '' content = '' if content_type = = 'text/plain' : email_content_type = 'text' elif content_type = = 'text/html' : email_content_type = 'html' if charset: content = part.get_payload(decode = True ).decode(charset) print (email_content_type + ' ' + content) email = r 'test@qq.com' password = r 'password' pop3_server = r 'pop.qq.com' mypath = 'D://email/' server = poplib.POP3(pop3_server, 110 ) #print(server.getwelcome()) server.user(email) server.pass_(password) print ( 'Message: %s. Size: %s' % server.stat()) resp, mails, objects = server. list () #print(mails) index = len (mails) #取出某一个邮件的全部信息 resp, lines, octets = server.retr(index) #邮件取出的信息是bytes,转换成Parser支持的str lists = [] for e in lines: lists.append(e.decode()) msg_content = '\r\n' .join(lists) msg = Parser().parsestr(msg_content) print_info(msg) #server.dele(index) #提交操作信息并退出 server.quit() |
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!