使用python接收邮件

Python是一个非常有趣的语言,拥有强大的类库,简单的语法,可以说使用python编写测试程序非常方便。近来研究邮件安全技术时编写了一个接收测试脚本,各位可根据自己的需要进行修改。这里推荐一款邮件透明加密产品,天御云安的隐秘邮。使用高强度加密技术,部署及其简单,不影响用户原来的使用习惯,客户完全感知不到,但是邮件传到服务器却加了密。网址: https://mail.tyyunan.com/

# coding=utf-8
import time
import poplib
import pickle
import email,string,sys,os
from email.header import Header
from email.header import decode_header
from time import strptime, strftime
from email.parser import Parser
import hashlib
import os
import difflib  
file_dir = os.getcwd()
ISOTIMEFORMAT="%Y-%m-%d %X"


#定义邮件服务器常量
POP3Sever='192.168.11.22'
POP3User='[email protected]'
POP3Password='123456'



def save_file(file_name,data):
    try:
        with open(file_name, 'wb') as fp:
            fp.write(data)
    except Exception as e:
        print('save file error:[{0}]'.format(e))
        raise

def save_file_diff(file_path,file_name,str_1,str_2):
    try:
        with open(file_name, 'wb') as fp:
            fp.write(data)
    except Exception as e:
        print('save file error:[{0}]'.format(e))
        raise
        
def writelog(log):
    with open(file_dir+os.path.sep+'log.txt', 'a+') as fp:
        fp.write(log+'\n')

def out_debug(file_name,info):
    with open(file_name, 'a+') as fp:
        fp.write('['+info+']\n')



def get_file_md5(filename):    
    if not os.path.isfile(filename):
        return None
    hash_data = hashlib.md5()    
    try:
        with open(filename, 'rb') as fp:
            while True:
                data = fp.read(2)
                if not data:break
                hash_data.update(data)
    except Exception as e:
        print('read file error:[{0}]'.format(e))
        raise
    return hash_data.hexdigest()





def parse_mail(mail):
    for part in mail.walk():
        file_name = part.get_filename()
        if not file_name:
            continue
        if part.get_content_maintype() == 'text': 
            file_path = os.path.join(os.path.dirname(file_dir),'smtp-client'+os.path.sep+'mail_text'+os.path.sep+file_name) 
        elif part.get_content_maintype() == 'application':
            file_path = os.path.join(os.path.dirname(file_dir),'smtp-client'+os.path.sep+'mail_attach'+os.path.sep+file_name) 	
        print(file_path)
        old_md5 = get_file_md5(file_path)        
        
        file_path = file_dir+os.path.sep+'tmp_file'+os.path.sep+file_name
        mail_data = part.get_payload(decode=True)
        #print(mail_data)
        save_file(file_path,mail_data)      
        new_md5 = get_file_md5(file_path)
        print(file_path)
        #os.remove(file_path)

        try:
            if new_md5.upper() == old_md5.upper():
                print('new_md5==old_md5|file name is [%s]'%file_name)
                print('new md5 is [%s] \nold md5 is [%s]\n'%(new_md5.upper(),old_md5.upper()))
                continue
            else:
                print('new_md5!=old_md5|file name is [%s]'%file_name)
                print('new md5 is [%s] \nold md5 is [%s]\n'%(new_md5.upper(),old_md5.upper()))
                return False     
        except:
            raise
    print('---------------------------------------')
    return True
def main():
    t=time.strftime( ISOTIMEFORMAT, time.localtime())
    success_num = 0
    fail_num = 0
    popClient=poplib.POP3_SSL(POP3Sever,"995")
    #popClient=poplib.POP3(POP3Sever,"110")
    popClient.set_debuglevel(1)
    popClient.user(POP3User)
    popClient.pass_(POP3Password)
    
    numMsgs,mboxSize=popClient.stat()
    print("numMsgs:[%d];mboxSize:[%d]\n"%(numMsgs,mboxSize))
    resp, mails, octets = popClient.list()
    for id in range (numMsgs):
        hdr,message,octet=popClient.retr(id+1)      
        lists = []
        for e in message:
            try:
                lists.append(e.decode('utf-8'))
            except:
                print("use other decode\n")
                lists.append(e.decode('gb2312'))
        mail = Parser().parsestr('\r\n'.join(lists))
        if parse_mail(mail):
            success_num += 1
            popClient.dele( id+1 )
        else:
            fail_num += 1
            #popClient.dele( id+1 )
        writelog('success:%d  fail:%d'% (success_num, fail_num) )
        #break
    #writelog('success:%d  fail:%d'% (success_num, fail_num) )
    t=time.strftime( ISOTIMEFORMAT, time.localtime()) 
    writelog('----------------popClient.quit---------------------now time is[%s]'%t)
    popClient.quit()
    
if __name__ == '__main__':      
    main()

你可能感兴趣的:(邮件安全)