当前位置:   article > 正文

python 读取eml或者imap 读取邮件时图片处理记录

python email库eml解析image

使用python读取eml文件或者远程imap读取邮件时,邮件里面有内嵌图片,源地址是 img src=3D"cid:_Foxmail.1@bebb7=cba-548d-cdd3-c8df-af59616af7cc" 之类的,可以在读取邮件时将图片保存到缓存目录,然后将邮件内容里面的src源地址替换为刚才保存的路径,折腾半天实现了效果,记录下过程

  1. import imaplib,email
  2. import quopri
  3. from email.mime.text import MIMEText
  4. from flask import Response
  5. from flask import make_response
  6. @app.route('/')
  7. def index():
  8. conn = imaplib.IMAP4("127.0.0.1",143)
  9. conn.login("user@domain.ld","password")
  10. conn.select("INBOX")
  11. ''' python3 要使用str() 否则提示 TypeError: can't concat bytes to int '''
  12. stat,data = conn.fetch(str(2),'(RFC822)')
  13. if stat != "OK" or data is None:
  14. raise KeyError
  15. ''' 转为message对象,python2使用email.message_from_string '''
  16. msg = email.message_from_bytes(data[0][1])
  17. attlist= {}
  18. for part in msg.walk():
  19. if not part.is_multipart():
  20. file = part.get_filename() #附件名
  21. ''' filename = email.header.decode_header(filename) ==> [(b'\xe5\x8a\xb3\xe5\x8a\xa8\xe6\xb3\x95.png', 'utf-8')] '''
  22. if file:
  23. filename = email.header.decode_header(file)[0][0] #附件名
  24. charset = email.header.decode_header(file)[0][1] #编码
  25. if part.get_all("Content-ID"):
  26. content_id = part.get_all("Content-ID")[0][1:-1]
  27. else:
  28. content_id = "" #附件ID,也就是邮件源码里面的cid
  29. ''' 多个附件时将附件名和ID对应保存到dict里面,后面将正文中的cid替换为本地保存路径 '''
  30. attlist[content_id] = filename
  31. ''' 附件文件名为中文或有编码的时候要进行转码 '''
  32. if str(charset) != "None":
  33. filename = filename.decode(charset)
  34. filedata = part.get_payload(decode=True) # 附件内容
  35. ''' 把附件写到文件里面,附件一定要用wb打开,二进制 '''
  36. with open("/temp/"+filename,"wb") as fw:
  37. fw.write(filedata)
  38. fw.close()
  39. else:
  40. content = part.get_payload(decode=True) # 邮件正文
  41. contentd = content.decode()
  42. for x,y in attlist.items():
  43. ''' 替换cid '''
  44. contentd = contentd.replace('cid:'+x,'static/temp/'+y)
  45. return Response(quopri.decodestring(contentd),content_type="text/html; charset=%s" %charset) ##使用quopri转码,不然不能转码源码中的=OA 等字符,为防止乱码,在response时返回邮件内容中的编码

转载于:https://my.oschina.net/hxily/blog/618887

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/1003810
推荐阅读
相关标签
  

闽ICP备14008679号