それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

qmailでメールが届いたら、プログラム起動する。

postfixでやっててqmailは余り使わないのでよく知りませんでした。作業で使う機会があって調べたのでまとめ。

qmailでプログラム起動

qmailでは、ユーザーのディレクトリにメールが届く。配送先はもちろん /home/たくや/Maildirです。

takuya@example.comのメアドでプログラム起動

takuya あてのメールは ユーザーディレクトリに配送される。その際にプログラム起動が出来る。

/home/takuya/.qmail
|/usr/bin/ruby /var/www/test/takuya.rb

これを書けば、takuya宛のメールでプログラム起動される。

qmailは複数のサブメアドが作れる

takuya-test@example.comは takuya@example.comと同様に解釈される。

  1. takuya-test@example.comにメールが届く
  2. takuya宛と解釈する。
  3. /home/takuya/.qmail-test の設定を適用する。

この順に配送される。なので、プログラム起動は /home/takuya/.qmail-testに起動コマンドを書く

/home/takuya/.qmail-testでサブメアドでプログラム起動する。

|/usr/bin/ruby /var/www/test/takuya-test.rb #.qmail-testの起動設定

ユーザーが居ない時。aliasを参照する。

blog@example.comのメアドを作って、メールが投稿されたらプログラム起動したい。でもblogユーザはいない(作りたくない)場合。この場合は/var/qmail/alias に配送先を記述する。

blog@example.comのプログラム起動設定

/var/qmail/alias/.qmail-blog を使う。

|/usr/bin/php /var/www/blog/mail/post_by_mail.php
blog-category@example.comのような サブメアドを使う場合。

takuya-test@example.comを takuya@example.comのサブメアドとして作ったように、Aliasのメアドもサブメアドを作ることができる。

  • blog-foods@example.com の配送先
    • /var/qmail/alias/.qmail-blog-foods
  • blog-photos@example.com の配送先
    • /var/qmail/alias/.qmail-blog-photos

以上のように配送先が決まる。これで複数メアドを作ることが出来る。

サブメアドを一括で受けたい。

blog-XXXX@example.com の配送先を一括で指定することも出来るようです。

  • blog-XXXX@example.com の配送先は
    • /var/qmail/alias/.qmail-blog-default

この様になるようです。起動プログラムの書き方は先例に同じです。

別メアドを指定する場合

takuya_1st@example.comを takuya@example.comに配送する場合は、設定ファイルに転送先のユーザー名を書けばいいみたい。

/var/qmail/alias/.qmail-takuya_1st-default

takuya

と書くだけでした。

起動されるプログラム

メールが届いたら起動されるプログラムの書き方はPostfixと同じです。標準入力からメールの内容を受け取ります。プログラム側で標準入力を受け取って、変数に格納してパースすればいいですね。
rubyの場合

mail_str = STDIN.read

phpの場合

<?php
$mail_str = file_get_contents("php://stdin");

メールの文字列は好き勝手に処理できる。プログラム起動のテストをするときは先にダミーメールを作ったほうが楽ですね。

cat sample.eml | ruby test.rb

でテストして動いたらOKですね。メールから起動するプログラムはデバッグが面倒なので、起動する部分と、メイン処理を分けたほうがいい感じ。

まとめ

Qmailは意外とシンプルでした。Postfixより使いやすい感じがしました。これからははqmailにしようかなと思ったわ。