where was "ゆ〜すけの日記" in the old days…
RSS icon Email icon Home icon
  • メーリングリストのメールアドレスチェック

    Posted on January 4th, 2010 Yusuke No comments

    というそのまんまのPythonプログラム。どこかで使うかもしれない。。

    mailaddress_check.py

    ※注意※ 本職がプログラマじゃないので基礎ができてません。クラスとかほとんど見よう見まねで使ってます(そんなレベルです)。一応公式ドキュメントは見てますが、概念的な理解を間違ってるためにとんでもないコードになってる可能性もあります。

    何をするものか:

    • ある特定のファイル郡に羅列しているメールアドレスにいくつかのチェックをかけます。
      • @を境に2つに分かれるか(2つ意外ならメールアドレスとして不正)
      • 上記が成功した場合、ドメインとなった方はMXレコードが存在するか
        • 1ドメイン1回のチェック
        • 自ドメインは自明なのでやらない
      • ローカルパート部=ユーザ名(uid)でLDAPサーバに登録されているか
        • 自ドメインの場合のみ
        • 1ローカルパート部1回のチェック

    必要条件:

    • Python 2.6
    • SQLite3
    • Solaris付属のldapsearchコマンド
      (コマンドの引数部分をいじればOpenLDAPでもいけるんじゃないかな)
    • digコマンド

    特定のファイル群:

    • aとa.configがある場合、aが対象となります。
    • test, test.config, test2.config, public, public.config, normal, hyper, hyper.config, another, another.config の場合、normalは対象となりません(test2.configだけあってもそれは無意味です)。

    以下のように出力されます。

    2 following addresses did not be checked out because of its bad syntax.
    ------------------------------------------------------------------------
    public  miss-domain2@club@kyutech.ac.jp
    hyper   hoge.huga,jp
    ------------------------------------------------------------------------
    
    5 following domains don't have MX records or usernames don't exist.
    ------------------------------------------------------------------------
    public  miss-domain1@club.kyutech.acj.p
    public  root@key2.jjp
    test    test3@example.com
    test    test3@example.jp
    test    hogehoge@key2.jp
    ------------------------------------------------------------------------
    
    1 following mail addresses could not be checked out. (command error)
    ------------------------------------------------------------------------
    another        yskhashi@.key2.jp
    ------------------------------------------------------------------------
    

    FAQ(自問自答)

    • Q1. なんかもっとすっきりかけるんじゃない?
    • A1. かもしれませんね。Worker_resolverとWorker_fingerなんてほとんど同じことやってますね。DNSとLDAPって同時に検索もできるけど、分かりにくくなるのでやめました。
    • Q2. スレッド数100って多すぎじゃない?
    • A2. DNSやLDAPがちゃんと応答してくれるときは、5でも100でも体感で大差ありません。サーバがちゃんと応答しないときにチェック対象が全部タイムアウトすることを考えると、100ぐらいしとかないと終わるまでめちゃくちゃ時間かかります(digは15秒/件, ldapsearchは3~4分/件でタイムアウト)。
    • Q3. せっかくデータベース使ったんだから、スレッド単位でばんばんUPDATEかければいいじゃ?
    • A3. 当初それを期待してたのに、SQLiteの接続はスレッド間で共有できないんですって(Python 2.6.4現在)。。まぁDISTINCTとCOUNTを使えることが今回は有意義ですね。

    SEO

    • Python
    • threading
    • threading.Thread
    • Queue
    • sqlite3
    • subprocess
    • スレッド
    • DNS
    • LDAP
    • MXレコード
    • メールアドレス
    • チェック

    Leave a reply