[前][次][番号順一覧][スレッド一覧]

mysql:2863

From: Seiji Tateyama <Seiji Tateyama <tateyan@xxxxxxxxxx>>
Date: Thu, 14 Dec 2000 14:09:19 +0900
Subject: [mysql 02863] Re: メール配信 PGM 作成

たてやんっす

とみたまさひろ <tommy@xxxxxxxxxx> さんは メール配信 PGM 作成 にて
と> とみたです。
と> 
と> [hashimoto <look@xxxxxxxxxx>さんが]
と> ["[mysql 02861] メール配信 PGM 作成" で曰く]
と> 
と> > ここまではロジックを組めるのですが、メールアドレスが誤っている
と> > 為、リターンされたエラーメールについては次回からメールしない様、
と> > MySQLにメール送信不可BITをONする様な仕組みを作りたいのですが、
と> > 良いアイデアが思いつきません。
と> 
と> ええと、もしかして「エラーメールが来たらDBをいじる」ということを
と> *自動* で行ないたいということでしょうか?
と> 
と> # あまり MySQL と関係無い話かな?
ですね...
でも MySQL のデータベースへフラグを設定するという点において
関連ということなのだと思います

と> Sendmail や qmail とかの代表的な MTA が返すエラーメッセージに
と> マッチングしてメールアドレスを抜き出す仕組みを作るとか…。
と> MTA によってエラーメッセージは異なるし、同じ MTA でも場合によって
と> 異なることがあるので大変かも…。
です (^^ゞ

sendmail / qmail などであれば User Unkown とかを 本体の
メッセージから ある程度は 絞りこめます

スクリプト言語の前の段階でprocmail などを利用すると格段に便利になります

たとえばsendmail では ボディにエラーとして
550 メッセージ ... User Unknown
550 メッセージ ... Host unknown

などと メッセージを返してくれるので これを拾うのが手です

その後、スクリプトをかますようにして データベースへ
入れるようにすれば多少は拾えるとおもいます
でも 冨田さんのおっしゃってるように MTAの種類によって
メッセージなどはかわりますので、自動でする分と手動でする
分とを分けて、解析できたら自動に加えるようにしていく
しかなさそうです

sendmail + Procmail でのprocmailrc レシピのさわりの一例

:0
*^FROM_DAEMON                       デーモンプロセスから発信された
{
  :0 B:                             本文に対してのegrep
  *^550.*\.\.\. User unknown        行頭550ではじまる ... User Unknown
  |フイルタ1                       フイルタ1を適用

  :0 B:
  *^550.*\.\.\. Host unknown        行頭550ではじまる ... Host unknown
  |フイルタ2                       フイルタ2を適用
}

これで フイルタスクリプトで MySQLデータベースの目的の
テーブルへフラグなどを入れればよいわけです


フイルタは  C / perl / ruby などコマンドライン上から実行でき
るフィルタを作れる&MySQLの操作ができる というものならなんで
もかまわないと思います (メールアドレスを抜き出すという処理
が入ります)

perl でフイルタ1の例は

#!/usr/bin/perl
use DBI;
use strict;

while(<>) {
    if(/^550\s+(.*)\.\.\. User unknown/) {
        &DBcomit($1);
#        この中で 処理をします
#        上記のマッチングで $1 にメールアドレスが入ってきます。
    }
}

sub DBcomit() {
  my($dbh,$Q,$sth,$rc);
  $dbh = DBI->connect("DBI:mysql:データベース名:サーバ名","ユーザ名","パスワード");
  $Q="update なんちゃら";
  $sth = $dbh->prepare($Q);
  $rc = $sth->execute ;
  $rc = $sth->finish;
  $rc  = $dbh->disconnect;
}

といった感じでしょうか 
 =>でっち上げなので

あと 気をつける点としては User Unknownで一回返ってきたからといって
すぐに送信禁止を設定してよいかどうかという問題もあったりします...
相手のサーバの一時的なミスも考えられますし...
何回かエラーになった場合に送信禁止にする といった配慮も考えたほうが
良いでしょう
============
  彡彡从        たてやんっす
 d□/□-b      <tateyan@xxxxxxxxxx>
 ヽ"ー"丿



[前][次][番号順一覧][スレッド一覧]

      2861 2000-12-13 23:45 [hashimoto <look@xxxx] メール配信 PGM 作成                     
      2862 2000-12-14 00:31 ┣[とみたまさひろ <tomm]                                       
->    2863 2000-12-14 14:09 ┃┗[Seiji Tateyama <tate]                                     
      2875 2000-12-15 17:07 ┃ ┗[<moeru@xxxxxxxxxx>  ]                                   
      2876 2000-12-16 00:01 ┗[hashimoto <look@xxxx]