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 相关文章推荐
Python3读取zip文件信息的方法
May 22 Python
详解详解Python中writelines()方法的使用
May 25 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
TensorFlow数据输入的方法示例
Jun 19 Python
python顺序的读取文件夹下名称有序的文件方法
Jul 11 Python
Windows下python3.7安装教程
Jul 31 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python打开windows应用程序的实例
Jun 28 Python
python简单实现矩阵的乘,加,转置和逆运算示例
Jul 10 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
Django中和时区相关的安全问题详解
Oct 12 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
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP闭包实例解析
2014/09/08 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
用PHP代码在网页上生成图片
2015/07/01 PHP
jquery中获得$.ajax()事件返回的值并添加事件的方法
2010/04/15 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
解析dom中的children对象数组元素firstChild,lastChild的使用
2013/07/10 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
一个仿糯米弹框效果demo
2014/07/22 Javascript
浅谈jQuery中setInterval()方法
2015/07/07 Javascript
详解JavaScript对象类型
2016/06/16 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
vue嵌套路由与404重定向实现方法分析
2018/05/04 Javascript
vue1.0和vue2.0的watch监听事件写法详解
2018/09/11 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[57:37]EG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
使用python将mysql数据库的数据转换为json数据的方法
2019/07/01 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
如何在Python 游戏中模拟引力
2020/03/27 Python
Python @property及getter setter原理详解
2020/03/31 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
机械专业毕业生推荐信范文
2013/11/25 职场文书
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
2015年会计人员工作总结
2015/05/22 职场文书
golang中切片copy复制和等号复制的区别介绍
2021/04/27 Golang