Sieveなどを使用せずに、メールサーバー上のimapフォルダーで文字を並べ替える

オフィスのメールが拡大し、1人以上の従業員の1つ以上の職場で、通常のファイルでmysqlを使用せずにexim + teapopに基づくマルチドメインメールサーバーの最も単純な実装以上が必要になり始めました。 変更の主な理由は、スパムを絶えず除去し、各職場で単純に不要な電子メールが何度も出始めたことであり、キツネの有名な記事「Link Exim and courier-imap 」に従って同じメールを実装することが決定されました。 必要なものが欠けていた最も重要なことは、フォルダごとのメッセージソーターでした。 メーリングリストに登録している人にとって、必要なディレクトリにレターを配置することは非常に便利です。そのため、次のようにします。a)各クライアントにソーターを書き込まない。 b)メールクライアントと同様に、Web経由でメールにアクセスするときと同じフォルダー構造を持っている。



インターネットに関する大雑把な(そしてやや面倒な)研究では、文字のソートはさまざまなSieveスクリプトを使用してのみ提供されることが示されました。 しかし、私の意見では、これはユーザー(電子メールクライアントなど)ではなく、実際にソーターのルールを作成せず、適切なスクリプト言語を使用してプログラムフィルターを作成する管理者向けの方法です。



 require ["fileinto", "reject", "regex", "subaddress", "envelope"]; #spam if header :contains "Subject" "[SPAM]" { reject "thank you"; stop; } if header :regex "Received" "from ([[:alnum:]\\-]{1,}\\.){3,}[[:alnum:]]{1,}.*" { reject "thank you"; stop; }
      
      





私はそれを理解することができますが、なぜ地獄、それは必要ですか? そして、同じ機能を必要としているが、上記は中国のリテラシーに類似している「単なる人間」をどうするか。 今日、主婦の指でシステムが研ぎ澄まされると、何十年も使用されてきたメールを分類する同じ愚かな方法の欠如は、少なくとも驚くべきことです。



前述の記事の断片は、トランスポートセクションにEximレターを配置するためのパスがデータベースからのクエリを形成する、ソートの独自の実装に遭遇しました。



 mysql_delivery: driver = appendfile check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`) \ FROM `mailbox` WHERE `username`='${local_part}@${domain}'}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0600
      
      





メッセージの送信者/件名の部分文字列の内容の定義に基づいてダムフィルターが機能するように、リクエストを少し追加し、imapフォルダーの名前を追加することを妨げるものはありません。



 mysql_delivery: driver = appendfile check_string = "" create_directory delivery_date_add directory = ${lookup mysql{SELECT CONCAT('/data/mail/${domain}/', `maildir`, \ (select dir from sorter where ( \ ( \ (locate(text,'${sender_address}')!=0 and target='sender') \ or \ (locate(text,'${sg{${extract{Subject}{${sg{${sg{$message_headers}{ }{_spAce_}}}{:_spAce_}{=}}}}}{_spAce_}{ }}')!=0 and target='subject') \ ) \ and email='${local_part}@${domain}') or priority=0 order by priority desc limit 1 \ )) \ FROM `mailbox` WHERE `username`='${local_part}@${domain}'}} directory_mode = 770 envelope_to_add group = mail maildir_format maildir_tag = ,S=$message_size message_prefix = "" message_suffix = "" mode = 0600
      
      





その後、7キログラムのプリミティブPHPコードを作成して( ダウンロード )、特定のユーザーの並べ替えルールを作成します。文字を並べ替える必要があるという致命的な結果は80%実現しています。 そして、私個人-100%。 確かに、それは予期せずに発見されました(または、たぶん見つけられなかったのでしょうか?)この段階では、Eximには見出しごとに個別の変数がありません。



必須のゼロエントリを持つソートルールを保存するためのテーブルを作成します。これにより、ルールがない場合に受信トレイ内の文字の配置が決定されます。



 CREATE TABLE `sorter` ( `id` int(11) NOT NULL AUTO_INCREMENT, `priority` int(11) NOT NULL DEFAULT '0', `target` varchar(255) NOT NULL DEFAULT '', `text` varchar(255) NOT NULL DEFAULT '', `dir` varchar(255) NOT NULL DEFAULT '', `email` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ); INSERT INTO `sorter` SET `priority`=0;
      
      





管理者のスクリーンショット:



画像

スクリプトは、ユーザーのサーバー上に既にあるフォルダーのリストを取得します。



システムは不完全であり、少なくとも3つの制限があります。

1.文字のエンコードがルールテーブルのエントリのエンコードと一致する場合にのみ、ロシアのエンコードで動作します。

2.優先順位の高い順に1つのルールのみが機能する(優先度が高いほど高い)ため、論理ANDのルールは実行できず、ORのみが実行されます。

3.処理するフィールドの数は、送信者と件名によって制限されます。



原則として、後で主題に限らず、必要に応じて他のヘッダーをサンプルに使用することができます。 RoundCubeのプラグインを作成するというアイデアもありましたが、それらの作成方法を確認した後、非常に残念ながらそれを採点することにしました(実装に興味のある人がそれを行うかもしれません:笑顔:)。 また、FreeBSD用のMySQL 5.5ポートの最新バージョンでsqlクエリがテストされたため、このクエリが古いバージョンでロールするかどうかはわかりません。



All Articles