无视界-个人小站
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

PYTHON与邮件的一个工作实例

可以在WIN下面任务调度中加入执行,也可以命令行直接执行。

PYTHON与邮件的一个工作实例Win下运行图。

在LINUX下。直接写入/etc/rc.local执行,运行:
PYTHON与邮件的一个工作实例 div