example - みる会図書館


検索対象: UNIX MAGAZINE 2002年12月号
8件見つかりました。

1. UNIX MAGAZINE 2002年12月号

ー横 [ 着ープログラ scmail では、 S 式の表記を使って振分け規則を定義す ミング⑩ く、サンフ。ルをもとに修正していけばいい。なお、さきほ る。しかし、 S 式そのものについて深く理解する必要はな From : foo@example ・ jp に含まれる、 メールを差出人別に振り分けるには、ヘッダフィールド 差出人別の振分け ど説明した ~/ ・ scmailrc も S 式で する。 のように、さきに適用される規則の振分け先を、、 ( c 叩 y ("foo@example ・ jp" "from/foo"))) ("foo@example ・ jp" (copy "friends") ) ' (from (add—filter—rule ! ら、 は振り分けられない。両方のフォルダに振り分けたいのな friends フォルダに振り分けら from/foo フォルダに のように定義すると、 foo@example.jp からのメールは ("foo@example ・ jp" "from/foo") ) ) ("foo@example ・ jp" "friends") ) (from (add—filter—rule ! る。このため、 数である。振分け規則は、定義が追加された順に適用され 最初の、、 add-filter-rule!" は、振分け規則を追加する関 ("bar@example ・ jp" "from/bar") ) ) ("foo@example ・ jp" "from/foo") ' (from (add—filter—rule ! bar フォルダに振り分けるには、次の規則を追加する。 同様に、 bar@example.jp から届いたメールを from ("foo@example ・ jp" "from/foo"))) ) (from (add—filter—rule ! けの場合は ~/. scmailrc-refile に振分け規則を追加する ) 。 の振分けの場合は ~/. scmailrc-deliver に、受信箱の振分 振り分けたい場合は、次の規則を定義する ( メール受イ芋 いたメールを伝 om / f00 フォルダ (-/Mail/from/foo) に のような情報を利用すればいい。 foo@example.jp から届 ” ) " で囲っておけはいい。こうしておけは、メール UNIX MAGAZINE 2002.12 則の適用力陸続される。 カ甘旨定したフォルダにコピーされたあと、以降の振分け規 なお、振分け規則のファイルに括弧の閉し忘れなどの文 法工ラーがみつかった場合は、空の規則ファイルとして扱 わその規則は定義されない。 /. scmail-log に。求さ れる文法工ラーのメッセージを見て、ファイルを修正する は、 List—Id: く quux. example ・ JP> あるいは、 X—ML—Name : baz 通常、メーリングリスト経由で送られてくるメールに メーリングリストごとの振分け 必要がある。 ッチして得られた文字列をもとに振分け先のフォルダを決 この例では、正規表現でパターンマッチをおこない、マ ' (list—id ' (x—ml—name (add—filter—rule ! 正規表現を用いた規則を定義すれはいい。 れに規則を定義するのが面倒になる。そのような場合は、 参加するメーリングリストの数か増えてくると、それぞ (" く quux ・ example ・ jp>" "ml/quux. example ・ jp")) ) ' (list—id ("baz" "ml/baz") ) ' ( x—ml —name (add—filter—rule ! に振り分けるには、次の規則を追加する。 jp から届いたメールを ml/quux. example. jp フォルダ ダフィールドをもつメーリングリスト quux@example 同様に、、、 List-Id: (quux. example jp 〉 " というへッ ("baz" "ml/baz") ) ) ' (x—ml—name (add—filter—rule ! ォルダに振り分けるには、次のように規則を定義する。 ィールドが付いているとしよう。このメールを ml/baz フ ら届くメールのヘッダに、、 X-ML-Name: baz" というフ える。たとえは、メーリングリスト baz@example ・ jp か れは、メーリングリストごとの自重辰分けが簡単におこな などのキ帯朱なヘッダカ咐けられている。こ窈青報を利用す X-ML—Name : baz 定している。たとえば、 149

2. UNIX MAGAZINE 2002年12月号

