仕様
- 空メールの受信をキッカケにして、PHPプログラムを起動させる。
- サーバは、さくらインターネットのスタンダード・プラン(PHP5.2.13 CGIモード)を使用。さくらインターネットの場合は、.forward の代わりに、.mailfilter というファイルに記述する。
- ここでは、空メール用のメールアドレスを、hoge@example.com として話をすすめる。
- usersテーブルのstatusフィールドの値が、「1」の場合「仮登録済み」、「2」の場合「本登録済み」とする。
■ home/アカウント名/MailBox/メールアカウント名/.mailfilter
- 「.mailfilter」というファイルを作成し、以下の内容を記述。
cc "| /usr/local/bin/php -q /home/アカウント名/emptymail/emptymail.php"
メールボックスに受信したメールを残さない場合は、上記のかわりに
to "| /usr/local/bin/php -q /home/アカウント名/emptymail/emptymail.php"
と記述する。
- エンコーディングはUTF-8。
- 「home/アカウント名/MailBox/hoge」ディレクトリ内にアップロード。
ファイルのパーミッションは 600 にすること。
■ home/アカウント名/www/libs/qdmail.php(日本語メール送信ライブラリ)
- Qdmailをダウンロードし、ドキュメントルートに作成したlibsディレクトリ内に配置。
■ home/アカウント名/www/libs/qdmail_receiver.php(受信メール解析ライブラリ)
- QdmailReceiverをダウンロードして、libsディレクトリ内に配置。
■ home/アカウント名/emptymail/emptymail.php(空メールを解析し、仮登録を実行。登録解除は省略。)
- ドキュメントルート外にemptymailディレクトリを作成。
- emptymailディレクトリ内にemptymail.phpを配置。(エンコーディングはUTF-8)
<?php
/**
* 空メール会員登録
*/
// 設定ファイル等の読み込み
include('../../www/config/init.php');
include('../../www/config/db.php');
include('../../www/libs/qdmail_receiver.php');
// 初期化
$em_body = ''; // 空メール本文
$em_email = ''; // 空メールのメールアドレス
$em_domain = ''; // 空メールのメールアドレスの「@以降」の部分
$em_alias = ''; // 空メールのメールアドレスの「@より前」の部分
// メールを解析
qd_receive_mail('stdin');
// メールアドレスを取得
$em_email = qd_receive_mail('header', array('from','mail'));
// メールアドレスを検証
preg_match('/^[a-zA-Z0-9](?:[a-zA-Z0-9]|_|-|\.)+@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[a-z]{2,4})$/',$em_email) or die();
// @マーク以下を取得し、携帯メールアドレスか確認
list($em_alias, $em_domain) = explode('@', $em_email, 2);
$em_domain = '@' . $em_domain;
in_array($em_domain, $mobile_emails) or die();
//メール本文を取得
$em_body = qd_receive_mail('body');
if (preg_match('/\[\[regist\]\]/i', $em_body)) {
$action = 'regist'; // 会員登録
} elseif (preg_match('/\[\[remove\]\]/i', $em_body)) {
$action = 'remove'; // 登録解除
}
//メールアドレスが本登録済みか確認
$q_email = mysql_real_escape_string($em_email);
$query1 = "SELECT id,email,status FROM ".DB_TABLE." WHERE email = '{$q_email}' AND status = 2;";
$res1 = mysql_query($query1, $db);
// 未登録の場合
if (mysql_num_rows($res1) == 0) {
// 仮登録済みか確認用のクエリ
$query2 = "SELECT id,email,status FROM ".DB_TABLE." WHERE email = '{$q_email}' AND status = 1;";
$res2 = mysql_query($query2, $db);
// ランダムなIDを作成
$q_activation = mysql_real_escape_string(md5(uniqid() . mt_rand()));
// 現在時刻を取得
$q_now = mysql_real_escape_string(date('Y-m-d H:i:s', time()));
// 新規追加用のクエリ
$query3 = "INSERT INTO ".DB_TABLE." SET email='{$q_email}', activation='{$q_activation}', created='{$q_now}', modified='{$q_now}', status = 1;";
// 仮登録されていない場合、新規追�
if (mysql_num_rows($res2) == 0) {
mysql_query($query3, $db);
}
// 仮登録済みの場合は、前のレコードを削除して、新たに挿入
else {
mysql_query("DELETE FROM ".DB_TABLE." WHERE email = '{$email}' AND status = 1;");
mysql_query($query3, $db);
}
$subject = SITE_NAME . ' - 仮登録';
$body = $em_email . " 様\n\n";
$body .= SITE_NAME . "運営事務局です。\n\n";
$body .= "仮登録を受け付けました。\n";
$body .= "引き続き、下記のURLより、登録を完了させてください。\n\n";
$body .= SITE_URL . "/m/regist/complete.php?activation={$activation}";
}
//既存の会員の場合
else {
$subject = SITE_NAME.' - 登録状況';
$body = 'すでに登録済みです。';
}
//Qdmailを読み込む
include('../www/libs/qdmail.php');
$qdmail = & new Qdmail();
$qdmail->to($em_email, '');
$qdmail->subject($subject);
$qdmail->from(REGIST_EMAIL, '');
$qdmail->text($body);
$qdmail->send();
■ home/アカウント名/www/config/init.php(各種設定)
<?php
mb_language('ja');
mb_internal_encoding('UTF-8');
define('ADMIN_EMAIL', 'info@example.com');
define('REGIST_EMAIL', 'regist@example.com');
define('SITE_NAME', 'サイト名');
define('SITE_URL', 'http://www.example.com/');
// PHPのバージョンを取得
if(!defined('PHP_VERSION_ID')) {
$version = explode('.',PHP_VERSION);
define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}
$mobile_emails = array(
1 => '@docomo.ne.jp',//Docomo
2 => '@ezweb.ne.jp',//EZWEB
3 => '@softbank.ne.jp',//SoftBank
4 => '@disney.ne.jp',
5 => '@d.vodafone.ne.jp',
6 => '@h.vodafone.ne.jp',
7 => '@t.vodafone.ne.jp',
8 => '@c.vodafone.ne.jp',
9 => '@k.vodafone.ne.jp',
10 => '@r.vodafone.ne.jp',
11 => '@s.vodafone.ne.jp',
12 => '@n.vodafone.ne.jp',
13 => '@q.vodafone.ne.jp',
14 => '@jp-d.ne.jp',
15 => '@jp-h.ne.jp',
16 => '@jp-t.ne.jp',
17 => '@jp-c.ne.jp',
18 => '@jp-k.ne.jp',
19 => '@jp-r.ne.jp',
20 => '@jp-s.ne.jp',
21 => '@jp-n.ne.jp',
22 => '@jp-q.ne.jp',
23 => '@pdx.ne.jp',
24 => '@emnet.ne.jp',//EMOBILE
25 => '@willcom.com',//WILLCOM
);
■ home/アカウント名/www/config/db.php(データベース設定)
<?php
//データベース
define('DB_HOST', 'データベースのホスト名');
define('DB_USER', 'ユーザー名');
define('DB_PASS', 'パスワード');
define('DB_NAME', 'データベース名');
define('DB_TABLE', 'テーブル名');
// 文字化け対策(クエリの文字コードを設定)
//PHP5.2.3未満
if (PHP_VERSION_ID < 50203) {
mysql_query("SET NAMES utf8");
//PHP5.2.3以上
} else {
mysql_set_charset('utf8');
}
// データベース接続
$db = mysql_connect(DB_HOST, DB_USER, DB_PASS);
// データベースを選択
mysql_select_db(DB_NAME,$db) or die();
■ home/アカウント名/www/m/regist/index.php(登録画面・モバイル版)
空メール会員登録 ※携帯メールでドメイン指定受信されている方は、「example.com」の許可設定をお願いいたします。 <a href="mailto:hoge@example.com?subject=&body=[[regist]]">メルマガ登録する</a><br /> <a href="mailto:hoge@example.com?subject=&body=[[remove]]">メルマガ解除する</a>
■ home/アカウント名/www/regist/complete.php(本登録完了画面・PC版)
- home/アカウント名/www/m/regist/complete.php(本登録完了画面・モバイル版)も同様。
(モバイル版は、mディレクトリ内にあるため、読み込みファイルのパスがかわるので、注意。)
<?php
//初期設定ファイルとデータベース設定ファイルを読み込む
include('../../config/init.php');
include('../../config/db.php');
//初期化
$message = '';
//アクティベーション・コードを取得
$q_activation = mysql_real_escape_string($_GET['activation']);
//アクティベーション・コードが一致し、かつ、仮登録済みのレコードがあるか確認
$query1 = "SELECT email FROM ".DB_TABLE." WHERE activation = '{$q_activation}' AND status = 1;";
$res1 = mysql_query($query1, $db);
//該当するレコードがある場合
if (mysql1_num_rows($res1) == 1) {
//メールアドレスを取得 $data['email']
$data = mysql_fetch_array($res1, MYSQL_ASSOC);
//本登録
$q_now = mysql_real_escape_string(date('Y-m-d H:i:s', time()));
$query2 = "UPDATE ".DB_TABLE." SET status = 2, modified = '{$q_now}' WHERE activation = '{$q_activation}';";
mysql_query($query2);
//メール本文
$body = "メルマガ会員にご登録いただき、誠にありがとうございました。\n\n";
$body .= "後日、当店のお得な情報が、お手元に届きます。楽しみにお待ち下さい。";
//メール送信
include('../../libs/qdmail.php');
$qdmail = & new Qdmail();
$qdmail->to($data['email'], '');
$qdmail->bcc(ADMIN_EMAIL, '');//管理者宛に通知メールを送信
$qdmail->subject(SITE_NAME.' - 登録完了');
$qdmail->text($body);
$qdmail->from(ADMIN_EMAIL, '');
$qdmail->send();
$message = '会員登録が完了しました。';
} else {
$message = '会員登録は完了しませんでした。';
}
echo $message;
?>
参考サイト
大変お世話になりました。ありがとうございます。
こちらもあわせてどうぞ