メール受信時に perl スクリプトを起動して自動処理させる方法

2007年11月20日 10:46 メール受信時に perl スクリプトを起動して自動処理させる方法

メールが届くと同時に何らかのアクションを起こすプログラムというのは、かなり作る機会の多い部類に入るかと思います。

ここ数年で特に多いものだと、ケータイ向けサイトの案件で、空メールを受信したら自動でユーザー登録用のフォームのアドレスを書いたメールを、空メール送信者に送る、みたいなものとか、ブログやSNSの日記なんかを、ケータイメールで投稿できるようにする処理とかですね。
そして王道の自動返信メールとか。

後、途中で飽きちゃったんですが、昔、送られてくるメールの内容を自分で学習して言葉を覚えて、文章を生成して返信する bot (人工無脳)を趣味で作ってたことがあります。

で、実際こういう「メールを受け取ったら何らかの処理を自動で行なう」という機能を実現するには、どうすれば良いかというと、

  1. 特定のメールアカウントにメールが届いた際に、何らかのプログラムが起動するように設定する
  2. そのプログラムを書く

という二つのステップが必要になります。

まずは、この1ステップ目の「特定のメールアカウントにメールが届いた際に、何らかのプログラムが起動するように設定する」方法について、簡単にまとめてみます。

aliases を使う場合

aliases の設定と使い方についてのメモにも書きましたが、下記のようにすることで、特定のアカウントに届いたメールを、パイプを使って直接何らかのプログラムに渡して実行することができます。

entry: "|/home/tatsuya/entry.pl"

上記の例では、「entry」というメールアカウントにメールが届いた際に、自動的に「/home/tatsuya/entry.pl」という perl スクリプトが起動するように設定しています。

~/.forward を使う場合

サーバーの各ユーザーアカウント毎に、個別に設定が可能な ~/.forward を使う場合は(レンタルサーバーを使う場合はこちらの方が利用する機会が多いかもですね)、~/.forward に以下のように書けばOKです。

"|exec /home/tatsuya/entry.pl"

procmail を使う場合

届いたメールに対して、自動でマッチング処理等を行なって、結果によって行なう処理を振り分けてくれる便利な存在である procmail を使う場合は、~/.procmailrc に以下のように書きます。

:0 :
* ^To: entry
| /home/tatsuya/entry.pl

^To: entry」の部分は正規表現が使えるので、メールのヘッダ(FromやSubject等)に対して細かい条件を設定して振り分けることで、一つのメールアカウントで様々な処理を行なうことができるのも良いですね。

メールを処理する perl スクリプトの書き方

さて、続いて第2ステップ「そのプログラムを書く」の部分です。

aliases、~/.forward、procmail の三種類の設定方法を紹介しましたが、どの方法を用いても、「指定したプログラムの標準入力に、受け取ったメールの内容を渡す」というのは同じです。

つまり、受け取る側の perl スクリプトでは、標準入力の内容を読めば良いだけです。

while(<STDIN>){
	#-- 「$_」にメールの内容(ヘッダも本文も添付ファイルも全て)が
	#-- 一行ずつ代入されていくので、正規表現とかを使って色々処理する
}

これだけです。

後は、「メール送信者のアドレスをデータベースに登録しておいて、ユーザー登録用のURIを生成してメールを返信する処理を書く」とか、「メール送信者のアドレスからユーザーIDを引っ張ってきて、メール本文の内容をそのユーザーIDの日記に投稿させる」とか、「本文を形態素解析して、内容を bot (人工無脳)に覚えさせる」とか、色々とやれば良いわけです。

ブックマークに追加する
関連するブログ記事
スポンサード リンク
カテゴリー
Linux/UNIX | perl/CGI
タグ
.forward | aliases | perl | procmail | sendmail | SMTP | UNIX | ケータイメール | コマンドライン | メール | モバイル | レンタルサーバー | 人工無脳

コメント(0) | トラックバック(1)

 

aliases の設定と使い方についてのメモ

順番的には、virtmapsの設定と使い方についてのメモよりも先にこっちを書くべきだったかなぁ、とか思ったりもして、とりあえず今回は aliases についてのメモです。

