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