• 技术文章 >后端开发 >Python教程

    Python实现获取及时邮件的方法

    巴扎黑巴扎黑2017-08-12 14:37:31原创2761

    这篇文章主要介绍了Python编程实现及时获取新邮件的方法,涉及Python实时查询邮箱及邮件获取相关操作技巧,需要的朋友可以参考下

    本文实例讲述了Python编程实现及时获取新邮件的方法。分享给大家供大家参考,具体如下:


    #-*- encoding: utf-8 -*-
    import sys
    import locale
    import poplib
    from email import parser
    import email
    import string
    import mysql.connector
    import traceback
    import datetime
    from mysql.connector import errorcode
    import time
    import re
    reload(sys);
    sys.setdefaultencoding('utf8');
    # 确定运行环境的encoding
    __g_codeset = sys.getdefaultencoding()
    if "ascii"==__g_codeset:
      __g_codeset = 'utf8';
    #
    def object2double(obj):
      if(obj==None or obj==""):
        return 0
      else:
        return float(obj)
      #end if
    #
    def getMailIndex():
      file = open('mailindex.txt',"r");
      lines = file.readlines();
      file.close();
      return int(lines[0]);
    #
    def setMailIndex(index):
      f = open('mailindex.txt', 'w');
      f.write(index);
      f.close();
    #
    def utf8_to_mbs(s):
      return s.decode("utf-8").encode(__g_codeset)
    #
    def utf8_to_gbk(s):
      return s.decode("utf-8").encode('gb2312')
    #
    def mbs_to_utf8(s):
      return s.decode(__g_codeset).encode("utf-8")
    #
    def gbk_to_utf8(s):
      return s.decode('gb2312').encode("utf-8")
    #
    def _queryQuick(cu,sql,tuple):
      try:
        cu.execute(sql,tuple);
        rows = []
        for row in cu:
          rows.append(row)
        #
        return rows
      except:
        print(traceback.format_exc())
      #end
    #
    #获取信息
    def _queryRows(cu,sql):
      try:
        cu.execute(sql)
        rows = []
        for row in cu:
          rows.append(row)
        #
        return rows
      except:
        print(traceback.format_exc())
      #end
    #
    #是否有新邮件
    global hasNewMail;
    hasNewMail=True;
    #全局已读的邮件数量
    global globalMailReaded;
    globalMailReaded=getMailIndex()+1;
    #获取新邮件
    def getNewMail(conn2,cur2):
      try:
        global hasNewMail;
        global globalMailReaded;
        conn2.commit();
        rows=_queryRows(cur2,"select count(*) as message_count from hm_messages where messageaccountid=1");
        message_count=rows[0][0];
        if(hasNewMail):
          print('read mailindex.txt')
          globalMailReaded=getMailIndex()+1;
        #end if
        if(message_count<=globalMailReaded):
          hasNewMail=False;
          #print('Did not receive new mail,continue wait...')
          return None;#没新邮件,直接返回
        #end if
        #登陆邮箱
        host = '127.0.0.1'
        username = 'username@myserver.net'
        password = 'password'
        pop_conn = poplib.POP3(host)
        #print pop_conn.getwelcome()
        pop_conn.user(username);
        pop_conn.pass_(password);
        #Get messages from server:
        messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)]
        # Concat message pieces:
        messages = ["\n".join(mssg[1]) for mssg in messages]
        #Parse message intom an email object:
        messages = [parser.Parser().parsestr(mssg) for mssg in messages]
        print("get new mail!");
        print pop_conn.stat()
        print('%s readed mail count is %d,all mail count is: %d'%(datetime.datetime.now().strftime("%y-%m-%d %H:%M:%S"),globalMailReaded,len(messages)))
        message = messages[globalMailReaded];
        subject = message.get('subject')
        h = email.Header.Header(subject)
        dh = email.Header.decode_header(h)
        #subject = unicode(dh[0][0], dh[0][1]).encode('utf8')
        #print >> f, "Date: ", message["Date"]
        #print >> f, "From: ", email.utils.parseaddr(message.get('from'))[1]
        #print >> f, "To: ", email.utils.parseaddr(message.get('to'))[1]
        #print >> f, "Subject: ", subject
        j = 0
        for part in message.walk():
          j = j + 1
          fileName = part.get_filename()
          contentType = part.get_content_type()
          mycode=part.get_content_charset();
          # 保存附件
          if fileName:
            pass;
          elif contentType == 'text/plain':# or contentType == 'text/html':
            #保存正文
            data = part.get_payload(decode=True)
            content=str(data);
            if mycode=='gb2312':
              content= gbk_to_utf8(content)
            #end if
            content=content.replace(u'\u200d','');
            setMailIndex(str(globalMailReaded));
            hasNewMail=True;
            pop_conn.quit();
            return (content,email.utils.parseaddr(message.get('from'))[1]);
          #end if
        #end for
      except:
        print("search hmailserver fail,try again");
        return None;
      finally:
        pass;
      #end try
    #end def
    #连接数据库
    conn2 = mysql.connector.connect(user='root', password='password',host='127.0.0.1',database='hmailserver',charset='gb2312');
    cur2 = conn2.cursor();
    #只要收到电子邮件,就把这个事件记录在事件库中
    #现在就是循环查询邮箱,如果有新邮件就读取,并查询关键词库
    while(True):
      mailtuple=getNewMail(conn2,cur2);
      if(mailtuple==None):
        #print('Did not search MySQL,continue loop...')
        time.sleep(0.5)
        continue;
      #end if
      (article,origin)=mailtuple;
    #end while

    以上就是Python实现获取及时邮件的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Python 邮件 及时
    上一篇:python如何利用lxml对xml进行读写操作教程 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • python字典添加元素的方法是什么• python中“+=”是什么意思• python怎么保留两位小数• python是面向对象还是面向过程• python中怎么合并两个列表
    1/1

    PHP中文网