ー横 } 着 } プログラミ / グ⑩ というメーリングリストの場合は ( [ ー . \ w ] 十 ) に baz が マッチし、振分け先のフォルダは” ml/ \ \ 1 ”の、、 \ \ 1 " の部分が baz に展開された、、 ml/baz" となる。この仕組 みは、 PerI や Ruby の文字列置換のイと同様である。 5 月号て紹介した超お手軽なメーリングリスト・システ ム QuickML7 では、使い捨て感覚でどんどんメーリング リストを作れる。このような場合には、いちいち規則を追 加していてはきりがないので、上のように一括して処理で きる規則を定義すると楽である。 メールの車云送 メールを転送する規則を紹介する。次の規則は、差出 人が foo@example.jp か bar@example.jp のメールは mobile@example.com に転送するというものである。 (add—filter—rule ! ) (from ( ("foo@example ・ jp" "bar@example ・ jp") (forward "mobile@example.com/) ) ) ) メールの転却芋には、 ~ / . scmailrc の :smtp-host で 指定した SMTP サーバー ( 標準では localhost) が使わ れる。 迷惑メールの振分け 迷惑メールを振り分ける規則を紹介する。メールアドレ スを Web などで公開していると、、、未承諾広告※無料プ レゼント " や、、 ADULT NEWS " などといった件名の広 告メールが頻繁に届く。 こうした迷惑メールへの対策として、 2002 年 7 月 1 日 からイ寺定多数に送る国内の広告メールには件名に、、未承 諾広告※ " と表示することが義務つ・けられた。 Subject: 行 にこの文字列が含まれるメールを junk フォルダに振り分 けるには、次の規則を定義する。 (add—filter—rule ! ' (subject ( " 未承諾広告※ " "junk"))) 通常、日本語の件名は RFC2047 [ 1 ] で定められている MIME の標準に従って特殊な文字列に符号化されるが、 scmail では自重加勺に復号されるため、、、未承諾広告※ " と いう文字列でパターンマッチできる。 7 http://QuickML.com/ 150 ところで、悪質な広告送信業者は、フィルタによって 振り分けられるのを防ぐために、、未承認広告※ " にしてみ たり、、未承諾広告 * " にしてみたりと姑息な手段を弄する ようである。バカバカしい気もするが、これらに対応する には正規表現のパターンを使えはいい。 (add—filter—rule ! ' (subject ( # / [ 末未 ] 承 [ 認諾 ] 広告 [ * * ※ ] / "junk"))) 最近は中国や韓国からの迷惑メールも増えてきている。 中国語と韓国語のメールは読まない ( 読めない ) という人 は、次の規則を追加するといいかもしれない。この規則で は、 Content-Type: 行の文字コード指定をみて、中国語 や韓国語の文字コードなら junk フォルダに振り分ける。 (add-filter—rule ! ' (content—type ( # / gb231 幻 euc—kr lbig 引 gbklks—c—5601/i こで、 Scheme プログラムで書いた複雑な振分け規則 を紹介しよう。次の規則は、 ・ Subject: 行に money 、 adult 、 sex 、 viagra のいすれ かが含まれ ( 大文字、小文字は区別しない ) ・メール本文に文字列く HTML 〉を含む メールを junk フォルダに振り分ける。 (define junk—words sex" "viagra") ) ) ("money' "adultn " (use srfi—13) string—contains—ci (use srfi—l) find (add-filter-rule ! (lambda (config mail) ()f (and (find (lambda (word) (string—contains—ci (mail—query mail ' subj ect) word) ) junk—words) (string—contains (mail-query mail 'body) " く HTML>") ) (command-refile config mail "junk") :next))) ・・・ ) " で迷惑メールと 最初の (define junk-words みなすための単語のリストを定義し、後半の、、 (lambda " て始まる無名のコールバック関数 (config mail ) て振分けを実施する。もちろん、より複雑な振分け規則も Scheme プログラムとして自由に書ける。 procmail ( 変則 的な文法 ) や maildrop (C 言語に似た文法 ) などのメー UNIX MAGAZINE 2002 ユ 2

3. UNIX MAGAZINE 2002年12月号

特集・ SO ね′ is9 図 10 /etc/rc3. d/S90samba takasago$ cat /etc/rc3. d/S90samba # ! /sbin/sh # Copyright (c) 2001 by Sun Microsystems , lnc # A11 rights reserved. #ident "@(#)samba case $ 1 ” in start) 01 / 09 / 24 SMI " [ -f /etc/sfw/smb . conf ] Ⅱ exit 0 /usr/sfw/sbin/smbd —D /usr/sfw/sbin/nmbd. -D stop) pkill smbd pkill nmbd echo "Usage : exit 1 $ 0 { start ー stop } " esac exit 0 t akas ago $ par S e returns : $ # esmtp $ , ・ jp ・ $ : ss く〇〇 〇〇 CO となり、外部のメールサーバーに ESMTP というプロ トコルで配送されているのが分かります。これ以外にも、 いくつかのメールアドレスを指定してチェックしてみま しよう。納得できたら、この sendmail. cf ファイルを /etc/mail ディレクトリにコピーし、 sendmail を再起動 します。 takasago$ sudo cp ・ /sendmail. cf /etc/mail Password : takasago$ sud0 /etc/rc2. d/S88sendmai1 restart Password : takasago$ 次は、 Windows マシンのファイルサーバー機能を提供 する samba の設定です。 Samba も Apache と同しく、 インストールはされていますが、サーピスを提供するデー モンは起動されていない状態です。ます、デーモンを起動 する rc ファイルがあるかどうかを、 Apache のときと同 しようにして調べてみましよう。 takasago$ grep —i1 samba /etc/rc*/S* CO Samba UNIX MAGAZINE 2002.12 /etc/rc3. d/S90samba takasago$ このファイルの内容は、図 10 のようになっています。 バージョンを石忍すると、 2.2.2 が入っているようです。 takasago$ /usr/sfw/sbin/smbd ¯V Version 2 . 2 . 2 takasago$ /usr/sfw/sbin/nmbd -V Version 2 . 2 . 2 takasago$ Samba のデーモンである smbd と nmbd を起動する には、 /etc/sfw/smb. conf という設疋ファイルが必要な ことが分かります。 /etc/sfw ディレクトリの下を見ると、 smb. conf-example というサンフ。ルファイルがあります。 takasago$ ls /etc/sfw/ smb. conf—example private takasago$ Apache のときと同じように、これをもとに言聢するこ ともできましたが、別のサイトで FreeBSD 4.5 をサー バーとして Samba を使っていたので、その設定ファイ ル ( 図 11 ) をもとにすることにしました。 Samba の設定には、 UNIX の知識というより、かな り謎の Windows ネットワークの知識が必要なのですが、 用語などに劇染みがないせいか、ちょっと大変でした。 41

4. UNIX MAGAZINE 2002年12月号

ー横着ープログラミング⑩ 図 5 MIME て符号化された文字列を復号する関数 (define (decode—field str to—code) (with—error—handler (lambda (e) str) (lambda ( ) str (lambda (let* (m) ( (charcode (rxmatch—substring m 1 ) ) (encoding (rxmatch—substring m 2 ) ) (message (rxmatch—substring m 3 ) ) (decode ()f (equal? encoding "B") base64—decode—string quoted—printable—decode—string) ) ) (ces—convert (decode message) charcode 図 6 メールを週言する関数 (define (send—mail host port iport mail—from recipients) (with—error-handler (lambda (e) (errorf "send—mail failed: -a" (slot—ref e (lambda ( ) (call—with—client—socket (make—client—socket ' inet hOSt port) (lambda ()n out) (let ( (send—command (lambda (command code) 'message))) (when command (format out " -a\r\n" command) ) (let* ( (line (read—line (n) ) (return—code (string->number (substring line 0 3 ) ) ) ) ()f (eq? return—code code) line (errorf : = > -a" command line)))))) (send—command #f 220 ) (send—command (format "HELO -a" (sys—gethostname) ) 250 ) (send-command (format "MAIL FROM: く -a>" mail-from) 250 ) (for—each (lambda (rcpt) (send-command (format "RCPT TO: く -a>" rcpt) 250 ) ) ()f (string? recipients) (list recipients) recipients) ) (send—command "DATA" 354 ) (port—for—each (lambda (line) (format out " -a\r\n" (regexp-replace # / \ . / (lambda ( ) (read-line iport) ) ) line (send—command " . " 250 ) (send-command "QUIT" 221 ) ) ) ) ) ) ) A4 判で 50 ページとたいへんコンパクトにまとめられて いる。 Scheme 自体は最低限の機能しかもっていないた め、実用的なツールを作るには多くのライプラリが必要に なる。その点、 Gauche はイ甦リなライプラリを標準で豊富 に備えている。 図 5 の関数は、 Gauche の正規表現ライプラリを用い てメールのヘッダの MIME 符号を復号するものである (scmail のソースコードから抜粋 ) 。これは、 152 2022—jp?B?GyRCJCIbKEI=?=\n abc" 2022 ー jp ? Q ? = IB = 24 = 42 = 24 = 22 = IB = 28 = 42 ? = abc ” のように符号化された文字列を、、あ abc" に復号する。 また、図 6 の関数は、 Gauche のネットワーク・ライプ UNIX MAGAZINE 2002 ユ 2 ーを使い、 foo@example.org から bar@example.com localhost のポート 25 番で動いている SMTP サーバ mail のソースコードから抜粋 ) 。 ラリを利用してメールを送信するものであるにれも sc-

5. UNIX MAGAZINE 2002年12月号

特集・ SoIa ′ is 9 図 3 /etc/rc3. d/S50apache ( 先頭部分 ) # ! /sbin/sh # Copyright 2002 Sun Microsystems, lnc . A11 rights reserved. 02 / 01 / 30 SMI" TOMCAT_CF=/var/apache/tomcat/conf/server. xm1 PIDFILE=/var/run/httpd.pid CONF_FILE=/etc/apache/httpd.conf APACHE_HOME=/usr/apache #ident "@(#)apache.sh 1 . 2 # Use subject tO license terms . if [ ! -f ${CONF-FILE} ] ; exit 0 f i を設置するときに Dynamic DNS のサービスを使うよ うにしていたので、メールサーバーも外部から参照できま Apache then Jun 25 2002 09 : 37 : 00 Server built : Server version: Apache/1.3.26 (Unix) takasago$ /usr/apache/bin/httpd —v ションを指定すると表示されます。 回はこれを使いました。バージョンは、 httpd に -v オプ Apache は Solaris 9 に標準で含まれているので、今 takas ago $ 36 1 http://www.apache ・ org/ S50apache であることが分かります。 ると、 Apache を起動する rc ファイルは /etc/rc3. d/ か、 rc ファイルを見てみましよう。次のようにして調べ ある httpd は起動されていません。どうなっているの ていますが、標準的な状態では Web サーバーの本体で Apache は、たしかに Solaris 9 にインストールされ てみることにしました。 ていません。判断に悩みましたが、今回は 1.3.26 を使っ Sun のセキュリティに関する情報には、まだこの件は載っ に取り消される可能生もある」と書かれています。また、 つか施されているが、この修正はレビュー中であり将来的 ていました。説明を読むと、「脆弱性に対する修正がいく ト 1 を覗いたところ、バージョン 1.3.27 がリリースされ 1.3.26 のようです。 10 月初めに Apache の公式サイ takasago$ grep -il apache /etc/rc*/S* /etc/rc3. d/S50apache takasago$ このファイルの地可、」近を眺めてみましよう ( 図 3 ) 。 最初の if 文で、 /etc/apache/httpd.conf という設 定ファイルがないと httpd を起動する処理に移らないこ とが分かります。 /etc/apache の下を見ると、たしかに httpd.conf ファイルがありません。 takasago$ ls /etc/apache/ README . S01aris access . conf httpd. conf—example t akas ago $ Jserv. properties 」 serv. conf magl C mime . types srm . conf tomcat . conf zone . properties httpd.conf の代わりに、 httpd.conf-example という サンプルファイルがあります。すこしてみると、とり あえすはそのまま使えそうです。これを httpd.conf とい う名則でコピーし、 apachectl コマンドでこのファイルを チェックしてみました。 takasago$ /usr/apache/bin/apachectl configtest Syntax OK takasago$ 当り前かもしれませんが、とくに間題はなさそうです。 勇気を出して、、 /etc/rc3. d/S50apache start" を実行し てみると、ちゃんと、、 httpd starting. " というメッセー ジか表示さ httpd か起動されました。 takasago$ sud0 /etc/rc3. d/S50apache start Password : httpd starting ・ takasago$ UNIX MAGAZINE 2002 ユ 2

6. UNIX MAGAZINE 2002年12月号

ー横【着ープログラミング⑩ 図 7 対応する括弧をハイライト新 まオ図 File Edit 0 005 日ⅶ e T00 は Help ー設定 っても 大丈夫でづよ 表 1 S 式を扱うための Emacs のキー操イ乍 意味 S 式を削除する S 式をマークする 1 っ先の S 式にカーソルを進める 1 つ前の S 式にカーソルを戻す 前後の S 式の啣を入れ替える S 式をインデントする 1 つ前の S 式を削除する 1 っ先のリストにカーソルを進める 1 つ前のリストにカーソルを戻す 1 つ内側のリストにカーソルを進める 1 っ外側のリストにカーソルを戻す C- M- k C-M-SPC C-M- f C-M-b C-M-t C-M-q C- M-Backspace へメールを送信するには、大のようにこの関数を呼び出 C-M-n す。メールは標準入力から読み込むものとする。 C- M-p C- M-d (send—mail "localhost" 25 (current—input—port) C- M- u "foo@example.org/ "bar@example. com") S 式を扱うキー操作 このように、 Gauche を使えば Perl や Ruby と同様 Emacs には、 S 式を扱うのに便利なキー操作か数多く の手軽さで Scheme による実用的なプログラムか書ける。 用意されている。これらをすべて暗記する必要はないが、 Emacs で楽々 S 式 C-M-klO と C-M-SPC (SPC はスペースキー ) は億えて おくと便利である。開き括弧の上にカーソルを置き、 C- M-k を叩けば対応する括弧の内側をすべて削除できる。 S 式は、括リ励ゞ多くて煩わしいという理由で毛嫌いされ S 式を扱うキー操作を表 1 にまとめておく。 ることが多い。瓜については、物黼 5 雄氏の次のような Lisp モードや Scheme モードでは、 TAB キーを押す 言葉がある [ 3 ] 。 だけで適切に S 式をインデントできる。 scmail の設定フ 「弟子が尋ねた。『先生、私は先生がカッコをまるて魔術 ァイルでは最初の行に、 師のように扱っているのを常々苟匱しています。どうすれ ー * ー scheme ー * ー ば先生のようになれるのでしようか ? 』 というコメントを入 Emacs で設疋ファイルを開くと 師『えっ ? カッコ ? あ、そうか。そんなものもあったな。 Scheme モードで編集できるようにしている。 いやあ、すっかり忘れておったわ』」 このよ第也に達するのは難しいとしても、 Emacs を使え 括弧の色を薄くする ば S 式を上交的容易に操作できる。すくなくとも私は、 画面上か話弧だらけという見た目をやわらげるために、 Emacs を使っているぶんには括弧の存在はさほど気にな Emacs で Scheme のプログラムを書くときは瓜の色を らなくなってきた。 薄くしている。 Scheme でしばらく試して気分がよかった ので、 C 言語でも同様に括弧の色を薄くしてみた ( 図 8 ) 。 対応する括弧をハイライト表示する 瓜の色を薄くするには、図 9 の設定を ~/. emacs に加 /. emacs に次の 1 行を追加すると、対応する瓜をハ えればいい。 イライト表示させることかできる。 おわりに (show—paren-mode) 今回は、私が開発したメールフィルタ scmail をとり show-paren-mode では、カーソルが開き括弧の上お よひ閉じ括弧の直後にきたときに、対応する瓜が自動酌 あげ、あわせて Scheme プログラミング刎列を紹介した。 scmail はこだわりをもって Scheme で実装したが、プロ にハイライト表示される。図 7 では、閉し括弧の直後に カーソルを置き、対応する 2 っ窈舌弧をハイライト表示さ 10 control キーと Alt (Meta) キーを押しながら k キーを押す。また は、 ESC キーを押してから ControI キーと k キーをこ押す。 せている。 153 UNIX MAGAZINE 2002 ユ 2

7. UNIX MAGAZINE 2002年12月号

ー横着 ] プログラー メールボックスの形式 ニング⑩ UNIX で使われているメールポックスを大きく分けると、 mbox 、 MH 、 MaiIdir の 3 つの形式がある。現在のところ、 scmail はこのうちの MH 形式のみに対応している。それぞれ の形式について簡単に説明する。 mbox 形式 mbox は、 UNIX の伝糸勺なメールポックスの形式である。 複数のメールを 1 つのファイルに連結して十褓内し、、 From から始まる行をメールの区切りとして扱う。 /var/spool/ mail や /var/mail などのディレクトリに格納されるメール ポックスは、この形式である。 mbox 形式のメールポックスでは、、 From " から始まる行 をメールの区切りとして扱うので、メール本文に含まれる行頭 の、 From " は通常、〉 From " に書き換えられる。、〉 From から始まる行があった場合はそのまま残るので、本文中の行頭 にある、 From " と、〉 From " は区別がつかなくなる。 本文の行頭の、 From " が、〉 From " に書き換えられて困る 場面はめったにないだろうが、勝手に書き換えられてもとに戻 らないという信様は気持ちカいにの問題を鮹共するために、 、〉 From " を、〉〉 From " に書き換える mboxrd 形式がある )。 mbox 形式は仕様か厳密に決まっているわけではなく、本 文行頭の From を〉 From に書き換える代わりに、ヘッダの Content-Length: 行に含まれる本文の長さ情報にもとづいて メールを区分けするシステムもある。この辺の事情については、 ネノ琪月の Netscape Mail の開発者である Jamie Zawinski 氏 の文書 i に詳しい。 MH 形式 MH 形式は、 MHII という歴史ある UNIX 用メールシステ % cp /usr/local/share/scmail/scmailrc. sample=> 標準の ~/. scmailrc では、図 1 のように設定されてい る。 MH の標準的な設定、すなわち MH のメールポッ クスが ~ / Mail で、受信用のフォルダ ( 受信箱 ) が inbox (-/Mail/inbox) であれば、とくに変更する必要はない。 scmail-deliver の使い方 前述のとおり、 scmail-deliver はメールを受信した時 点で自重耐辰分けするツールである。 scmail-deliver 用の 振分け規則は、 ~/. scmailrc-deliver ファイルで定義す る。 /usr/local/share/scmail ディレクトリにあるサン フ。ルファイルを次のようにコピーして使えばいい。 % cp /usr/local/share/scmail/scmailrc-deliver=> ・ sample ~/. scmailrc-deliver UNIX MAGAZINE 2002.12 ムのメールポックス形式で、 MH 以外の多くのメールシステ ムでも使われている。 MH 形式のメールポックスでは、 1 通のメールを 1 つのファ イルとしてフォルダに↑褓内する。、フォルダ " とは、メールを 内するディレクトリのことである。通常、受信したメールは &/MaiI ( 自分のホーム・ディレクトリの下の Mail ディレク トリ ) というメールポックスの下の inbox フォルダにオ褓内さ ・・のように数字の れる。オ絲タされたメールには、 1 、 2 、 3 、 ファイル名が付けられる。 MH 形式では 1 メール = 1 ファイルなので、メールを 1 通 ごとにコピーまたは削除する場合も、 cp や rm コマンドで簡 単にできる。これは MH 形式の大きな利点である。 mbox 形 式では複数のメールが 1 つのファイルに連結されているため、 こうはいかない。 Maildir 形式 MaiIdir 形式は、 qmaillii というメールサーノヾー・ソフト ウェアのメールポックス形式である。 qmail では、受信した メーノレを各ューサーのホーム・ディレクトリの下のメールポッ クス C/Maildir など ) にオ褓内する。このとき、メールを安全 にオ褓内するために tmp 、 new 、 cur という 3 つのサプディレ クトリを利用する。この安全対策のイ督はみを除けば、 MH 形式 と同しく 1 メール = 1 ファイルでメールをフォルダにオ褓内す る形式である。 SendmaiI や Postfix などのメールサーバーを利用して いる場合は、 ~/. forward ファイルに次のような設定を加 えるとメール受信時に scmail-deliver による自重耐辰分け がおこなえるようになる。 ー /usr/local/bin/scmail—deliver fetchmai16 を用いて POP サーバーからメールを受信 しているのなら、 ~/. fetchmailrc の mda の部分に / usr / local/bin/scmail-deliver を指定する。 P011 pop3. example ・ org i http://www.jwz.org/doc/content-length.html ii http://www.ics.uci.edu/-mh/ iii ・ - http://qmail.org/ Ⅱ 0 mimedecode mda "/usr/local/bin/scmail—deliver" user satoru protocol apop keep # メールをサーパーに残す 6 http://www.tuxedo.org/-esr/fetchmail/ 147

8. UNIX MAGAZINE 2002年12月号

ー横着 ] プログラミング⑩ 図 10 procmail のレシピ列 1 2 3 4 5 6 7 # Subject: に「一広告※」が含まれるメールを # $MAILDIR/trash へ振り分けるレシピ * : . * iso ー 2022 ー jp * ASubject: . * \ /. * * ? echo "$MATCH" ー nkf —meZI sed 's/ [ \r\n\t\v] //g' ー egrep $MAILDIR/trash/ . : 0 ' 未承諾広告※ ' マニュアルの一番下に次のように書かれていた。 「その昔、規則の開始を示す : 0 の部分は、条件の数Ⅱに 応して、、 : 11 " と書き換える必要があった」 つまり、いまでは 0 に意味はなく、過去の遺物として 残っているだけなのである。これには頭がくらくらした。 4 ~ 6 行目のように、 * から始まる行では条件を定義す る。 4 行目では、 Subject: 行に、、 iso ー 2022 ー jp ' が含まれ る、という牛を正規表現で定義している。 5 行目も条件の定義だが、正規表現に、、 \ / " という見慣 れない表記が含まれている。これは、 \ / 以降でマッチす る文字列を $MATCH という変数に格納するためのおま じないである。 Perl や Ruby などの言語では、 /ASubject:( . *)/ てマッチさせ、括弧のなかてマッチした文字列を $ 1 に格 納するイ士様が一勺だが、 procmail では \ / という独特の 表記を使う 14 6 行目の * に続く ? は、外部プログラムを実行してその 終了ステータスをみるという条件を定義するためのコマン ドである。この行では、 $MATCH に格納された文字列 を nkf15 で変換し、 sed で余計な空白を取り除いてから egrep で、未承諾広告※ " をマッチさせ、みつかったら真 となる条件を定義している。 なぜこんな大掛かりなことをしているかというと、日本 語のメールの Subject: 行は MIME の標準に彳足って、 Subject : 「未承諾広告※横着連載よろしく」 Subj ect : "=?iso—2022—jp?B?GyRCTCQ + NUJ60S05c=> CIoMiNDZU8i01wkaCRtJDckLxsoQg= 14 このため、 List-Id: く f00.example.org 〉というフィールドから ・・〉のなかをマッチさせるには、、 * List-Id: く \ /. * 〉 " に続け て、末尾の〉を削るたノ ) 、、 * MATCH ? ? 八 / 「〉 ] 十 " というリ を書く必要がある。ううむ・・ 15 http://www.ie.u-ryukyu ・ ac ・ jp/&kono/nkf/ ↓ UNIX MAGAZINE 2002 ユ 2 のように符号化されているため、 nkf て復号する必要があ るからである。 nkf は日本語の文字コードを変換する機能 だけでなく、 MIME ヘッダを復号する機能も備えている。 以 - E のすべての条件かマッチしたら、メールを $MAIL- DIR/trash/. にオ褓内する ( 7 行目 ) 。このとき、 末尾が、、 /. " で終る場合は MH 形式てオ褓内 末尾が / て終る場合は MaiIdir 形式てオ内 ・どちらでもない場合は mbox 形式でオ褓内 という処理がおこなわれる。 Subject: 行に、、未承諾広告※ " がまれるメールを振り 分けたいだけなのに、複雑な規則を書いて外部プログラム をたくさん呼び出すのは、何か間違っている気がする。 procmail 恐怖症の原因は、、 : 0 " という謎の行だけでは なく、あらゆるコマンドやフラグが * ! ? $ : c f B などの 1 文字の記号で表記されていることにもよる 16 。 UNIX の 昔ながらのツールの成正ファイルには、ときどきこういっ た 1 文字表記の暗号的なコマンド名や変数名か使われてい るが、これは UNIX 文化の悪い面だと思う。 言算機に習熟した人間は、使いにくかったり設定力貘隹し かったりするツールを、、奥バ架い " と取り違えて、膨大な 労力を費やして受け入れてしまう傾向があるように思う。 複雑屋奇て使いにくいツールが長く使われ続けるという現 象は、この傾向から説明できるような気がする。 ( たかばやし・さとる ソニー CSL / 奈良先立斗 ! 物支彿伏完大学 ) [ 文献 ] [ 1 ] Keith Moore, MIME ひイ t ゆァ ose lnternet スイ 0 〃 月 e れ s れ s 丿 Pa Tん7 、 ee: Message Header Exten- s 乞 0 れ s 和 7 、ル 0 ル ASC 〃 Text, RFC2047 , November 1996 [ 2 ] Harold AbeIson 、 GeraId Sussman 、 Julie Sussman . ー 著、和田英一訳引噂機フ。ログラムの構造と角得も、ピアソン・ 工デュケーション、 2000 年 [ 3 ] 竹卩鮪隹「やつばり Lisp だね」、 bit 2000 年 5 月号 (VoI.32, NO. 5 ) 、 pp. 33 ー 39 [ 4 ] Simon Cozens, "Filtering MaiI with MaiI::Audit and News::Gateway ” , The PerI ノ 0 社 I , Vol.5, No. 2 , 2000 (http://simon-cozens.org/writings/mail-audit. html) 16 procmail のソースコードは見た目の豸咀寺さという点で言這ファイル と共通している。 155