Python编程实现及时获取新邮件的方法示例


Posted in Python onAugust 10, 2017

本文实例讲述了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相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python数据类型详解(二)列表
May 08 Python
python模拟事件触发机制详解
Jan 19 Python
在windows下Python打印彩色字体的方法
May 15 Python
Python实现数据可视化看如何监控你的爬虫状态【推荐】
Aug 10 Python
python 阶乘累加和的实例
Feb 01 Python
Flask框架单例模式实现方法详解
Jul 31 Python
Python socket模块方法实现详解
Nov 05 Python
Python如何把多个PDF文件合并代码实例
Feb 13 Python
Window系统下Python如何安装OpenCV库
Mar 05 Python
Python xlwings插入Excel图片的实现方法
Feb 26 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 #Python
Python基础之getpass模块详细介绍
Aug 10 #Python
Python中字典(dict)合并的四种方法总结
Aug 10 #Python
详解Python 模拟实现生产者消费者模式的实例
Aug 10 #Python
Python 操作文件的基本方法总结
Aug 10 #Python
Python 模拟登陆的两种实现方法
Aug 10 #Python
Python 网页解析HTMLParse的实例详解
Aug 10 #Python
You might like
第三章 php操作符与控制结构代码
2011/12/30 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php使用for语句输出三角形的方法
2015/06/09 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
JavaScript中的排序算法代码
2011/02/22 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
基于jQuery实现简单的折叠菜单效果
2015/11/23 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
js防阻塞加载的实现方法
2016/09/09 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
vue、react等单页面项目应该这样子部署到服务器
2018/01/03 Javascript
JavaScript中字符串的常用操作方法及特殊字符
2018/03/18 Javascript
vue 弹框产生的滚动穿透问题的解决
2018/09/21 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
2019/05/01 Javascript
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python中转换角度为弧度的radians()方法
2015/05/18 Python
Python对CSV、Excel、txt、dat文件的处理
2018/09/18 Python
django表单的Widgets使用详解
2019/07/22 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
巴基斯坦购物网站:Goto
2019/03/11 全球购物
如何强制垃圾回收
2015/10/06 面试题
c++工程师面试问题
2013/08/04 面试题
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
2014年教师节国旗下讲话稿
2014/09/10 职场文书
一年级小学生评语大全
2014/12/25 职场文书
七一建党节慰问信
2015/02/14 职场文书
介绍信范文大全
2015/05/07 职场文书
2015年小学英语教师工作总结
2015/05/12 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
从np.random.normal()到正态分布的拟合操作
2021/06/02 Python