Python编程实现及时获取新邮件的方法示例
本文实例讲述了Python编程实现及时获取新邮件的方法。分享给大家供大家参考,具体如下:
#-*-encoding:utf-8-*- importsys importlocale importpoplib fromemailimportparser importemail importstring importmysql.connector importtraceback importdatetime frommysql.connectorimporterrorcode importtime importre reload(sys); sys.setdefaultencoding('utf8'); #确定运行环境的encoding __g_codeset=sys.getdefaultencoding() if"ascii"==__g_codeset: __g_codeset='utf8'; # defobject2double(obj): if(obj==Noneorobj==""): return0 else: returnfloat(obj) #endif # defgetMailIndex(): file=open('mailindex.txt',"r"); lines=file.readlines(); file.close(); returnint(lines[0]); # defsetMailIndex(index): f=open('mailindex.txt','w'); f.write(index); f.close(); # defutf8_to_mbs(s): returns.decode("utf-8").encode(__g_codeset) # defutf8_to_gbk(s): returns.decode("utf-8").encode('gb2312') # defmbs_to_utf8(s): returns.decode(__g_codeset).encode("utf-8") # defgbk_to_utf8(s): returns.decode('gb2312').encode("utf-8") # def_queryQuick(cu,sql,tuple): try: cu.execute(sql,tuple); rows=[] forrowincu: rows.append(row) # returnrows except: print(traceback.format_exc()) #end # #获取信息 def_queryRows(cu,sql): try: cu.execute(sql) rows=[] forrowincu: rows.append(row) # returnrows except: print(traceback.format_exc()) #end # #是否有新邮件 globalhasNewMail; hasNewMail=True; #全局已读的邮件数量 globalglobalMailReaded; globalMailReaded=getMailIndex()+1; #获取新邮件 defgetNewMail(conn2,cur2): try: globalhasNewMail; globalglobalMailReaded; conn2.commit(); rows=_queryRows(cur2,"selectcount(*)asmessage_countfromhm_messageswheremessageaccountid=1"); message_count=rows[0][0]; if(hasNewMail): print('readmailindex.txt') globalMailReaded=getMailIndex()+1; #endif if(message_count<=globalMailReaded): hasNewMail=False; #print('Didnotreceivenewmail,continuewait...') returnNone;#没新邮件,直接返回 #endif #登陆邮箱 host='127.0.0.1' username='username@myserver.net' password='password' pop_conn=poplib.POP3(host) #printpop_conn.getwelcome() pop_conn.user(username); pop_conn.pass_(password); #Getmessagesfromserver: messages=[pop_conn.retr(i)foriinrange(1,len(pop_conn.list()[1])+1)] #Concatmessagepieces: messages=["\n".join(mssg[1])formssginmessages] #Parsemessageintomanemailobject: messages=[parser.Parser().parsestr(mssg)formssginmessages] print("getnewmail!"); printpop_conn.stat() print('%sreadedmailcountis%d,allmailcountis:%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 forpartinmessage.walk(): j=j+1 fileName=part.get_filename() contentType=part.get_content_type() mycode=part.get_content_charset(); #保存附件 iffileName: pass; elifcontentType=='text/plain':#orcontentType=='text/html': #保存正文 data=part.get_payload(decode=True) content=str(data); ifmycode=='gb2312': content=gbk_to_utf8(content) #endif content=content.replace(u'\u200d',''); setMailIndex(str(globalMailReaded)); hasNewMail=True; pop_conn.quit(); return(content,email.utils.parseaddr(message.get('from'))[1]); #endif #endfor except: print("searchhmailserverfail,tryagain"); returnNone; finally: pass; #endtry #enddef #连接数据库 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('DidnotsearchMySQL,continueloop...') time.sleep(0.5) continue; #endif (article,origin)=mailtuple; #endwhile
更多关于Python相关内容可查看本站专题:《PythonSocket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。