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を起動するように設定します。

i.softbankの迷惑メール対策(上級者向け)にコメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です