maildropを使ってみる
maildropは、maildrop独自のスクリプトファイルによって指示されたメールの振り分けを行います。
そのファイルは、以下のとおりで、maildropが読み込む順番の下記のとおりです。
- /etc/maildroprc
→ このファイルは、サーバーで受信したすべてのメールに対していmaidropの指示を指定します。
- ($HOME)/.mailfilter
→ このファイルは、ユーザのホームディレクトリに設置され、そのユーザ宛のメールに対してmaidropの指示を指定します。
以下にいろんなパターンで簡単に解説してみます。
cc は、メールをコピーするという意味です。
例えば、/home/hoge/.mailfilter の以下のように cc を記述したとします。
これは、メールをコピーして、”!hanako” を実行しなさいという意味なので、コピーしたメールは、サーバーユーザーのhanakoさんへメール配信されます。
ここでの ! は、メール配信の命令を意味します。もちろん、! の後は外部メールアドレスでもOKです。
cc "! hanako@other-server.com"
|
上記の例では、コピーしたメールは、hanako@other-server.comへ配信されます。
また、以下のようにファイル名を指定することもできます。
$HOME は予約語で、ユーザのホームディレクトリを指します。
この場合、/home/hoge/mailarchive というファイルがなければ作成され、そこに追加保存されていきます。
| パイプを指定してプログラムを実行することもできます。
cc "| /usr/bin/php $HOME/mailfoward.php"
|
上記の例では、/home/hoge/mailfoward.php が実行されます。
/home/hoge/mailfoward.php に以下のような記述を行えば、cc “$HOME/mailarchive” と同じ動作をします。
<?php
file_put_contents("/home/hoge/mailarchive",file_get_contents("php://stdin"),FILE_APPEND);
?>
|
phpでメールを取り出したい場合、標準入力からの受信すればOKですから、
$mail = file_get_contents("php://stdin");
|
これで、
$mailにメールが格納されます。あとは、
$mailの内容を判定して、メール配信制御を行えばOKです。
to は、メールの宛先を変更するという意味です。
例えば、/home/hoge/.mailfilter の以下のように to を記述したとします。
これは、メールの宛先を、”!hanako” にしなさいという意味なので、メールは、サーバーユーザーのhanakoさんへメール配信されます。
ここでは、メールはコピーされたわけではありませんから、hogeさんへはメール配信されません。
cc 同様に外部メールアドレスやファイル名、プログラムなどを指定することができます。
to "! hanako@other-server.com"
|
to "| /usr/bin/php $HOME/mailfoward.php"
|
いずれもhogeさんのメールボックスにメールが配信されることはありません。
if 文でメールを判別してみます。
例えば、/home/hoge/.mailfilter の以下のように if を記述したとします。
if (/^From:.*hanako@.*/)
{
cc "! taro"
}
|
if 文の後の括弧
{ は、必ずifとは別行にしなければなりません。
以下のように 同一行に括弧を付けることは間違いです。正しく動作しません。
if (/^From:.*hanako@.*/) {
cc "! taro"
}
|
また、if 文の判定内容の
/ ~
/ のスラッシュで囲まれた記述は、メールを正規表現で検索した結果を意味します。
つまり、以下の記述例は、メールを 正規表現 /^From:.*hanako@.*/ で検索した結果、存在したら
真、存在しなかったら
偽ということになります。
上記の意味を簡単に解説すると、
行の先頭から
From: という文字列を検索し、その行に
hanako@という文字列が存在するか検索をかけることになります。
これは、hanako と名の付くメールアドレスから着たメールはすべて サーバーユーザーの taroさんへ コピーをメール配信します。
ccなので、これは、hogeさんのメールボックスにも配信されます。
このif文には、予約語も使うことができます。
if ($LINES > 100) {
cc "! taro"
}
if ($SIZE > 10000) {
to "! hanako"
}
|
$LINES は予約語で、(ヘッダ部分を含む)メール本文の行数になります。
$SIZE は予約語で、(ヘッダ部分を含む)メール本文のバイトサイズになります。
この例は、メール本文が100行を超える場合は、サーバーユーザーの taroさんへ コピーをメール配信します。
ccなので、これは、hogeさんのメールボックスにも配信されます。
ただし、サイズが10000バイト(10K)を超える場合は、hanakoさんへ宛先を変更します。
exit は、配信終了の意味です。
例えば、/etc/maildroprc の先頭行に以下のようにexitを記述したとします。
これは、このサーバー宛のメールは、この時点で配信終了ですから、誰にも配送されないことを意味します。
例えば、以下のような記述をサーバー全体の/etc/maildroprc に記述したとします。
if (!/^(Delivered-To:|To:).*hanako@.*/)
{
to "!hanako"
exit
}
|
これは、hanakoさん宛のメール以外は、すべて、サーバーユーザのhanakoさんへ送信し、終了します。
つまり、hanakoさん以外にはメールは配信されません。
また、hanakoさん宛のメールは、exitがありませんから、そのままhanakoさんへメール配信されますから、あとは、/home/hanako/.mailfilter の指示に従うことになります。
よくある間違いは、cc の後に exit を入れてしまう場合です。
例えば、/home/hoge/.mailfilter の以下のようにccを記述したとします。
これは、1行目は、コピーしたメールをサーバーユーザーのhanakoさんへメール配信することは、先に述べました。
2行目は、ここでメール配信終了という意味であるこも、ここで述べました。
つまり、hogeさんには、メールは届かないということです。これって、メールのCCの間隔で、ccを指定しているので、メールが届くのではないかと思いがちですが届きません。
hogeさんにもメールを配信したい場合は、exitを記述してはいけません。
mailbot を使って自動返信してみます。
mailbot は、maildropに同梱されている MIME対応自動返信ツール です。
mailbot を使うと、簡単に自動返信メールを配信することができます。
例えば、/home/hoge/.mailfilter の以下のように mailbot を記述したとします。
if (/^From:.*hanako@other-host.com.*/)
{
cc "| mailbot -t $HOME/autores.eng /usr/sbin/sendmail -t"
}
|
ここで指定している $HOME/
autores.eng は、返信メッセージが書かれたファイル名になります。
ここでは、以下のような文言が書かれているとします。
$ cat /home/hoge/autores.eng
This email was replied auto.
|
また、/usr/sbin/
sendmail は、文字通り sendmail コマンドです。パスは、環境によって異なりますので、必ず、確認しましょう。
$ which sendmail
/usr/sbin/sendmail
|
簡単に動作を解説すると、
これは、hanako@other-host.com のメールアドレスから着たメールに、autores.eng というファイルの内容を付加して自動返信します。
また、cc にパイプ | を使ってmailbotコマンドへメールを引き渡しています。
その後にexitもないですから、hogeさんのメールボックスにも配信されます。
これで自動返信されたメールは、以下のようになります。
From hanako Fri Nov 23 23:15:36 2012
Return-Path: <hoge@exmaple.com>
X-Original-To: hanako@other-host.com
Delivered-To: hanako@other-host.com
Received: by exmaple.com (Postfix, from userid 501)
id 812C2413C8; Fri, 23 Nov 2012 23:15:36 +0900 (JST)
Precedence: junk
Auto-Submitted: auto-replied
To: hanako@other-host.com (hanako)
References: <20121123141536.7046A413C6@exmaple.com>
In-Reply-To: <20121123141536.7046A413C6@exmaple.com>
Subject: Re: Sample-mail
Mime-Version: 1.0
Content-Type: text/plain; format=flowed; delsp=yes; charset="US-ASCII"
Content-Transfer-Encoding: 8bit
Message-Id: <20121123141536.812C2413C8@exmaple.com>
Date: Fri, 23 Nov 2012 23:15:36 +0900 (JST)
From: hoge@exmaple.com
hanako writes:
> This is Sample mail.
This email was replied auto.
|
mailbot を使って自動返信の日本語化をしてみます。
さて、今度は、日本語化に挑戦です。
メール関係は、日本語の問題が最も大きいです。そのために、phpやperlで処理を書いてしまいたくなりますね。
ここでは、mailbot、reformime (こちらもmaildropに同梱されているMIME変換ツールです) を使ってやってみます。
メールの日本語化は、JISコードへのエンコード化でもあります。
まずは、日本語の返信メッセージを日本語で記述し、JISコード(ISO-2022-JP)への変換します。
とりあえず、以下のようなメッセージを書いたとしましょう。
Linux上ではデフォルトUTF-8なので、UTF-8からJISコード(ISO-2022-JP)へ変換してファイルへ保存します。
$ echo 'このメールは、自動返信されました。'|nkf -Wj > /home/hoge/autores.jpn
|
ここでは、エンコードに
nkfを使っています。
nkfは、文字コード間の相互変換を行う古くからあるツールで、日本発の非常に便利なツールです。
nkfのオプションとして以下のものを覚えておくとほとんど文字コード変換は対応できてしまいます。便利なツールですね。
m[BQN0] MIME decode [B:base64,Q:quoted,N:non-strict,0:no decode]
M[BQ] MIME encode [B:base64 Q:quoted]
j,s,e,w Outout code is JIS 7 bit (DEFAULT), Shift JIS, EUC-JP, UTF-8N
After 'w' you can add more options. -w[ 8 [0], 16 [[BL] [0]] ]
J,S,E,W Input assumption is JIS 7 bit , Shift JIS, EUC-JP, UTF-8
After 'W' you can add more options. -W[ 8, 16 [BL] ]
|
ただ最近では、国際化、標準化の流れから
iconvを使うことが多くなっているようです。
iconvで変換する場合は、以下のようになります。
$ echo 'このメールは、自動返信されました。'|iconv -f UTF-8 -t ISO-2022-JP > /home/hoge/autores.jpn
|
また、
nkfがインストールされていないようなら、インストールしましょう。
CentOS/
Scientific Linux
$ yum install nkf
...
|
Debian/
Ubuntu
$ aptitude install nkf
...
|
/home/hoge/.mailfilter は、以下のように変更します。
if (/^From:.*hanako@other-host.com.*/)
{
# 以下のように変更します。
# cc "| mailbot -t $HOME/autores.eng /usr/sbin/sendmail -t"
cc "| mailbot -t $HOME/autores.jpn -c 'ISO-2022-JP' /bin/cat|reformime -r7|/usr/sbin/sendmail -t "
}
|
ちょっとややこしいですが、この1行で自動返信できます。
これの実行結果が以下のようなものです。
From hanako Fri Nov 23 23:15:36 2012
Return-Path: <hoge@exmaple.com>
X-Original-To: hanako@other-host.com
Delivered-To: hanako@other-host.com
Received: by exmaple.com (Postfix, from userid 501)
id 812C2413C8; Fri, 23 Nov 2012 23:15:36 +0900 (JST)
Precedence: junk
Auto-Submitted: auto-replied
To: hanako@other-host.com (hanako)
References: <20121123141536.7046A413C6@exmaple.com>
In-Reply-To: <20121123141536.7046A413C6@exmaple.com>
Subject: Re: Sample-mail
Mime-Version: 1.0
Content-Type: text/plain; format=flowed; delsp=yes; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
X-Mime-Autoconverted: from 8bit to 7bit by reformime (maildrop 2.6.0)
Message-Id: <20121123141536.812C2413C8@exmaple.com>
Date: Fri, 23 Nov 2012 23:15:36 +0900 (JST)
From: hoge@exmaple.com
hanako writes:
> This is Sample mail.
このメールは、自動返信されました。
|
mailbotは、
Subjectもオプションで指定できます。この場合も日本語を用いたい場合は、日本語化する必要があります。
この場合は、もうちょっと変換が面倒で、以下の手順をふみます。
- JIS (ISO-2022-JP) に変換します。
- 更に Base64 で変換します。
- 変換した文字コードの前後に ‘=?ISO-2022-JP?B?’ と ‘?=’ を付けます。
これをnkfでやると、以下のようになります。
$ echo "これは日本語タイトルです" | nkf -WM
=?ISO-2022-JP?B?GyRCJDMkbCRPRnxLXDhsJT8lJCVIJWskRyQ5GyhC?=
|
また、iconv では、以下のように openssl の base64変換とともに実行します。
$ echo "=?ISO-2022-JP?B?"`echo -n "これは日本語タイトルです" | iconv -f UTF-8 -t ISO2022JP | openssl base64`"?="
=?ISO-2022-JP?B?GyRCJDMkbCRPRnxLXDhsJT8lJCVIJWskRyQ5GyhC?=
|
*echo に
-n を指定しないと改行コードまでエンコードされてしまいます。
最後に、ここで出力されたコードで、
/home/hoge/
.mailfilter を、以下のように変更します。
if (/^From:.*hanako@other-host.com.*/)
{
# 以下のように変更します。
# cc "| mailbot -t $HOME/autores.eng /usr/sbin/sendmail -t"
# cc "| mailbot -t $HOME/autores.jpn -c 'ISO-2022-JP' /bin/cat|reformime -r7|/usr/sbin/sendmail -t "
cc "| mailbot -t $HOME/autores.jpn -s '=?ISO-2022-JP?B?GyRCJDMkbCRPRnxLXDhsJT8lJCVIJWskRyQ5GyhC?=' -c 'ISO-2022-JP' /bin/cat|reformime -r7|/usr/sbin/sendmail -t "
}
|
これで、返信メールのSubjectは、常に ‘
これは日本語タイトルです‘ となります。
何も指定しない場合のSubjectは、先頭に オリジナルメールのSubujectに
Re: が付加されたものを使用します。
mailbot を使っての自動返信を連続で返信しないようにしてみます。
ここまでに mailbot で自動返信できるのは理解できたかと思います。
自動返信は便利な反面、毎回毎回、まさに自動で返信してしまいます。
例えば、もし、ちょっとした訂正のメールが2度、3度と送信されて来たら、その都度、自動返信してしまいす。
これは便利なようで、自動返信を受け取った側は、ちょっと機械的すぎて嫌な感じを受けてしまうかもしれません。
また、これは、メールを大量に送付してしまうというリスクもありますし、サーバーへの負荷もかかってしまいます。
そこで、mailbot には、同じメールアドレスの人には、自動返信を一定期間(デフォルトでは1日)再送信しないような設定があります。
この設定をやってみます。
/home/hoge/.mailfilter は、以下のように変更します。
if (/^From:.*hanako@other-host.com.*/)
{
# 以下のように変更します。
# cc "| mailbot -t $HOME/autores.eng /usr/sbin/sendmail -t"
cc "| mailbot -t $HOME/autores.jpn -d $HOME/autores.db -D 3 -c 'ISO-2022-JP' /bin/cat|reformime -r7|/usr/sbin/sendmail -t "
}
|
- -d オプションで自動返信制御用データファイル名を autores.db を追加しました。
- -D オプションで3日間 複数の自動返信を 3日間抑止します。
設定を終えたら、hogeさん宛にメールを送信してみてください。
1回目は、自動返信が着ますが、2回目以降は、(3日間は)自動返信されないようになります。
どうでしたか?うまく自動返信までできましたか?
さくらインターネットの共有サーバーである
さくらのレンタルサーバ でここまでできるのかは不明ですが、
通常、maildropをインストールしているサーバーならできます。
なのでできるんじゃないかなと思います。
先の記事で書いたように
maildropの通常のインストールで、上記の環境は整います。
もちろん、
さくらのVPSや、
お名前.com VPS(KVM) で自分でインストールされていればなおさらでしょう。
自動返信は、とりあえず、返信しておきたい顧客への一次対応としては、面白いかもしれませんね。まずは、お試しあれ、というところです。
コメントを投稿 :