Postfixでメール送信制限 その1

最近関わった仕事で携帯メールの送信で飯を食べている会社が結構あるということを知り、Postfixでそれらを実現出来ないかということを目標に少々調査してみました。
で、私が知っている携帯メールアドレスへ送信の製品(名前は出しませんが)が保持していた機能は、以下のようなものでした。

項番 機能
1 主要3キャリアへの独自?ルールにより送信(セッション数、同時メール送信数の制限)
2 配信時刻制限(docomo.co.jp宛のメールは深夜帯を避けるなど)
3 エラーメール処理(バウンスメールをカウントして、設定した回数を越えたら配信しない)
4 絵文字メール送信
5 単位時間あたりのメール送信制限(例 1時間に6万通を上限にする等)
6 複数アドレスによるメール送信(キャリア宛のメール送信の高速化)

4はPostfixというより、どのようにMTAにメールを渡すかと言う問題なのでスルー。
6は、あんまり調査していないので次の機会。
5は、コンテンツフィルタを仕込んで単位時間あたりのメール数をカウント?みたいなことを考えて、
4倍性能が落ちるという噂のサンプルシェルを試したが、確かに遅い、、、で他の方法を調べていると
こんな記事が。。トミーが言うなら間違いないだろうということで、ここの落としどころは、
同MLに紹介されている

1. smtp の同時起動数(maxproc)の調整 master.cf
2. 並列配送の最大数 smtp_destination_concurrency_limitの調整 master.cf

と思われます。
3は、宛先ユーザ情報のDBを持って、エラーカウントを保持。定期的にログを巡回してbouncedならエラーカウントをアップすれば良いと思う。
使えそうなツールがpostfix-perl-scriptsパッケージのpflogsumm。検索すると色々出てくるけど、今回の目的(bouncedしたメールアドレスの抽出)にのみ利用するのであれば、少々修正が必要です。下記の様に、%bouncedmailaddrにメールアドレスを放り込むといった方法で良いと思う。

# diff -c pflogsumm /usr/sbin/pflogsumm 
*** pflogsumm	2010-09-02 17:37:25.918924484 +0900
--- /usr/sbin/pflogsumm	2010-02-26 21:31:39.000000000 +0900
***************
*** 413,419 ****
      $dateStr,
      %panics, %fatals, %warnings, %masterMsgs,
      %msgSizes,
!     %deferred, %bounced, %bouncedmailaddr,
      %noMsgSize, %msgDetail,
      $msgsRcvd, $msgsDlvrd, $sizeRcvd, $sizeDlvrd,
      $msgMonStr, $msgMon, $msgDay, $msgTimeStr, $msgHr, $msgMin, $msgSec,
--- 413,419 ----
      $dateStr,
      %panics, %fatals, %warnings, %masterMsgs,
      %msgSizes,
!     %deferred, %bounced,
      %noMsgSize, %msgDetail,
      $msgsRcvd, $msgsDlvrd, $sizeRcvd, $sizeDlvrd,
      $msgMonStr, $msgMon, $msgDay, $msgTimeStr, $msgHr, $msgMin, $msgSec,
***************
*** 790,796 ****
  			$bounceReas =~ s/^\d{3} //o;
  		    }
  		    ++$bounced{$relay}{$bounceReas};
- 		    ++$bouncedmailaddr{$addr}
  		}
                  ++$bncPerHr[$msgHr];
  		++${$msgsPerDay{$revMsgDateStr}}[3];
--- 790,795 ----
***************
*** 922,929 ****
      print_nested_hash(\%fatals, "Fatal Errors", $opts{'q'});
      print_nested_hash(\%panics, "Panics", $opts{'q'});
      print_hash_by_cnt_vals(\%masterMsgs,"Master daemon messages", 0, $opts{'q'});
- # Adding "%bouncedmailaddr"
-     print_nested_hash(\%bouncedmailaddr, "message bounced mailaddr for dealing with bounced mail", $opts{'q'});
  }
  
  if($opts{'mailq'}) {
--- 921,926 ----

これで抽出したアドレスをカウントアップすれば良い。
1,2は、次回に書きます