空メールを実装する

PHP×携帯サイトデベロッパーズバイブルを読んで、空メール送信をテストしてみたが、結構悩んだ部分が多かったのでメモ。

尚、テストはカゴヤサーバにて行なった。
稼働率99.999% レンタルサーバー顧客満足度No1

■空メールを受け取るメールアドレスを準備する。

1. 新しいメールアカウントを作成
 例)アカウント名.regist

2. アカウント名@収容サーバー名 に自動転送するように設定。転送後はメールサーバにメールを残さないように設定する。メールを残す設定にしてしまうと、メールBOXがいっぱいになった時に転送自体が停止されてしまい、送信者にエラーが届くことになる。

※収容サーバー名はコントロールパネルから、システム > Webサイトを開き、基本情報に記載されている。
アカウント名はコントロールパネルにログインする時のアカウント名そのもの。

3. アカウント名.regist@kagoya.netへメールを送信して、まずはきちんとメールが届いているかテストする。

■.forwardファイルを作成する。
1. 「.forward」と名前をつけたファイルを作成する。
2. 「”|IFS=’ ‘ && exec /usr/bin/procmail -f- || exit 75″」と記述して保存。
これで届いたメールを.procmailrcファイルへ渡せるようになる。
3. ルートディレクトリ直下(public_htmlフォルダと同階層)にPUTする。

■.procmailrcファイルを作成する。
1. 「.procmailrc」と名前をつけたファイルを作成する。
2. 下記を記述して保存。

SHELL=/usr/bin/sh
PATH=/usr/bin:/usr/local/bin:$home/bin
MAILDIR=$home/Maildir/
VERBOSE=YES
LOGFILE=$MAILDIR/procmail`date +%Y-%m`.log
:0
* ^To:.*アカウント名.regist@kagoya.net
| /home/アカウント名/public_html/mailtest/empty_mail.php

3. ルートディレクトリ直下(public_htmlフォルダと同階層)にPUTする。

[注意] .forwordや.procmailrcなどのサーバーに置く設定ファイルは改行コードにLFを使う。CRLFを使うと動作しない場合がある。
HIDEMARUのように改行コードを指定して保存できるようなテキストエディタで作成するのがよい。

これでempty_mail.phpにメールを渡す準備が完了。

■PEARライブラリのインストール
必要なのは下記2点。
1. PEAR::Mailライブラリ
2. PEAR::Mail_mimeライブラリ
※PEARライブラリのインストールは省略。もちろんサーバにインストール済みであればそれを利用すればよし。

■empty_mail.phpの作成
1. 下記を記述して保存。
PHP×携帯サイトデベロッパーズバイブルに記載されているempty_mail.phpを保存して/home/アカウント名/public_html/mail/へアップロード。

[注意]
1. 「#!/usr/local/bin/php」を先頭に記述して保存しないと動作しなかった。サーバによっては「#!/usr/bin/php」となる場合もあり。
2. PEARライブラリをインクルードする際は、フルパスで記述しないと動作しなかった。これは自身で.htaccessによるPEARインクルードパスを設定していたからだと思う。
3. 抽出したメールアドレスに「”」(ダブルクォーテーション)が混入していることがあったので、ダブルクォーテーションを取り除くソースを追加する必要がある。

■空メールの動作チェック
上記を全て行なったら動作確認してみます。流れとしては、
1. 「アカウント名.regist@kagoya.net」へ空メールを送信
2. メールサーバからWEBサーバへ自動転送
3. WEBサーバのルートディレクトリに設置した.forwardへメールが渡される。
4. .forwardから.procmailrcへメールが渡され、「アカウント名.regist@kagoya.net」を経由したメールならempty_mail.phpへ渡される。
5. empty_mail.phpでメールヘッダー情報を解析して、メールの送り主に返信される。

■正しく動作しない時にチェックするポイントは、

1. メールはきちんと届いているか?
  ⇒一度自動転送設定をOFFにして、実際にメールBOXを確認してみる。

2. WEBサーバに正しく自動転送されているか?収容サーバー名を間違えてないか?
  ⇒コントロールパネル>メールの自動転送設定を確認

3. .forwardファイルからprocmailrcへ渡されているか?
  ⇒procmailrcまでメールが渡されていれば、ルートディレクトリに(procmail2009-03.log)のようなログファイルが生成されます。
  このファイルがなければ.forwardか.procmailrcを見直してみる。
  ⇒改行コードをCRLFで保存したりしていないか?文字コードはShift_JISでもOKだったがEUC-JPなどのほうがよいかも。

4. empty_mail.phpに渡されているか?
  ⇒procmailrcのログファイルが生成されていれば、ログの内容を確認してみます。エラー内容で大体の見当はつく。
  「procmail: Match on “^To:.*アカウント名.regist@kagoya.net”」と記述があれば、メールが正しく振り分けられている。
  「procmail: Executing “/home/アカウント名/public_html/mail/empty_mail.php”」と書いてあれば、empty_mail.phpへきちんとパイプされているということ。
  逆にこの記述がない場合は、procmailrcファイルに記述したパスが間違えている可能性が高い。
  「/home/アカウント名/public_html/mail/empty_mail.php: line 1: ~」などの記述があった場合、empty_mail.phpでエラーが起こっている可能性が高い。

5. empty_mail.phpの記述は正しいか?
  ⇒PEARライブラリはインストールされているか?
  ⇒インクルードパスはきちんとフルパスで記述しているか?
  ⇒文頭に「#!/usr/local/bin/php」または「#!/usr/bin/php」は記述したか?

※※※※※※注意※※※※※※
空メールなどで自動的にメールを返信するようなスクリプトを扱う場合、空メールを受信してスクリプトへ渡すために作成したメールアドレスを、送信者アドレスに指定しないこと。
メールフィルタをかけている人が空メールを送信すると、エラーメールが返ってくることがあります。
つまり、空メール送信⇒自動返信⇒エラーメールが返ってくる⇒自動返信⇒エラーメールが返ってくる・・・
のようにループが発生して、サーバーに大きな負荷をかけてしまい大変な迷惑をかけることになります。
メールを自動返信する場合はループを起こさないように、送信者アドレスに気をつけるだけではなく、さらに防止策を考えるくらいの気持ちでプログラムを作ることが大事です。(経験者談)(汗

[参考サイト]
メルマガを配信して、何らかの理由によって送信エラーが戻ってきた場合の処理に役立つ情報がありました。
http://firegoby.theta.ne.jp/archives/18
実際こちらのソースを参考にして送信エラーが返ってくるメールアドレスを抽出することもできました。。

Leave a Response