博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 获取邮箱附件
阅读量:4161 次
发布时间:2019-05-26

本文共 4387 字,大约阅读时间需要 14 分钟。

使用方法 /usr/bin/python2.7  ./getMail.py  <邮件标题>

代码里有个base_save_path是附件存放的目录,可以改成其它路径。

getMail.py代码:

#!/usr/bin/python2.7# _*_ coding: utf-8 _*_  import poplibimport emailimport sysfrom email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddr  def decode_str(s):  value, charset = decode_header(s)[0]  if charset:    value = value.decode(charset)  return value  def guess_charset(msg):  # 先从msg对象获取编码:  charset = msg.get_charset()  if charset is None:    # 如果获取不到,再从Content-Type字段获取:    content_type = msg.get('Content-Type', '').lower()    pos = content_type.find('charset=')    if pos >= 0:      charset = content_type[pos + 8:].strip()  return charset  def get_email_headers(msg):  # 邮件的From, To, Subject存在于根对象上:  headers = {}  for header in ['From', 'To', 'Subject', 'Date']:    value = msg.get(header, '')    if value:      if header == 'Date':        headers['date'] = value      if header == 'Subject':        # 需要解码Subject字符串:        subject = decode_str(value)        headers['subject'] = subject      else:        # 需要解码Email地址:        hdr, addr = parseaddr(value)        name = decode_str(hdr)        value = u'%s <%s>' % (name, addr)        if header == 'From':          from_address = value          headers['from'] = from_address        else:          to_address = value          headers['to'] = to_address  content_type = msg.get_content_type()  print 'head content_type: ', content_type  return headers  # indent用于缩进显示:def get_email_cntent(message, base_save_path):  j = 0  content = ''  attachment_files = []  for part in message.walk():    j = j + 1    file_name = part.get_filename()    contentType = part.get_content_type()    # 保存附件    if file_name: # Attachment      # Decode filename      h = email.Header.Header(file_name)      dh = email.Header.decode_header(h)      filename = dh[0][0]      if dh[0][1]: # 如果包含编码的格式,则按照该格式解码        filename = unicode(filename, dh[0][1])        filename = filename.encode("utf-8")      data = part.get_payload(decode=True)      att_file = open(base_save_path + filename, 'wb')      attachment_files.append(filename)      att_file.write(data)      att_file.close()    elif contentType == 'text/plain' or contentType == 'text/html':      # 保存正文      data = part.get_payload(decode=True)      charset = guess_charset(part)      if charset:        charset = charset.strip().split(';')[0]        print 'charset:', charset        data = data.decode(charset)      content = data  return content, attachment_files  if __name__ == '__main__':  # 输入邮件地址, 口令和POP3服务器地址:  emailaddress = '邮箱地址'  # 注意使用开通POP,SMTP等的授权码  password = '密码'  pop3_server = 'pop.163.com'   # 连接到POP3服务器:  server = poplib.POP3(pop3_server)  # 可以打开或关闭调试信息:  # server.set_debuglevel(1)  # POP3服务器的欢迎文字:  print server.getwelcome()  # 身份认证:  server.user(emailaddress)  server.pass_(password)  # stat()返回邮件数量和占用空间:  messagesCount, messagesSize = server.stat()  print 'messagesCount:', messagesCount  print 'messagesSize:', messagesSize  '''  # list()返回所有邮件的编号:  resp, mails, octets = server.list()  print '------ resp ------'  print resp # +OK 46 964346 响应的状态 邮件数量 邮件占用的空间大小  print '------ mails ------'  print mails # 所有邮件的编号及大小的编号list,['1 2211', '2 29908', ...]  print '------ octets ------'  print octets  # 获取最新一封邮件, 注意索引号从1开始:  length = len(mails)  for i in range(length):    resp, lines, octets = server.retr(i + 1)  '''   # 获取最新一封邮件, 注意索引号从1开始:  #length = len(mails)  #for i in range(length):  for i in range(messagesCount, -1, -1):    resp, lines, octets = server.retr(i)    #resp, lines, octets = server.retr(messagesCount)    # lines存储了邮件的原始文本的每一行,    # 可以获得整个邮件的原始文本:    msg_content = '\n'.join(lines)    # 把邮件内容解析为Message对象:    msg = Parser().parsestr(msg_content)       # 但是这个Message对象本身可能是一个MIMEMultipart对象,即包含嵌套的其他MIMEBase对象,    # 嵌套可能还不止一层。所以我们要递归地打印出Message对象的层次结构:    print '---------- 解析之后 ----------'    base_save_path = '/etc/cron.d/'    msg_headers = get_email_headers(msg)    #print 'subject:', msg_headers['subject']    #print 'from_address:', msg_headers['from']    #print 'to_address:', msg_headers['to']    #print 'date:', msg_headers['date']    print 'argv[i]', sys.argv[1]    if msg_headers['subject'] == sys.argv[1] :      content, attachment_files = get_email_cntent(msg, base_save_path)      break      #print 'content:', content    #print 'attachment_files: ', attachment_files   # 关闭连接:  server.quit()

 

转载地址:http://poixi.baihongyu.com/

你可能感兴趣的文章
方兴东:中国网站十年
查看>>
2010年微软和谷歌十大战场:从桌面到浏览器
查看>>
服务器虚拟化的未来之路
查看>>
写给我们这些浮躁的系统工程师
查看>>
和平分手?你根本不知道吴恩达在百度经历了什么
查看>>
业余研究:关于腾讯与他的QQ帝国
查看>>
马云校长湖畔大学第三期讲义完整版
查看>>
iPhone为什么比Android好
查看>>
小程序的今天就是微信指数的明天
查看>>
从互联网到人工智能,BAT这七年来到底做了什么
查看>>
2012年十大科技趋势:Siri将震惊世界
查看>>
2017(第十届)中国绿公司年会马云演讲
查看>>
李彦宏:睡不着觉不是因对手
查看>>
从手Q与微信之争,看腾讯内在的真实矛盾与战略
查看>>
移动互联网的七宗败案
查看>>
互联网十大失败案
查看>>
小米颓势已现,生死劫命悬手机
查看>>
三大隐忧 三星未来路在何方?
查看>>
linux下各种进制转化最简单的的命令行
查看>>
结构体和联合体
查看>>