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结合API实现即时天气信息
Jan 19 Python
python 循环遍历字典元素的简单方法
Sep 11 Python
利用python程序帮大家清理windows垃圾
Jan 15 Python
Mac 上切换Python多版本
Jun 17 Python
Python实现查找最小的k个数示例【两种解法】
Jan 08 Python
Python正则表达式实现简易计算器功能示例
May 07 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
新手学python应该下哪个版本
Jun 11 Python
scrapy redis配置文件setting参数详解
Nov 18 Python
python 用pandas实现数据透视表功能
Dec 21 Python
python实现三种随机请求头方式
Jan 05 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 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 addslashes和mysql_real_escape_string
2010/01/24 PHP
php记录代码执行时间(实现代码)
2013/07/05 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php strftime函数的详细用法
2018/06/21 PHP
JavaScript delete 属性的使用
2009/10/08 Javascript
jQuery的初始化与对象构建之浅析
2011/04/12 Javascript
jquery中文乱码的多种解决方法
2013/06/21 Javascript
Jquery选中或取消radio示例
2013/09/29 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
详解VUE 定义全局变量的几种实现方式
2017/06/01 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
matplotlib savefig 保存图片大小的实例
2018/05/24 Python
Python占用的内存优化教程
2019/07/28 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
web字体加载方案优化小结
2019/11/29 HTML / CSS
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
岗位竞聘演讲稿
2014/01/10 职场文书
网上开商店的创业计划书
2014/01/19 职场文书
个人党性剖析材料
2014/02/03 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
材料员岗位职责
2014/03/13 职场文书
给校长的建议书作文300字
2015/09/14 职场文书
Python实现byte转integer
2021/06/03 Python
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
javascript的setTimeout()使用方法总结
2021/11/20 Javascript