Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232000
  • 博文数量: 59
  • 博客积分: 2661
  • 博客等级: 少校
  • 技术积分: 732
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-24 11:54
文章分类

全部博文(59)

文章存档

2013年(1)

2012年(8)

2011年(17)

2010年(33)

我的朋友

分类:

2011-04-08 12:01:56

 
前面几篇讲了如何设置postfix,如何编写发送邮件,以及发送的一些原则,但是如何很多EDM都需要统计邮件的发送成功率,到底是哪些拒收,哪些成功发送,成功发送的邮件地址都有哪些等,那么如何对发送邮件的日志进行分析,是一个比较复杂的一个课题,一般来说邮件日志统计有几个方面的难题需要我们解决:
1)数据量大,统计速度缓慢,容易出现内存不足或者错误
2)邮件错误繁多,统计分析不太方便
3)邮件的状态也繁多,统计比较麻烦

Postfix的邮件状态在日志中是:status=XXXXXX
一般来说Postfix的邮件状态有以下几种:
sent 发送成功
deferred 延期发送
bounced 弹回
deferral 延期
reject 拒绝

一般来说,常用的状态就是前面三种,后面的基本很难遇上。

这里提供一个简易的Python程序,抛砖引玉,可以修改支持更多的功能,特别需要提示的此程序只支持Postfix格式的日志,sendmail,qmail不支持

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import sys
import string

#将结果写入文件中
def writeFile(hash,filename):
   content = '';
   for domain,count in hash.items():
     content =content + str(count)+"   "+domain+'\n';
   f = file(filename,'w');
   f.write(content);
   f.close();
#从字符串中解析出Email
def GetMail(str):
   firstIndex = str.index('<');
   lastIndex = str.index('>');
   if firstIndex+1>lastIndex :
     strTmp = '';
   else :
     strTmp = str[firstIndex+1:lastIndex];
   return strTmp.strip();
#从字符串中解析出邮件的状态
def GetStatus(str):
   fromIndex = str.index('status=');
   toIndex = str.index('(');
   if fromIndex+7>toIndex :
       return '';
   else :
       strT = str[fromIndex+7:toIndex];
   pos = str.index('@');
   return str[pos+1:len(str)].strip().lower();
#从Email中解析出邮件域
def GetMailDomain(str):
   pos = str.index('@');
   return str[pos+1:len(str)].strip().lower();
#从标准输入中读取数据
instr = sys.stdin.read();
#按照行进行分隔
content = instr.splitlines();
#获取总共有多少行
length = len(content);
result = '';
status = '';
index = 0;
sent = 0;
deferred = 0;
bounce = 0;
deferral = 0;
reject = 0;
other=0;
sendHash = {};
deferHash = {};
bounceHash = {};
while(length>0) :
 result = GetMail(content[index]);
 #过滤掉一些不再统计范围内的邮件,如果root@localhost.localdomain之类的东西
 if result.find('domain.com')>=0 :
     length-=1;
     index+=1;
 else :
        domain = GetMailDomain(result);
        status = GetStatus(content[index]);
        if status=='sent':
          sent+=1;
          if sendHash.has_key(domain) :
             sendHash[domain] = sendHash[domain]+1;
          else :
             sendHash[domain] = 1;
        elif status=='deferred':
          deferred+=1;
          if deferHash.has_key(domain) :
             deferHash[domain] = deferHash[domain]+1;
          else :
             deferHash[domain] = 1;
        elif status=='bounced':
          bounce+=1;
          if bounceHash.has_key(domain) :
             bounceHash[domain] = bounceHash[domain]+1;
          else :
             bounceHash[domain] = 1;
        elif status=='deferral':
          deferral+=1;
        elif status=='reject':
          reject+=1;
        else :
          other+=1;
        length-=1;
        index+=1;
print 'sent:'+str(sent)+',deferred:'+str(deferred)+',bounce:'+str(bounce)+',deferral='+str(deferral)+',reject='+str(reject)+',other=
'+str(other);
writeFile(sendHash,'sent.txt');
writeFile(deferHash,'defer.txt');
writeFile(bounceHash,'bounce.txt');


此文件的使用:

cat maillog| grep postfix | grep status= | grep to= | ./GetMail.py

说明:
1)首先用cat获取邮件日志的内容
2)过滤其他,只剩下格式是postfix的日志
3)过滤需要解析的行的热
4)过滤有发送邮件Email的内容
5)使用GetMail进行分析

结果:
1)获取所有的邮件的状态的数量
2)生成几个文件,包含不同状态的邮件域的总和,可以通过 cat 文件名 | sort +0 -rn 排序查看
3)稍微修改一下就可以获得所有的成功发送的邮件地址和失败的邮件地址

阅读(3814) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~