после просмотра/использования решений на этом замечательном сайте в течение некоторого времени, наконец, пришло время для меня принять участие.
У меня есть довольно четкое представление о том, чего я хочу, но я ищу лучший способ добиться этого.
Что мне нужно?
В течение некоторого времени я использую настройку почтового сервера на raspberry-pi, пока она отлично работает. Он состоит из сервера dovecot и некоторых ситовых фильтров, настроенных для сортировки моих многочисленных адресов электронной почты в отдельные подкаталоги входящих сообщений. Существует также спам-фильтр, который каждую ночь обучается разнице между хамом и спамом с помощью скрипта. (В основном его учат, что спам находится в папке нежелательной почты, а в любой другой папке есть ветчина)
Я хотел бы воспроизвести это поведение для специальной папки «Информационный бюллетень». Эта папка не содержит срочных сообщений, которые нужно немедленно просмотреть или сообщить.
План состоит в том, чтобы вручную помещать электронные письма в папку «новости» и запускать скрипт, сканирующий эту папку один раз в день. Если он находит электронное письмо с адреса, для которого нет правила фильтрации, он должен создать правило для автоматического помещения писем с этого адреса в папку «новости» по прибытии.
Шаги к реализации?:
Для этого скрипт должен будет просканировать существующий файл .dovecot.sieve, извлечь адреса из правила «папка новостей» в отдельный файл или объект для сравнения.
/*Example of a sieve filter:*/ require "fileinto"; /* Global Spam Filter */ if anyof (header :contains "subject" "*SPAM*", header :contains "X-Spam-Flag" "YES" ) { fileinto "Junk"; stop; } /* LAN Emails Filter */ elsif address :is "to" "[email protected]" { fileinto "INBOX.Lokal"; stop; } /* Newsletter Filter */ elsif anyof (address :is "from" "[email protected]", address :is "from" "[email protected]", address :is "from" "[email protected]", address :is "from" "[email protected]") { fileinto "INBOX.Newsletter"; stop; } /* gmail Account Filter */ elsif address :is "to" "[email protected]" { fileinto "INBOX.gmail"; stop; } /* Yahoo Account Filter */ elsif address :is "to" "[email protected]" { fileinto "INBOX.yahoo"; stop; } else { # The rest goes into INBOX # default is "implicit keep", we do it explicitly here keep; }
Затем ему нужно будет обработать все электронные письма в каталоге maildir папки «новости» и найти в электронных письмах поле «От:» и адрес электронной почты, заключенный в заостренные скобки.
Date: Mon, 4 Nov 2013 16:38:30 +0100 (CET) From: Johannes Ebert - Redaktion c't <[email protected]> To: [email protected]
сравните их с извлеченными адресами из файла sieve и, если адрес не имеет правила фильтрации
(например, не найден в списке), создайте его для него (или просто добавьте его к извлеченным адресам)- после обработки всех электронных писем будет создан новый набор правил для папки "новости" с файлом
extracted_email_addresses-file, а существующий файл dovecot.sieve будет заменен новым (старый
будет скопирован ранее, на всякий случай) - может быть, после этого потребуется перезапустить голубятню, чтобы прочитать новые правила?
Прогресс на данный момент:
Я попытался заставить это работать, просто используя команды и утилиты bash. Это приблизило меня к моменту, когда я почти смог извлечь адреса электронной почты из файла dovecot.sieve, но, на мой вкус, это было довольно сложно и заняло некоторое время.
#!/bin/sh
cp /home/mailman/.dovecot.sieve /home/mailman/autosieve/dovecot.sieve_`date +backup_%d%m%Y`
#echo "" > search.txt
X=grep -n "Newsletter Filter" /home/mailman/.dovecot.sieve #get rule start line number, some magic needs to happen here to just apply the numbers and not the full output by grep
Y=grep -n "INBOX.Newsletter" /home/mailman/.dovecot.sieve #get rule end line number
$X++ #increment to go into the next line
$Y-- #decrement to go into the previous line
sed -n ‘$X,$Yp’ /home/mailman/.dovecot.sieve > /home/mailman/search.txt #copy lines into separate search_file
less /home/mailman/search.txt | awk -F '"' '{ if ($2 != "") print $4 }' > /home/mailman/adressen.txt # filter addresses and export to separate file
Поэтому я подумал, не смогу ли я добраться туда проще, возможно, используя python. Я возился с ним в другом малиновом проекте, но у меня не было времени полностью погрузиться во вселенную Python.
Так что я был бы рад небольшой помощи/совету/указанию в правильном направлении здесь.
До сих пор я нашел несколько решений для аналогичной проблемы (для первой части), где было необходимо извлечение, но я не смог его полностью адаптировать или сделал некоторые ошибки, так как не мог выполнить скрипт.
#!/usr/bin/python
file = open("dovecot.sieve", "r")
rule = {}
current_rule = None
for line in file:
line = line.split()
if (line[2] == "INBOX.Newsletter"):
break
if (line[1] == "/* Newsletter Filter */"):
current_rule = rule.setdefault('Newsletter', [])
continue
if (line[5] == "from"):
current_rule.append(line[6])
continue
if (line[3] == "from"):
current_rule.append(line[4])
continue
file.close()
# Now print out all the data
import pprint
print "whole array"
print "=============================="
pprint.pprint(rule)
print
print "addresses found"
print "=========================="
pprint.pprint(rule['Newsletter'])
Может ли кто-нибудь также порекомендовать IDE для python с отладчиком и т. Д.? Eclipse пришел бы мне на ум, или есть что-то еще (может быть, не такое ресурсоемкое)?