レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

procmailの代わりにmaildropを使ってみる(メールの振り分けから自動応答(返信)まで)

2013年2月2日 2015年5月14日
maildrop

以下の記事では、maildropのインストールについて解説してみました。

今回は、実際にmaildropを色々と使ってみたいと思います。
maildropは、さくらインターネットの共有サーバーである さくらのレンタルサーバさくらのレンタルサーバ で使われていることは有名な話で、 その さくらのレンタルサーバ での利用方法については、よく記事を見かけますね。

今回は、そこも踏まえて、ちょっと基本的な maildrop の使い方を解説してみます。

maildropとは、
Courier Mail Serverによって使用されるMDA(Mail Delivery Agent) です。maildrop は、MDA(Mail Delivery Agent)の機能のほかに、フィルター機能を有しています。 maildropは、stdin(標準入力)からメールを受信し、Maildir、mboxのいずれの形式にも配信します。
maildropは、メンテナンスされていないprocmailのMDAに代わるものとして提案されています。
(Wikipedea 原文)
maildrop is a Mail delivery agent used by the Courier Mail Server. The maildrop MDA also includes filtering functionality. maildrop receives mail via stdin and delivers in both Maildir and mbox formats.
maildrop has been suggested as an alternative to the unmaintained procmail MDA.
MDAとは、
メール配送エージェント(Mail Delivery Agent、MDA)で、メールサーバの中で、 メール転送エージェント(MTA)によって振り分けられた電子メールを受信者に配送する機能のこと言います。

maildropを使ってみる

maildropは、maildrop独自のスクリプトファイルによって指示されたメールの振り分けを行います。
そのファイルは、以下のとおりで、maildropが読み込む順番の下記のとおりです。

  1. /etc/maildroprc

    → このファイルは、サーバーで受信したすべてのメールに対していmaidropの指示を指定します。

  2. ($HOME)/.mailfilter

    → このファイルは、ユーザのホームディレクトリに設置され、そのユーザ宛のメールに対してmaidropの指示を指定します。

以下にいろんなパターンで簡単に解説してみます。

cc は、メールをコピーするという意味です。

例えば、/home/hoge/.mailfilter の以下のように cc を記述したとします。

cc "! hanako"

これは、メールをコピーして、”!hanako” を実行しなさいという意味なので、コピーしたメールは、サーバーユーザーのhanakoさんへメール配信されます。
ここでの ! は、メール配信の命令を意味します。もちろん、! の後は外部メールアドレスでもOKです。

cc "! hanako@other-server.com"

上記の例では、コピーしたメールは、hanako@other-server.comへ配信されます。

また、以下のようにファイル名を指定することもできます。

cc "$HOME/mailarchive"
$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 を記述したとします。

to "! hanako"

これは、メールの宛先を、”!hanako” にしなさいという意味なので、メールは、サーバーユーザーのhanakoさんへメール配信されます。
ここでは、メールはコピーされたわけではありませんから、hogeさんへはメール配信されません。
cc 同様に外部メールアドレスやファイル名、プログラムなどを指定することができます。

to "! hanako@other-server.com"
to "$HOME/mailarchive"
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@.*/
上記の意味を簡単に解説すると、
行の先頭から 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を記述したとします。

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を記述したとします。

cc "!hanako"
exit

これは、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 "
}
  • 返信メッセージのファイル名を autores.eng → autores.jpn へ変更しました。
  • 文字コードに ‘ISO-2022-JP‘ を指定しました。
  • mailbotの実行プログラムを sendmail → cat へ変更しました。

    : これで一旦返信用のメールをダンプします。

  • パイプ |reformimeを実行します。

    : -r7 は、エンコード7bitをMIMEに指定するためのものです。

  • パイプ |sendmailを実行します。

    : 最後に変換されたメールをsendmailで送信します。


ちょっとややこしいですが、この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もオプションで指定できます。この場合も日本語を用いたい場合は、日本語化する必要があります。
この場合は、もうちょっと変換が面倒で、以下の手順をふみます。
  1. JIS (ISO-2022-JP) に変換します。
  2. 更に Base64 で変換します。
  3. 変換した文字コードの前後に ‘=?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さくらのVPSや、 お名前.com VPS(KVM)お名前.com VPS(KVM) で自分でインストールされていればなおさらでしょう。

自動返信は、とりあえず、返信しておきたい顧客への一次対応としては、面白いかもしれませんね。まずは、お試しあれ、というところです。

ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

procmailの代わりに(makeを使って)maildropをインストールする(make編)

procmailの代わりに(rpmを作成して)maildropをインストールする(RPM編) では、CentOS/Scientific Linu ...

maildropを使ってメール受信時に携帯へのお知らせメールを自動送信してみる

以下の記事では、maildropのインストールおよび簡単な使い方について解説してきました。 procmailの代わりに(rpmを作 ...

procmailの代わりに(rpmを作成して)maildropをインストールする(RPM編)

procmailでメールボックスのパーミッションが660になってしまう対処について調べてみた でも指摘したように、procmailには、メンテナ ...

CentOS(Scientific Linux)で postfix を使ってみる

Debian(Ubuntu)で postfix を使ってみる では、Debian/UbuntuへのPostfixの対応について書きました。 ...

procmailでメールボックスのパーミッションが660になってしまう対処について調べてみた

Dovecotでfchmodのエラーが出た時の対処 でエラーの本当の原因は、メールボックスのパーミッションにグループの権限が付与される(660) ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2407 [s]