重複メールをサーバで削除する

ALL
スポンサーリンク

複数のメーリングリストに登録されている場合は、同じメールが重複して届くことがあります。
この重複メールを procmail の機能を使用してメールサーバで削除する方法です。

スポンサーリンク

事前確認

/etc/postfix/main.cf の allow_mail_to_commands 行に、下記のように forward が含まれているか確認して下さい。
含まれていないと、今回の設定は行えません。

/etc/postfix/main.cf

allow_mail_to_commands = alias,forward,include

次に procmail が存在するか確認します。
CentOSでは /usr/bin/procmail にあります。

または、procmail -v を実行してみます。
procmail が使用できる場合は、バージョン情報などが表示されます。

重複メール削除の事前準備

procmail の機能を使用します。
ホームディレクトリ下に .procmailrc ファイルを作成して下さい。

.procmailrc

MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
LOGFILE=/dev/null
LOG=-
:0 Wh: $MAILDIR/msgid.lock
| formail -D 16384 $MAILDIR/msgid.cache

なお、メールを別アドレスに転送している人は、ホームディレクトリ下に .forward があるはずです。
その場合は、本記事の以降の「メール転送させる場合」の手順に従って、転送先アドレスを .procmailrc の末尾に記述して下さい。

.procmailrc ファイル作成後、下記を実行します。

chmod 600 .procmailrc

重複チェックは、メール中の Message-Idヘッダーの値でチェックします。
Message-Id はメールごとに一意な値なので、同じ値のメールが届いたら、そのメールを処理しないようにするのが先の .procmailrc での内容です。

到着したMessage-Idヘッダーの値は、$HOME/Maildir/msgid.cache ファイルに保存されます。
このファイルのサイズの最大値が .procmailrc 中の数値 16384 です。
この値にしておけば、少なくとも過去100通程度のメールに対しては漏れなく重複チェックされます。

重複メール削除開始

.forward を以下の内容で作成し、chmod 600 .forward します。
ダブルクォーテーションを忘れずに記述して下さい。

.forward

"|/usr/bin/procmail -f-"

元から転送で .forward があった場合は、先の「重複メールを削除させる為の事前準備」の手順でその内容を .procmailrc に記述しているはずです。
元の .forward の内容は消して、上記そのまま記述して下さい。

これで、重複メールがサーバで削除されるようになります。

最後に、念のため、自分宛てにメールして届くか確認しましょう。
間違いがあると、一切メールが届かなくなってしまいます。
重複メール削除どころではなくなりますので、必ず、確認して下さい。

なお、 procmail で処理したメールのログを採るには、.procmailrc の LOGFILE で出力先ファイルを指定します。
一通ごとに、次の書式でログが出力されます。

-From test@xxxx.example.com  Tue Jul 25 10:13:41 2016
 Subject: =?iso-2022-jp?B?GyRCPXVKIcVhITwlayVGJTklSCM0GyhC?=
  Folder: formail -D 16384 /home/test2/Maildir/msgid.cache               1735

メール転送させる場合

メールを別アドレスに転送する場合は、転送先アドレスを .procmailrc の末尾に次のように追加します。
転送先アドレス先頭の「!」を忘れずに書いてください。

例えば、test@example.com へ転送していた場合は下記を追加します。

.procmailrc の末尾に追加

:0 c
!test@example.com

複数のアドレスに転送させていた場合は、半角スペースで区切って記述します。
転送先アドレスを書く行の先頭に「!」を忘れずに書いてください。

.procmailrc の末尾に追加

:0 c
!test-aaa@example.com test-bbb@example.com

なお、重複メール削除せずにそのまま転送したい場合は、.forward にそのアドレスを追加記述します。
.forward

"|/usr/bin/procmail -f-"
test-ccc@example.com

以上、重複メールをサーバで削除する方法でした。

参考

ユグドラシルの木漏れ日: Postfixで重複したメールを削除するには (Procmail)
PROCMAIL
Linux Memo/procmail – ISM PukiWiki
Procmailによるメール振り分け設定 – 九州工業大学 学生自治ネットワーク委員会
FreeBSD – procmail
procmail をもう少し使いこなしてみる – いますぐ実践! Linuxシステム管理 / Vol.214
procmail用の.forward設定の源流を探る – 玉虫色に染まれ!
Procmail によるメールの自動振り分け

コメント