メールに自動応答してみる

以前、メールを使ったTOPIX版ダウの犬のデータ自動更新をしました。この時は受信メールの内容から必要なデータを抜き出して利用しただけですが、これを応用すればメール自動応答システムが作れますね。

フライト情報メール送信サービスで実際にやってみました。

メールヘッダから情報を得る

RFC2822に規定されている内容によると、必須とされるメールヘッダ内のフィールドは意外と少なくて、実はメールタイトルは規定上オプション扱いです。

フィールド名 内容 備考
Date 発信日付(必須) 発信者のメーラーから発信された日時
From 発信元アドレス(必須) カンマ区切りのひとつ以上のアドレス
Sender 送信責任者アドレス(必須) 発信元アドレスが複数の場合に表示が必要
Reply-to 返信先アドレス(必須) 指定しない場合、Fromが返信先として扱われる
Subject メッセージ見出し(オプション) 規定上は文字列長を満足していれば改行も許される

発信元アドレスが複数可だったり、メールタイトルがオプションだったり複数行に跨っていても良かったりと、調べてみると意外な事実が。。。

今回は発信元アドレスがひとつのみで、メールタイトルは1単語という前提で作りました。

スクリプトを書く

いきなりですが、.forwardで起動されるスクリプトはこんな感じ。

2行目のcatで受信メールを受けて、FromフィールドとSubjectフィールドだけを抜き出して、シェル変数EXTRACTにコピーします。シェル変数内では改行は削除されるので、これらは1行にまとまってしまいます。

#! /bin/sh
EXTRACT=`cat | grep -e "^From:\|^Subject:"`
ADDR=`echo $EXTRACT | grep -o '[A-Za-z0-9.*_=+-]*@[A-Za-z0-9.*_=+-]*'`
SUB=`echo $EXTRACT | sed 's/.*Subject: //'`
/home/odc-tokio/get_once.sh $SUB | /home/odc-tokio/parse_json.sh | mail -s "[${SUB}]Flight Information" $ADDR

メールアドレスの抽出はgrepの-oオプションで。sedでメアド以外を削除しなくても、grep -oならダイレクトにパターンそのものだけを抜き出してくれます。

メールタイトルのほうはフィールド名Subject以下をセパレータの:(コロン)を除いて取り出します。本当はメールヘッダは順不同可なのでこの実装はやばい。

最後にWebデータ取得スクリプトを起動してからJSONパーサを通して整形した内容をmailコマンドで送出します。

メール応答システム

メールアドレスはメーラーがちゃんとつけてくれるのでいいんですが、メールタイトルの文字列は入力間違いも考えられます。

今回は手抜きをして正しい文字列を送ってくれないと正しい情報を返さないというわがままシステムになっていますが、逆にここをちゃんと構文解析できるように作れば、コマンドごとにいろいろな応対が可能な応答システムになりますよ。