i.softbankの迷惑メール対策(上級者向け)
		公開日:		
	
ソフトバンクのiPhone用に提供されているi.softbank.jpのメールに大量のスパムが届くようになりましたので、スパム排除の方法を考えて実践してみました。
ここでご紹介する内容は、ある程度プログラムも分かる上級者向けのものですので、申し訳有りませんが敢えて用語の説明はいたしません。
スパム排除の考え方
i.softbank.jpのメールはimapというプロトコルに対応していますので、サーバーにプログラムを置き定期的にimapでメールを取得します。
ここから、スパム判定を行い、iPhoneのプッシュとimapに対応した別のメールサービスに必要なメールだけを書き込むという処理を行います。
別のメールサービスには、今回はGmailを使用しました。
用意するもの
- サーバー
レンタルサーバーなどで構いませんが、phpが動作すること、php-imapモジュールが動作する(またはインストール可能な)こと、cronの設定ができることが必須条件となります。 - iPhoneのプッシュとimapに対応したメールアカウント
Gmailなどを新たに取得する事をお勧めします。 
サーバー側に設置するプログラム
phpプログラムと最終取得時刻を格納するデータファイル、cronで動かすためのシェルスクリプトファイルの3つを作成します。
まずは、phpプログラムからです。
ispamblock.php (パーミッション:755)
<?php
ini_set( 'date.timezone', 'Asia/Tokyo' );
$iphone['user'] = 'iphoneのメールアカウントの@前の部分';
$iphone['pass'] = 'パスワード';
$iphone['host'] = 'imap.softbank.jp';
$gmail['user']  = 'gmailのメールアカウントの@前の部分';
$gmail['pass']  = 'パスワード';
$gmail['host']  = 'imap.gmail.com';
// ドメイン指定受信:ここでは携帯ドメインのみを設定しています
$whitedomains = array(
	'docomo.ne.jp',
	'ezweb.ne.jp',
	'softbank.ne.jp',
	'i.softbank.jp'
);
// 最終実行時刻を記録するデータファイル名
$datafile = 'lastupdate.dat';
// データファイルから前回実行時刻を取得
$bufferarr = file($datafile);
$buffer    = $bufferarr[0];
// 
$iphone_resource = @imap_open("{" . $iphone['host'] . ":993/imap/ssl}INBOX", $iphone['user'], $iphone['pass']) or exit("i.softbank.ne.jpへの接続に失敗しました");
$gmail_resource = @imap_open("{" . $gmail['host'] . ":993/imap/ssl}INBOX", $gmail['user'], $gmail['pass']) or exit("gmailへの接続に失敗しました");
$imap_obj = imap_check($iphone_resource);
$overview = imap_fetch_overview($iphone_resource, "1:{$imap_obj->Nmsgs}", 0);
$count = 0;
$fp = fopen($datafile,'w+');
foreach ($overview as $ov) {
	$time = strtotime($ov->date);
	
	// 前回実行時より前のメールは以降の処理を行わない
	if ($time < $buffer) { continue; }
	
	$head = imap_fetchheader($iphone_resource, $ov->msgno);
	$headarr = imap_header($iphone_resource, $ov->msgno);
	$body = imap_body($iphone_resource, $ov->msgno);
	
	// スパム排除後にgmailにコピー
	$from = $headarr->from[0];
	$host = $from->host;
	
	// メールアドレス指定やアドレスの一部指定などはこのif文に入れる
	if(preg_match('/(mail@example.com|vodafone.ne.jp)/',$headarr->fromaddress) || in_array($host,$whitedomains)){
		$count++;
		imap_append($gmail_resource, "{" . $gmail['host'] . ":993/imap/ssl}INBOX", $head.$body);
	}
}
imap_close($iphone_resource);
imap_close($gmail_resource);
fputs($fp, time());
fclose($fp);
echo($count . '件処理しました');
exit();
?>
ドメイン指定部分ですが、fromの成りすましなど、もっと複雑なケースも考えられますのでニーズに合わせてコードを書き換えてください。
実際に個人的に使っているコードはもう少し手の込んだスパム排除ロジックを入れています。
続いて最終実行時刻を保存するためのデータファイルですが、名前をlastupdate.datとしてパーミッションは666で作成しておきます。
最後に、cronで実行するためのシェルスクリプトです。
ispamblock.sh (パーミッション:755)
#!/bin/sh php /phpファイルを置いた場所の絶対パス/ispamblock.php
これらのファイルはサーバーの任意の場所に置き、cronで指定時間ごとにispamblock.shを起動するように設定します。