mail response system (hbep#10)

16
メメメメメメメメメメメメ in メメメメメメメメメメメメ #10 メ 100% / men100percent [email protected]

Upload: men100per

Post on 10-Aug-2015

1.081 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Mail Response System (HBEP#10)

メールレスポンスシステムin 変なプログラマーの作り方 #10

綿 100% / [email protected]

Page 2: Mail Response System (HBEP#10)

2

メールレスポンスシステムとは

• メールでやりとりをするシステム– そのまんま

• 空メール– 会員登録– 懸賞

• Amazon モバイル メール検索 サービス– 本文に検索キーワードを入れて送信– 検索結果の URL が返信される

[1]

Page 3: Mail Response System (HBEP#10)

3

一般的な Web サービスと比べたメリットとデメリット

• メリット– 端末側はメール機能さえあれば良い

• ブラウザとか要らない– 直感的で分かりやすい

• 複雑な操作が要らない

• デメリット– 即時性の欠如

• 送って、返信を待って、受信トレイを開いて・・・– サービスに幅が持たせられない

• インターフェースがメール機能なので・・・

Page 4: Mail Response System (HBEP#10)

4

これらを踏まえると

(空メールなどの)簡易サービスが圧倒多数なのも納得

Page 5: Mail Response System (HBEP#10)

5

実現方法

• Sendmail, qmail, Postfix,などの MTA (Message Transfer Agent)に来たメールをスクリプトに渡す。

• スクリプトがメールを受け取り、ごにょごにょ処理– と言った風にさばいていると思われます [2]

MTA

スクリプト

ユーザさんメール メール

メール

メール

来たのを渡す

新規作成

処理

送信

返信

Page 6: Mail Response System (HBEP#10)

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]

Page 7: Mail Response System (HBEP#10)

7

スクリプト側

• メールを送信できる必要がある– MTA を操作できる必要がある

• Perl とかだと– sendmail コマンドをプログラム内から呼び出す

• MTA 共通のメール送信プログラム– qmail, Postfix も互換性維持のため持っている

• Ruby とかだと– Ruby on Rails で ActionMailer というメール送受信モジュールが

使えそう

Page 8: Mail Response System (HBEP#10)

8

ま、何というか

結構シンプルな感じですね

Page 9: Mail Response System (HBEP#10)

9

何か作ろうか

• 実際にメールレスポンスシステムを実装したい– でも、自前のメールサーバとか無かったりする

• ISP や GMail のアカウントなら持ってます– なら、それでやってみよう

Page 10: Mail Response System (HBEP#10)

10

設計

• 持っているアカウントの受信監視をする– 例えば 1 分ごとに見に行く

• 新規メールを受信

• 受信したメールのチェック– 送信元アドレスが xxx じゃなければダメだとか、本文に ooo が

要るとか

• 送信元のメールアドレスに対して返信

Page 11: Mail Response System (HBEP#10)

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);

Page 12: Mail Response System (HBEP#10)

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

Page 13: Mail Response System (HBEP#10)

13

そんなこんなで、完成(?)

• 今回は、– 一番最新のメール“のみ”受信– 本文に ” hoge” があったら返信対象– hello とだけ本文に書いたメールを返信

• ここからが一番面白いところなのだが、時間切れ・・・– E.g.

本文に書いた場所の天気予報を調べて返してくれる、とか

• <del>デモ </del>– ネット環境が・・・

• 自宅にて動作するのは確認

Page 14: Mail Response System (HBEP#10)

14

まとめ

• メールレスポンスシステムを構築するための機能は十分揃っている

• スクリプトでメールを扱う手段も十分揃っている– ただし、メールの仕様上、ソフトウェアの作業が大きくなりが

ち• 完全にカバーしようとすると数千行オーダーもザラ

• ネットワークプログラミングはやっぱり To Love る(ぉぃ– 面白いけど

Page 15: Mail Response System (HBEP#10)

15

ありがとうございました

Page 16: Mail Response System (HBEP#10)

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