ケータイメールでtwitterに発言

2009/9/26 [17:57:42] (土) 天気

ついこないだ、ちらっと書いたtwitterにメールで発言するスクリプトを。

ぐーぐる様詣でをすれば、すぐに出てくるネタで新鮮味もないんだけど、メールを受け取るところからの解説記事が少なかったんで、自分メモ。


前提としてメールサーバーはqmail。

HOMEにtwitter用のドットファイルを用意する。たとえば .qmail-mytwitter。中身はパイプでスクリプトに渡しているだけの1行。たとえばこんな感じ

| twitter.pl

送られてきたメールは、このtwitter.plが処理する。


twitterに投稿するにはユーザー名とパスワードが必要なので、データベースでもcsvファイルでもいいから、なにかに記録・登録しておく。このとき一緒に、投稿に使うケータイのメールアドレスも記録・登録する。

送られてきたメールをかまわずtwitterに投稿するわけにはいかない。まずは誰から送られてきたメールなのかを判定する必要がある。


my ( $emailaddr ) = $ENV{’RPLINE’} =~ /\<([^\>]+)\>/;

qmailの環境変数 RPLINE は return path (ほぼ送信元のメールアドレスのこと)が入るので、これを使う、てのがキモ。こいつを見て、登録されているメールアドレスなら、そのユーザー名とパスワードを使って、twitterに投稿する。登録されていないメールアドレスだったら、なにもしない。


送り先のメールアドレスがバレても、returnpathのチェックが入る。returnpathを偽装されても登録されているメールアドレスでチェックをする。エラーの場合は何も返さず沈黙する。

てことで、なりすましや何かの踏み台に使われることも、ない、ハズ。セキュリティ的に問題になりそうなのはパスワードを平文で保存しているところ。でも、twitterそのものが認証はBasic認証だし、jsonpでAPIを使ってるひとのソースをみるとJavascriptにユーザー名とパスワードを書くことになっているのが目につく(=パスワード丸見え)

てことで、ここは目をつぶってtwitterだけにしか使わないパスワードにする・定期的にパスワードを変えることでカバーしよう。DBにしろcsvにしろ、ウチのポンコツサーバーから持ち出される、なんてことはほぼ考えられないし。


後は、誰が書いても、どんな環境でも、ほぼ同じスクリプト。

↓こんなでメールを解析して


sub parse_mail{
  my $self = shift;
  my $mparse = new MIME::Parser;
  $mparse->output_to_core(1);
  my $entity = $mparse->parse( \*STDIN );
  return {
    charset=>$entity->head->mime_attr(’Content-Type.charset’),
    body=>$entity->bodyhandle->as_string
    };
}

メール本文と文字コードを取り出して

↓こんなでtwitterにPOSTする


sub post2twitter{
  my $self   = shift;
  my $twt    = shift;
  my $message = shift;
  return -1 if length($message) > 140;
  return -1 if ! $twt;
  my $uri = $self->{twitter} . $self->{update};
  my $req = HTTP::Request->new( POST=>$uri );
  $req->authorization_basic( $twt->{user}, $twt->{pass} );
  $req->content( "status=" . $self->html_encode($message) );
  my $ua = LWP::UserAgent->new( agent => $self->{ua}, keepalive => 4 );
  my $res = $ua->request( $req );
  my $stat = $res->status_line;
  return $res->is_success ? 0 : $stat;
}

メッセージが140文字以上だったらなにもしない。

ケータイのメールアドレスから取り出したユーザー名とパスワードを$twtに渡すのでそれを使ってtwitterのBasic認証をする。

メッセージ本体はhtmlエンコードをする。

POSTで投稿する。


というだけの手抜きなシロモノ。


twitterみたいな気楽な巨大チャットにはモバイルは最適、だと思う。ケータイで使えるモバツイッターや、iPhoneなどのスマートフォン向けのアプリが充実してるのも当然。わたしの場合はauで、パケットのコースのこともあるので、メールで投稿できたほうがいいかな、と。


ケータイで見るのをどうしようか検討中。とりあえず、ezwebで見るようにスクリプトを書いたんだけど、なんかビミョー。それなら、空メールを送ったら返信で最新のつぶやき20個とかメールで返してもらうのも、あり、かなと。こっち側はまだ試行錯誤、だ。


Linuxで作る完全メールシステム構築ガイドsendmail/Postfix/qmail対応 (Network Server Construction Guide S)

『Linuxで作る完全メールシステム構築ガイドsendmail/Postfix/qmail対応 (Network Server Construction Guide S)』

デージーネット

<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】