aliases とは

/etc/aliases (VPS の場合は ~/etc/aliases) にある設定ファイルのことです。

このファイルを編集することで、sendmail のメールアカウントに対して、別名(エイリアス)を設定することができます。

aliases の設定方法

例えば、「info」というアカウント宛のメールを、実際には「webmaster」というアカウントに配送したい、という時には、

info: webmaster

と書きます。

同一サーバー内ではなく、別のドメインのメールアドレス等に転送をしたいという場合は、

info: another@domain.com

のようにすれば、「info」宛のメールを「another@domain.com」に直接転送できます。

さらに、サーバーのメールボックスに保存しつつ転送、ということも可能です。
その場合、

info: webmaster, another@domain.com

と書けば、「info」宛のメールを「webmaster」のメールボックスに保存しつつ、「another@domain.com」に転送できます。

また、

junk: /dev/null

という風に、配送先を/dev/nullに指定すると、どこにも届かなくなるので、ムダなエラーメール・SPAMメールのログで容量を取りたくない、なんて時には virtmaps のワイルドカードと組み合わせる事で、役に立つかもしれません。

届いたメールを、パイプを使って直接何らかのプログラムに渡して実行することもできます。

autoresponse: "|/usr/bin/autoresponse-script"

等と設定すれば、「autoresponse」というアカウント宛のメールが届いた時に、自動で「/usr/bin/autoresponse-script」というプログラムが実行されます。

特定のメールに対する自動返信スクリプト等を書いた際に便利ですね。

設定ファイルを編集した後は、シェル上で、

% newaliases

というコマンドを実行すれば、設定が反映されます。

ただし、VPS(バーチャル・プライベート・サーバー)の場合には、

% vnewaliases

というコマンドになります(VPSにもよるんでしょうけど)。

aliases でできないこと

virtmaps の設定と使い方についてのメモでも書いた通り、 aliases では所謂「バーチャルドメイン」とか「バーチャルサブホスト」等と呼ばれる、複数ドメインをひとつのサーバーアカウントで管理する場合には、その「複数ドメイン」という概念に対応できません。

「goodhope.jp」と「abe-tatsuya.com」という二つのドメインを管理していた場合、 aliases で、

hatsunemiku: miku

と設定していたら、「hatsunemiku@goodhope.jp」宛のメールも「hatsunemiku@abe-tatsuya.com」宛のメールも、どちらも「miku」というアカウントに配送されてしまいます。

aliases だけでは異なるドメインのメールアカウントに対しての別名(エイリアス)を設定することはできないので、それを実現するためには virtmaps を使う必要があります。

ただし、 virtmaps の方はパイプを使って、メール受信時に直接プログラムを起動するようなことができないので、どちらも併用することになるでしょう。

ちなみに、メールが届いた際に処理される順番は、 virtmaps ⇒ aliases の順番です。

ブックマークに追加する
関連するブログ記事
カテゴリー
Linux/UNIX
タグ
aliases | sendmail | SMTP | UNIX | virtmaps | VPS | コマンドライン | シェル | メール | レンタルサーバー

コメント(0) | トラックバック(0)

 

virtmapsの設定と使い方についてのメモ

virtmaps とは

同一サーバーで、複数のドメインを利用する、所謂バーチャルドメインとかバーチャルサブホストとか、そんな感じで呼ばれているやつで使います。

SMTPサーバーは、このバーチャルドメインとかバーチャルサブホストとか呼ばれるものを処理できないらしいです。

例えば、僕が使っているこのレンタルサーバーで、今「abe-tatsuya.com」(このブログのドメインですね)と「goodhope.jp」(仕事の方のサイトのドメインです)の二つを管理しています。

その場合、Apache(Webサーバー)は、「abe-tatsuya.com と goodhope.jpは別物だ」と理解していますが、SMTPサーバーの方は、「hatsunemiku@abe-tatsuya.com と hatsunemiku@goodhope.jp は、どちらも同じうちのサーバーの hatsunemiku アカウント宛のメールだ」としか理解できません。
つまり、どっちのドメイン宛にメール出しても「hatsunemiku」という同一のメールボックスに届くわけです。

