0
0 комментариев

Для поиска писем в логах posfix, попавших в спам, и для просмотра статусов писем использую bash-скрипт (http://pastebin.com/KiE6whN3), написанный давно и, в общем-то, работающим. Но он настолько коряво выглядит, что у меня возникло желание переписать его на python в целях освоения языка. Возник вопрос, как правильнее распарсить строки вида

Jan 18 14:10:51 bserv amavis[6135]: (06135-07) Blocked SPAM, DKIM_ALWAYS LOCAL [79.177.177.224] [79.177.177.224] <sdkjfvbd@googlemail.com> -> <admin@domen.ru>,<ak@domen.ru>,<andreev@domen.ru>,<anna@domen.ru>, quarantine: h/spam-heaZTPfNlk+T.gz, Message-ID: <83566-74095-7MW46NB-CBNYH-310TU-BLCRNA4-5MP@googlemail.com>, mail_id: heaZTPfNlk+T, Hits: 14.037, size: 6648, 8490 ms
Jan 18 14:10:32 bserv postfix/smtpd[6370]: 22BAA11A67: reject: RCPT from bzq-79-177-177-224.red.bezeqint.net[79.177.177.224]: 550 5.1.1 <consul@domen.ru>: Recipient address rejected: User unknown; from=<sdkjfvbd@googlemail.com> to=<consul@domen.ru> proto=ESMTP helo=<bzq-79-177-177-224.red.bezeqint.net>
Jan 18 14:10:34 bserv postfix/smtpd[6602]: connect from f140.i.mail.ru[94.100.178.196]
Jan 18 14:10:35 bserv policyd-spf[6604]: Pass; identity=helo; client-ip=94.100.178.196; helo=f140.i.mail.ru; envelope-from=user1@mail.ru; receiver=user2@domen.ru
Jan 18 14:10:35 bserv policyd-spf[6604]: Pass; identity=mailfrom; client-ip=94.100.178.196; helo=f140.i.mail.ru; envelope-from=user1@mail.ru; receiver=user2@domen.ru
Jan 18 14:10:35 bserv postfix/smtpd[6602]: 1DA9317B42: client=f140.i.mail.ru[94.100.178.196]
Jan 18 14:10:35 bserv postfix/cleanup[6605]: 1DA9317B42: message-id=<1453115433.466351813@f140.i.mail.ru>
Jan 18 14:10:35 bserv postfix/qmgr[3364]: 1DA9317B42: from=<user1@mail.ru>, size=399868, nrcpt=1 (queue active)
Jan 18 14:10:35 bserv postfix/smtpd[6602]: disconnect from f140.i.mail.ru[94.100.178.196]

Пока получился такой скрипт:

#!/usr/bin/python
#-*- coding:utf-8 -*-
 
import os, string, re, sys
 
def Search(a):
    """Поиск в логе"""
    maillog = ['mail.log','mail.log.0']
    s = raw_input('Введите через пробел слова, по которым будем искать:-> ').split(' ')
    s.append(a)
    for files in maillog:
        with open(files) as file:
#           s = raw_input('Введите через пробел слова, по которым будем искать:-> ').split(' ')
#           s.append(a) # перенёс эти 2 строки выше для решения п. 1
            f = []
            for line in file:
                if all(ss in line for ss in s):
                    f.append(line)
        for i in f:
#           print i # было до решения п.2, теперь так:
            if (a == 'spam-'):
                res = i.replace(',', ' ').split(' ') # разрезаем строку, используя в качестве разделителя пробел " "(предварительно запятую "," также заменив на пробел " ") и выводим на экран лишь необходимые нам позиции:
                print res[0]+' '+res[1]+' '+res[2]+'    '+res[13]+' -> '+res[15]+'  SpamID: '+res[18]
            else:
                print i
def Menu():
    """Меню работы с программой"""
    loop = True
    while loop:
    print ("""
        ================================
            Работа с почтой и спамом
        ================================
        1. Поиск письма в папке SPAM
        2. Фильтр FROM-TO
        3. Восстановить из папки SPAM
        4. Добавить адрес в white-list
        5. Выход
        """)
        response = raw_input('ВЫБЕРИТЕ НУЖНЫЙ ПУНКТ -> ')
        if response == '1': # Поиск письма в папке SPAM
            Search(a = 'spam-')
        elif response == '2':   # Фильтр FROM-TO
            Search(a='')
        elif response == '3':   # Восстановить из папки SPAM
            pass
        elif response == '4':   # Добавить адрес в white-list
            pass
        elif response == '5':   # Выход
            loop = False
        else:
            print 'Неверно. Повторите ввод.'
Menu()

На данный момент сложности вот в чём:

  1. [решено] логи хранятся в нескольких файлах, которые скриптом открываются по очереди. К примеру, выбрал пункт 1, ввел адрес и, через пробел, слово «spam-«, проходит поиск в первом файле, потом нужно повторно ввести адрес для поиска во втором файле и т. д.
  2. [решено] не придумал, как вместо целой найденной строки вывести только email’ы и спам ID?

Подскажите, на что надо посмотреть, что исправить в коде?

PS. Сейчас при запуске bash-скрипта поиск выглядит так:

   ВЫБЕРИТЕ НУЖНЫЙ ПУНКТ
1) Поиск письма в папке SPAM
2) Фильтр FROM-TO
3) Восстановить из папки SPAM
4) Добавить адрес в white-list
5) Выход
>> 1
 Введите слово, по которому будем искать:
>> user1@
 
Jan 19 13:09:18 <company@vh59.sweb.ru>  ====> <user1@domen.ru>,     SpamID: H/spam-HCbzcCR1dcGj.gz,
Jan 19 14:40:02 <info@domen2.su>    ====> <user1@domen.ru>,     SpamID: x/spam-x6hiIFUQKAMd.gz,
Jan 19 15:52:44 <user2@mail.ru> ====> <user1@domen.ru>,     SpamID: m/spam-mk95B6TvErQn.gz,
 
     Найдено совпадений:
 Сегодня -   0
 Вчера -     3
 В архиве -  0


Добавить комментарий