この素晴らしいサイトのソリューションをしばらく閲覧/使用した後、ついに私が参加する時が来ました.
私は自分が何を望んでいるのかについてかなり明確なコンセプトを持っていますが、そこにたどり着くための最も良い方法を探しています.
私が欲しいものは?:
しばらくの間、raspberry-pi でメールサーバーのセットアップを使用していますが、これまでのところうまく機能しています。これは、dovecot サーバーと、多数の電子メール アドレスを個別の受信トレイ サブディレクトリに分類するように設定されたいくつかのふるいフィルターで構成されています。また、スクリプトによって毎晩ハムとスパムの違いを教えられるスパムフィルターもあります。(基本的に、スパムはジャンク フォルダにあり、他のすべてのフォルダにはハムが含まれていると教えられます)
専用の「ニュースレター」フォルダーでこの動作を再現したいと思います。このフォルダには、すぐに表示または報告する必要がある緊急のメッセージは含まれていません。
計画では、電子メールを手動で「ニュース」フォルダーに入れ、スクリプトでこのフォルダーを 1 日 1 回スキャンする予定です。ふるいルールのないアドレスからのメールが見つかった場合、このアドレスからのメールを到着時に自動的に「ニュース」フォルダに入れるルールを作成する必要があります。
実現へのステップ:
このために、スクリプトは既存の .dovecot.sieve ファイルをスキャンし、「news-folder」ルールからアドレスを抽出して、比較のために別のファイルまたはオブジェクトにする必要があります。
/*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" "lan@docbrown.pi" { fileinto "INBOX.Lokal"; stop; } /* Newsletter Filter */ elsif anyof (address :is "from" "newsletter@example.com", address :is "from" "news@yahoo.de", address :is "from" "info@mailbox.de", address :is "from" "something@somewhere.de") { fileinto "INBOX.Newsletter"; stop; } /* gmail Account Filter */ elsif address :is "to" "docbrown@gmail.com" { fileinto "INBOX.gmail"; stop; } /* Yahoo Account Filter */ elsif address :is "to" "docbrown@yahoo.de" { fileinto "INBOX.yahoo"; stop; } else { # The rest goes into INBOX # default is "implicit keep", we do it explicitly here keep; }
次に、「news」フォルダの maildir ディレクトリにあるすべての電子メールを処理し、電子メールで「From:」フィールドと尖った括弧で囲まれた電子メール アドレスを検索する必要があります。
Date: Mon, 4 Nov 2013 16:38:30 +0100 (CET) From: Johannes Ebert - Redaktion c't <infoservice@heise.de> To: docbrown@example.de
それらを sieve ファイルから抽出されたアドレスと比較し、アドレスにフィルター ルールがない場合
(たとえば、リストに見つからない場合) は、フィルター ルールを作成します (または単に抽出されたアドレスに追加します)。- すべての電子メールが処理された後、extracted_email_addresses-file を使用して「ニュース」フォルダーの新しいルールセットが作成され
、既存の dovecot.sieve が新しいルールセットに置き換えられます (念のため、古いルールセットは
前にコピーされます)。 - 新しいルールを読み込むために、後で dovecot の再起動も必要になるのでしょうか?
これまでの進捗状況:
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'])
デバッガーなどを備えた Python 用の IDE も推奨できますか? Eclipse が頭に浮かびますか、それとも他に何かありますか (リソースをあまり消費しないかもしれません)。