mail response system (hbep#10)
TRANSCRIPT
メールレスポンスシステムin 変なプログラマーの作り方 #10
綿 100% / [email protected]
2
メールレスポンスシステムとは
• メールでやりとりをするシステム– そのまんま
• 空メール– 会員登録– 懸賞
• Amazon モバイル メール検索 サービス– 本文に検索キーワードを入れて送信– 検索結果の URL が返信される
[1]
3
一般的な Web サービスと比べたメリットとデメリット
• メリット– 端末側はメール機能さえあれば良い
• ブラウザとか要らない– 直感的で分かりやすい
• 複雑な操作が要らない
• デメリット– 即時性の欠如
• 送って、返信を待って、受信トレイを開いて・・・– サービスに幅が持たせられない
• インターフェースがメール機能なので・・・
4
これらを踏まえると
(空メールなどの)簡易サービスが圧倒多数なのも納得
5
実現方法
• Sendmail, qmail, Postfix,などの MTA (Message Transfer Agent)に来たメールをスクリプトに渡す。
• スクリプトがメールを受け取り、ごにょごにょ処理– と言った風にさばいていると思われます [2]
MTA
スクリプト
ユーザさんメール メール
メール
メール
来たのを渡す
新規作成
処理
送信
返信
6
スクリプトへの渡し方
• Sendmail, Postfix– .forward ファイルに記述する [3]
• このファイルはメールを転送するだけかと思ってました• qmail
– .qmail ファイルに記述する [2]
• パイプでプログラムと引数を記述– | hoge.exe arg– あと、“ | hoge.exe arg” とか |“hoge.exe arg”
• セキュリティの観点?から Postfix などでは初期設定では無効– :include: ファイルにて
• allow_mail_to_commands = alias,forward,includeとすると OK (らしい) [4]
7
スクリプト側
• メールを送信できる必要がある– MTA を操作できる必要がある
• Perl とかだと– sendmail コマンドをプログラム内から呼び出す
• MTA 共通のメール送信プログラム– qmail, Postfix も互換性維持のため持っている
• Ruby とかだと– Ruby on Rails で ActionMailer というメール送受信モジュールが
使えそう
8
ま、何というか
結構シンプルな感じですね
9
何か作ろうか
• 実際にメールレスポンスシステムを実装したい– でも、自前のメールサーバとか無かったりする
• ISP や GMail のアカウントなら持ってます– なら、それでやってみよう
10
設計
• 持っているアカウントの受信監視をする– 例えば 1 分ごとに見に行く
• 新規メールを受信
• 受信したメールのチェック– 送信元アドレスが xxx じゃなければダメだとか、本文に ooo が
要るとか
• 送信元のメールアドレスに対して返信
11
実装結果
• Perl で実装– メール処理のためのモジュール Net::POP3[5] 、 Net::SMTP[6]
が最初から利用可能– GMail ならば GMail::Checker という直接的なモジュールがあっ
たりする– 最初は Ver.GMail アカウントの実装開始
• GMail は SSL 必須• Perl の SSL モジュールがインストールできない
– Cygwin だから?– 泣く泣く、 Ver.ISP アカウントの実装開始
• こっちは SSL 要らず• 受信はすんなり OK
– $pop3 = Net::POP3->new($popServer);– $pop3->login($id, $password);
12
実装結果 Cont.
• 続き– 受信メールの解析は MIME::Parser モジュールにお任せ
• 送信者” from” は $entity->head->get('from');• 本文” body” は $entity->body;
– 送信• $smtp = Net::SMTP->new( $smtpServer);• $smtp->auth($id, $password)• $smtp->datasend($message)• すんなりうまくいった様に思えたが ( 何もエラー出ないの
で ) 、全くメールが来ない・・・
– ISP の SMTP は SMTP Auth が必要だが、システムに Authen::SASL 入っていなかった(つまり何もしていなかった )
» エラーメッセージ出して欲しいな・・・ orz
13
そんなこんなで、完成(?)
• 今回は、– 一番最新のメール“のみ”受信– 本文に ” hoge” があったら返信対象– hello とだけ本文に書いたメールを返信
• ここからが一番面白いところなのだが、時間切れ・・・– E.g.
本文に書いた場所の天気予報を調べて返してくれる、とか
• <del>デモ </del>– ネット環境が・・・
• 自宅にて動作するのは確認
14
まとめ
• メールレスポンスシステムを構築するための機能は十分揃っている
• スクリプトでメールを扱う手段も十分揃っている– ただし、メールの仕様上、ソフトウェアの作業が大きくなりが
ち• 完全にカバーしようとすると数千行オーダーもザラ
• ネットワークプログラミングはやっぱり To Love る(ぉぃ– 面白いけど
15
ありがとうございました
16
引用・参考
• [1] 45gs 時計とカメラとモバイル : Amazon モバイルで、メールによる商品検索サービス , http://45gs.blog.ocn.ne.jp/45gs/2006/04/amazon_9a47.html
• [2] 受信メールをプログラムに渡すには Netsphere Laboratories : http://www.nslabs.jp/filter-mail.rhtml
• [3] Postfix manual - local(8) : http://www.postfix-jp.info/trans-2.2/jhtml/local.8.html• [4] Postfix 設定パラメータ : http://www.postfix-jp.info/trans-2.2/jhtml/postconf.5.html#allow_m
ail_to_commands
• [5] Net::POP3 - Post Office Protocol 3 Client class (RFC1939) - search.cpan.org : http://search.cpan.org/~gbarr/libnet-1.19/Net/POP3.pm
• [6] Net::SMTP - Simple Mail Transfer Protocol Client - search.cpan.org : http://search.cpan.org/~gbarr/libnet-1.22/Net/SMTP.pm
• [7] Net::SMTP->auth - World Wide Walker : http://yoosee.net/d/archives/2004/08/25/002.html