bounceHammer has been EOL'ed on February 29, 2016

製品ライフサイクルの終了

2010年3月にオープンソースソフトウェアとして公開して以来、多くのユーザ様・企業様にダウンロードし、 ご利用いただきましたbounceHammerは、2016年2月29日(月)を持ちまして製品ライフサイクルの終了(EOL: End Of Life) となりました。長きにわたりbounceHammerをご使用いただき誠に有り難う御座いました。 開発元では後継となるバウンスメール解析ライブラリとして、より高精度で高速なSisimai(シシマイ) を二条項BSDライセンスで公開しています。

Sisimai
商用サポート

  • 1一式導入・設定・保守・開発の補助
  • 2独自MTA用解析モジュールの開発
  • 3個別案件の対応とメールサポート
  • 4バウンス管理・運用コンサルティング
  • 5スポット解析・解析済みデータ提供

YAMLファイルでアドレス照合

2010/11/04

YAMLファイルでバウンスしたアドレスを照合する方法

一般的にメールアドレスのクリーニングと言われていますが、配信した後のアドレス管理は重要です。 bounceHammerが解析した結果を配信対象であるメールアドレスと照合して、 配信できないものは除外する、この繰り返しを毎回メールを配信する前に行えば、 遅延の回避やサーバの負荷軽減につながり、合理的な配信態勢が維持できます。

ここではbounceHammerが解析した結果をYAMLファイルとして書き出して、 配信対象アドレスの取捨選択をする一例を紹介します。 例として宛先不明(userunknown)とフィルターによる拒否(filtered)、 そして不明なホスト(hostunknown)でバウンスした宛先を配信対象から除外します。どのエラー理由なら除外 すべきなどの決定については、 バウンスした宛先に再送できるかどうか? を参考にしてください。

照合用のYAMLファイルを作る

 

先ずはじめに、配信側で照合する為のYAMLファイルを datadumper コマンドを使って作成します。

出力する形式はYAMLで、宛先不明(userunknown)とフィルターによる拒否(filtered)、 そして不明なホスト(hostunknown)の三種類の理由のいずれかでバウンスした記録だけを取り出します。

datadumperコマンドでアドレスを取り出す

ここでは、とり出す記録を1週間以内にバウンスしたものに限定しています。 例えば毎週一回メール配信を行うとすれば、前回の配信から今回の配信までの間にバウンスした記録 だけを見る方が、全件照合するよりも合理的です。1週間以内にバウンスした記録は、 datadumperコマンドの--howrecent 1wオプションで直近の1週間分として取り出しています。

$ touch /tmp/bounced.yaml
$ datadumper --reason userunknown --howrecent 1w >> /tmp/bounced.yaml
$ datadumper --reason filtered --howrecent 1w >> /tmp/bounced.yaml
$ datadumper --reason hostunknown --howrecent 1w >> /tmp/bounced.yaml

上記のコマンドで、/tmp/bounced.yamlファイルにバウンス記録を書出しました。

ディスクIO

データ量が多くてディスクIOが気になる場合はmfs(Linuxではram disk, /dev/shmなど) にファイルを作るとよいでしょう。また、配信側プログラムでJSON形式で読み出したい 場合はdatadumperコマンドの出力フォーマットオプション--format jsonを使って、 あるいはCSVで欲しい場合は--format csvを使って、それぞれ望む形式でデータを 得てください。

配信側でアドレスの照合をする

 

様々な電子メール配信環境とプログラムがあるので、こうすればよい という明確な解答は記述できませんが、一般的な処理形態は、 取り出したYAMLファイルを読み出して、配信先アドレスと照合する流れです。

#!/usr/bin/perl
use strict;
use warnings;
use JSON::Syck;

# 取り出したバウンス記録を読込む
my $Bounces = JSON::Syck::LoadFile("/tmp/bounced.yaml") || [];
my @Users = 配信対象ユーザのメールアドレス(サイトのDBなどから取得);
my $MailFrom = 'info@example.jp';

foreach my $user ( @Users )
{
  my $b = [ grep {
    $_->{recipient} eq $user && $_->{addresser} eq $MailFrom }
    @$Bounces ];
  next if( scalar @$b ); # バウンス記録があれば配信しない
  通常の配信処理...;
}

上記はごく単純な照合例です。同じような仕組みで配信時ではなく配信直前にサイト側 データベースに対して配信不能フラグを立てるなどの処理でもよいでしょう。

MTAに任せる(Sendmailに削除してもらう)

 

工数などの理由で、配信プログラム側に照合機能を実装できない場合、 配信したくないメールアドレスをMTAが参照するデータベース形式に変換して、 MTAに配信の是非を任せる という方法もあります。

Sendmailのaccess_dbに変換

ここではawk, sedコマンドを使って、Sendmailのaccess_db形式に変換し、 配信ゲートウェイとなっているSendmailに削除させる方法を紹介します。

# awk '{print $8 }' /tmp/bounced.yaml | sed -e 's/[",]//g' -e 's/^/To:/g' -e s/$/ DISCARD/g' > /tmp/access_tmp
# cd /etc/mail
# cp ./access ./access_orig ⏎ 元のaccessはコピーしておく
# cat ./access_orig /tmp/access_tmp >> /etc/mail/access ⏎ 連結する
# makemap hash access.db < access

元の/etc/mail/accessが空である場合はaccess_origとしてコピーする必要はありませんが、 元の設定とバウンス記録を書き込んだ/tmp/access_tmpを結合する場合は、元のaccessの内容 が消えないように注意してください。