はじめてのGaucheプログラミング
スパムフィルタにbogofilter + KAKASIを使っているのだが、最近誤判定が多くなった。原因はマルチパートのメールなので、適当なMIME展開のフィルタプログラムを書けばいいと思い、Perlのライブラリを調べたけどありすぎてよく分からなかった。そこで、最近Schemeに凝っていることだし、せっかくだからGaucheで書いてみることにした。
(正確に言うと本当に「はじめての」というわけではないんだけど、少なくとも実用的なプログラムはこれが初めて)
#! /usr/bin/env gosh (use srfi-1) (use rfc.822) (use rfc.mime) (use gauche.charconv) (define (decode-from-port port) (let ((headers (rfc822-header->list port))) (mime-parse-message port headers mime-body->string))) (define (decode-from-file file) (call-with-input-file file decode-from-port)) (define (decode-mime-part mime-part) (let ((part-type (slot-ref mime-part 'type))) (cond ((string=? part-type "multipart") (append-map decode-mime-part (slot-ref mime-part 'content))) ((string=? part-type "text") (let* ((parameters (slot-ref mime-part 'parameters)) (charset-pair (assoc "charset" parameters))) (if charset-pair (let ((content (slot-ref mime-part 'content))) (list (ces-convert content (cdr charset-pair)))) '()))) (else '())))) (define (main args) (let ((mime-part (decode-from-port (current-input-port)))) (for-each display (decode-mime-part mime-part))))
ドキュメントを読みながら試行錯誤の末、たったこれだけのプログラムで出来てしまった。やっぱりライブラリの力は偉大だ。