PYTHON与邮件的一个工作实例
因为某应用中需要使用随机前缀的企业邮局,并使用PHP对邮件内容中的某些信息返回,在邮件服务器上设置某域名的,未知用户邮件都转发进另一个邮箱中,所以需要对这个邮箱的内容进行监控,并将结果保存,供PHP调用时返回。初期使用php直接fsockopen调用Pop3端口,对邮件进行遍历,但这样性能效果很差。。容易超时,所以使用python写了监控端。。
#! /usr/bin/python
#-*- coding:utf-8 -*-
# $Id: mail_monitor.py 6903 2012-11-09 11:17:21$
# author : 漠北 QQ4620498
# /upload/2021/11Windows:
SCRIPT_ROOT = os.path.dirname(os.path.realpath(sys.executable)).replace(\, /);
else:
SCRIPT_ROOT = sys.path[0]
class MailAntutu:
emailServer=;
def __init__(self,server,user,password):
self._connect(server,user,password);
def _connect(self,server,user,password):
self.emailServer = poplib.POP3(server)
self.emailServer.user(user)
self.emailServer.pass_(password)
serverWelcome = self.emailServer.getwelcome()
#print serverWelcome
self._do();
self._disconn();
def _disconn(self):
self.emailServer.quit()
def _do(self):
emailMsgNum, emailSize = self.emailServer.stat()
#print 'email number is %d and size is %d'%(emailMsgNum, emailSize)
# 遍历邮件,并对每封邮件的内容进行提取,最后进行删除
for i in range(emailMsgNum):
#读邮件内容
m = self.emailServer.retr(i+1)
#循环写入缓存
buf = cStringIO.StringIO()
for j in m[1]:
print >>buf,j
buf.seek(0)
#使用email对象对缓存文件进行解析
msg = email.message_from_file(buf)
#邮件主题
subject= msg.get(subject);
h = email.Header.Header(subject)
dh = email.Header.decode_header(h)
subject = dh[0][0]
#对主题的字符进行整理。要不然标题会出现乱码
#发件人
from_email=email.utils.parseaddr(msg.get(from))[1] ;
#收件人
to_mail=email.utils.parseaddr(msg.get(to))[1];
#按随机收件人的前缀创建目录
filepath,s=to_mail.split(@)
filepath=SCRIPT_ROOT+/#mails/%s%filepath;
if not os.path.isdir(filepath):
os.mkdir(filepath, 0777);
#写入默认配置文件
if not os.path.exists(%s/mail.xml%filepath):
fp=open(%s/mail.xml%filepath,w+);
fp.write(<?xml version="1.0" encoding="UTF-8?"?><result attachment_url="activate_url="></result>);
fp.close();
#保存邮件附本
fp=open(%s/mail.%d.eml%(filepath,i+1),w+);
for j in m[1]:
fp.write(j+
);
fp.close();
atts=[];
avts=[]
exists_id=[];
for part in msg.walk():
#多分段
if not part.is_multipart():
contenttype = part.get_content_type()
name = part.get_param(name)
#如果有附件,把附件保存到目录中
if name:
filename = part.get_filename()
f = open(%s/%s % (filepath,filename),'wb')
f.write(base64.decodestring(part.get_payload()))
f.close()
atts.append(%s/%s % (filepath.replace(SCRIPT_ROOT,),filename))
#读取邮件正文
else:
body=part.get_payload(decode=True)
result=re.findall(http://www.htcdev.com/?.*,body)
if result!=[]:
s_i=result[0].find(id=)
activate_id=result[0][s_i+3:];
#用编号去一下重。。。
if activate_id not in exists_id:
avts.append(result[0])
exists_id.append(activate_id);
#配置文件内容,根据提取出来的内容进行更改配置文件
xml=open(%s/mail.xml%filepath,r).read();
changed=0;
if atts!=[]:
att=,.join(atts)
xml=re.sub(attachment_url=.*?,attachment_url=+att+,xml);
changed+=1;
if avts!=[]:
avt=,.join(avts)
xml=re.sub(activate_url=.*?,activate_url=+avt+,xml);
changed+=1
if changed>0:
fp=open(%s/mail.xml%filepath,w);
fp.write(xml);
fp.close();
#删除此封邮件,
self.emailServer.dele(i+1)
if __name__ == '__main__':
#同时只允许一个实例
appInstance = ApplicationInstance(SCRIPT_ROOT+/+'#mails/007rom.pid')
t=time.time();
while True:
try:
MailAntutu('mail.sxsxv.com','postmaster@sxsxv.com','a.12345899')
except:
pass;
s=int(time.time()-t);
progressStr=u
The progress runing, %d sec!%s;
sys.stdout.write(progressStr)
sys.stdout.flush()
#等待五秒,再次检查
time.sleep(5);
#remove pid file
appInstance.exitApplication()
然后用PY2EXE编译成EXE
可以在WIN下面任务调度中加入执行,也可以命令行直接执行。
Win下运行图。
在LINUX下。直接写入/etc/rc.local执行,运行:
div