これだと、複数のドメインの「info@~~」とか「webmaster@~~」とか「support@~~」みたいな、よくあるわかりやすいメールアドレスを、それぞれ別のメールボックスで管理できなくて不便ですよね。

それを解決するのが、 virtmaps です。

virtmaps の設定方法

~/etc/virtmaps という設定ファイルを編集することで、virtmaps の挙動を設定することができます。

基本的な使い方は簡単。例えば上記の例の場合なら、

hatsunemiku@abe-tatsuya.com	hatsunemiku_a
hatsunemiku@goodhope.jp	hatsunemiku_g

という二行を追加すれば、「hatsunemiku@abe-tatsuya.com」宛のメールは「hatsunemiku_a」というメールボックスへ。「hatsunemiku@goodhope.jp」宛のメールは「hatsunemiku_g」というメールボックスへ。それぞれ渡されます。
※もちろん、事前に「hatsunemiku_a」「hatsunemiku_g」というメールアカウントを作成しておく必要があります。

設定ファイルを編集したら、シェル上で、

% vnewvirtmaps

というコマンドを実行すれば、編集した設定が反映されます。

また、ちょっと便利な使い方としては、例に出した「hatsunemiku@goodhope.jp」なんていうメールアドレスの場合、メール送信者がアドレスを直接入力して送ろうとした際に、間違って「hatunemiku@goodhope.jp」宛に送ってしまう、というようなことは、ありがちですよね。

こういう時に、

hatsunemiku@goodhope.jp	hatsunemiku_g
hatunemiku@goodhope.jp		hatsunemiku_g

としておけば、スペルミスの方のメールアドレスでも、ちゃんとメールボックスにメールが届きます。
(まあこれは本来 aliases で設定するべきものかもですが……それを複数ドメインで実現するには virtmaps じゃないと無理ですよね)。

それと、 virtmaps ではドメイン名でのワイルドカードが使えるので、

abe-tatsuya.com	tatsuya

としておくと、「aaaaa@abe-tatsuya.com」だろうが「kameda-brothers@abe-tatsuya.com」だろうが、そのメールアカウントを作っている・作っていないおかまいなしに、全ての「abe-tatusya.com」ドメイン宛のメールが「tatusya」のメールボックスに届きます。
※もちろん「tatsuya」というメールアカウントだけは作っておかないといけませんが。

なお、virtmaps の設定ファイルは、上から順に判定されていき、マッチした時点で処理され、そこから先は判定されません。
ですので、

abe-tatsuya.com		tatsuya
hatsunemiku@abe-tatsuya.com	hatsunemiku_a

とやっちゃうと、「hatsunemiku@abe-tatsuya.com」宛のメールも一行目の条件にマッチしてしまうため、「hatsunemiku_a」には届かず「tatsuya」に届いてしまいます。

virtmaps でできないこと

まず、正規表現は使えません。

正規表現が使えたら、何かのWebアプリケーションの動作確認テストとかで大量にメールアドレスを作って、新規登録のエラーパターンを試したい、とかいう時に、

test\d{3}@goodhope.jp	test

とか設定できると、凄く便利なんですけどね……。

それと、届いたメールを、パイプを使って何らかのプログラムに渡すようなこともできません。

Webアプリケーション側で、ランダムな文字列でメールアドレスを生成して、そのアドレス宛にユーザーからメールを送ってもらうことで、何らかの認証をする、なんていう仕組みは、特に携帯関連でこれからどんどんニーズが高まっていくと思いますが(mixiとかOpenPNEなんかも携帯での投稿機能をそれで実現してますよね)、それを virtmaps だけで実現することは出来ません。

mobile-service.com	"|/home/tatsuya/mail-filter.pl"

みたいなことができたら、凄く便利なんですけどね……。

ただ、これには抜け道があります。
virtmaps と aliases では、virtmaps が先に処理されて、その後 virtmaps によって振り分けられたアカウントに対して、aliases での設定が処理されるからです。

