python读取邮件_Python实现获取及时邮件的方法

这篇文章主要介绍了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值