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='xxxx@yyy.com'
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()