aliases ならパイプが使えるので、 virtmaps には

mobile-service.com	mailfilter

みたいな感じで、全てのメールを mailfilter アカウントに渡すようにしておいて、 aliases の設定ファイルに、

mailfilter: "|/home/tatsuya/mail-fileter.pl"

という風に「mailfilter」というアカウント宛のメールを「/home/tatsuya/mail-fileter.pl」に渡すように設定しておけば、結果的に「mobile-service.com」ドメイン宛の全てのメールを、「/home/tatsuya/mail-fileter.pl」というプログラムに渡して、何らかの認証処理等を行うことができるわけです。

ブックマークに追加する
関連するブログ記事
カテゴリー
Linux/UNIX
タグ
aliases | OpenPNE | sendmail | SMTP | UNIX | virtmaps | VPS | ケータイメール | コマンドライン | シェル | メール | モバイル | レンタルサーバー

コメント(0) | トラックバック(0)

 

crontabの設定方法

2007年10月16日 23:59 crontabの設定方法

今回は旧ブログから記事を引っ張ってきました。

cronの設定に関するメモ書きです。


予め定められたスケジュール通りに、定期的に処理を実行する cron 。
この名前はギリシャ神話の時の神クロノスから取ってるそうな。
以下、FreeBSDでのcron利用方法。

現在登録しているスケジュールの設定を表示するには、シェル上で、

% crontab -l

とする。

スケジュール設定を編集する時は、

% crontab -e

とすると、エディタが起動し、設定ファイル編集画面になる。

設定ファイルの記述方法は、一行につきひとつのスケジュールで、
分 時 日 月 曜日 コマンド
という形式。
「分 時 日 月 曜日」のそれぞれには * が使える。

例えば、サーバーのアクセスログを解析する /home/amethyst/src/analyze.pl というperlスクリプトを作った後、それを毎日朝の5時に実行したい、という時は、

0 5 * * * /usr/local/bin/perl /home/amethyst/src/analyze.pl

とすれば良い。

曜日は0が日曜で6が土曜となる。
毎週月曜と木曜の13時にcommandを実行したいなら、

0 13 * * 1,4 command

となる。
上記の例のように、コンマで区切ることで複数の条件を指定することができる。

標準出力に出力されるコマンドの実行結果は、設定したアカウントのメールアドレス宛に送信される。
結果をメールで受け取りたくない場合は、出力を /dev/null に渡せば良い。

0 13 * * 1,4 command 1> /dev/null

上記のように設定しても、標準エラー出力に対する出力(要するに何らかのエラーがあった際のメッセージ)はメールで送信される。
エラー出力もメールで受け取りたくい場合は、

0 13 * * 1,4 command /dev/null 2>&1

とすれば良い。

cronからのコマンド実行時は環境変数がほとんど設定されないことが多いので、cronから直接コマンドを実行するよりも、最初からシェルスクリプト内に環境変数設定とコマンドを書いて、cronからそのシェルスクリプトを実行した方が余計な手間が省けることが多い。


ここまでが旧ブログの記事。

ここからは今回の追記です。

例えば、10分毎になんらかのプログラムを起動するするように設定したい場合、

0,10,20,30,40,50 * * * * command

と書けばいいわけですが、ちょっとめんどくさいですよね。

そういう場合は、

*/10 * * * * command

と書けば、10分毎にcommandが実行されます。

ブックマークに追加する
関連するブログ記事
カテゴリー
Linux/UNIX
タグ
crontab | FreeBSD | UNIX | コマンドライン | シェル

コメント(0) | トラックバック(0)

 

このブログについて

阿部辰也

Webコンサルタントやシステムエンジニア、執筆業などをやっている、阿部辰也のブログです。
Web技術系のTipsから仕事の話、趣味の話まで色々と。
人生は所詮生まれてから死ぬまでの壮大な暇つぶし。
だったら有意義に暇をつぶして生きましょー。

このブログのサイトマップ
このブログのはてなブックマーク数

Feed/RSS購読

スポンサード リンク

はてなブックマーク

タグクラウド