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

ついこないだ、ちらっと書いた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個とかメールで返してもらうのも、あり、かなと。こっち側はまだ試行錯誤、だ。
| << | 2026/1 | >> | ||||
|---|---|---|---|---|---|---|
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
【最近の20件】
- 20260129 ブログをレスポンシブ対応にリニューアル
- 20260126 ブログのふり返り
- 20260121 小ネタ:ed25519秘密鍵公開鍵とJson serialized canonical
- 20260120 ActivityPubは自作実装しよう!
- 20260117 RFC9421版HTTP Signatureに対応
- 20260111 HTTP Signatureの署名対象文字列
- 20260109 web本棚のActivityPub対応
- 20260106 web本棚のソースコード公開
- 20260104 web本棚
- 20260101 謹賀新年2026
- 20251231 2025年ふりかえり
- 20251213 perlと30年
- 20251210 ActivityPubの投稿削除
- 20251101 日常雑感
- 20251026 テキトーフェッチメール
- 20251014 ActivityPubサーバーで投稿の編集
- 20251008 元WINDOWS10のノパソにlinux mint
- 20251002 GBLシーズン「変わりゆく物語」でACE到達
- 20250925 ブログのアクセス制限
- 20250922 ActivityPubサーバーに引用を実装


