前回に引き続きマニアックな内容ですので、同じ事をしようとしている人以外はまず面白くないのでさっさと読み飛ばすことをお勧めします。更に、自分が管理している常時稼働のサーバーがあってそこでphpとcronが使えるという特殊な環境の人以外には役に立たない情報です。
たろ父は日本でGmailが招待なしでも使えるようになった当初からGmailをメインで使っています。アドレスは@gmail.comのアドレスではなくこのブログが置いてある自分のドメインのものを常用していますが、メールチェックも送信も専らGmailからで、自宅PCのメーラーはバックアップ用に成り下がっています。
さて、今回はiPhoneのメールをGmailで扱う方法の紹介です。実は、送信アドレス(From:フィールド)を@gmail.com以外に設定するのは簡単で、@i.softbank.jpのメールも例外ではありません。ここでは一歩進んで、@i.softbank.jpで受信したメールを自動的にGmailに転送して送受信メールを全部Gmailで管理してしまおうというわけです。以下に紹介する方法を使うには、phpが動くサーバーが使え、更にunix系のcronやWindows系のタスクスケジューラー等で定期的にスクリプトを走らせることができる必要があります。これだけハードルを上げておいて出来ることは大したことありませんが、自分のための備忘録みたいなものなんで気にしないことにします。
Gmailは他のメールサーバーのメールをPOPで読みに行く機能がありますが、現在のところIMAPには対応していません。一方ソフトバンクの@i.softbank.jpのメールサーバーはIMAPのみで、POPでのアクセスをサポートしていません。将来的にGmailがIMAPでのメール取得をサポートしてくれれば以下の方法は無用の長物になり、その可能性は十分にあると思います。
大雑把に説明すると、IMAPでソフトバンク、Gmailのサーバーにアクセスしてそれぞれのメールボックスを開き、ソフトバンクの方のメール一覧を取得して前回実行時以降に受信したメールを抽出し、それらをそのままGmailのメールボックスにコピーするというスクリプトをphpで記述します。これをcron等を使って定期的に動かすというわけです。以下に、30分(1800秒)おきに実行する場合のコードを示します。
<?php
$SRC = array(
'user' => 'your_user_ID',
'pass' => 'your_password',
'host' => 'imap.softbank.jp'
);
$DST = array(
'user' => 'your_mail_address',
'pass' => 'your_password',
'host' => 'imap.gmail.com'
);
$src = @imap_open("{" . $SRC['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $SRC['user']
, $SRC['pass']) or exit("can't connect: " . imap_last_error());
$dst = @imap_open("{" . $DST['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $DST['user']
, $DST['pass']) or exit("can't connect: " . imap_last_error());
$srcs = imap_check($src);
$overview_list = imap_fetch_overview($src, "1:{$srcs->Nmsgs}", 0);
$count = 0;
$last = time() - 1800;
foreach ($overview_list as $overview) {
// skip mails older than 1800 seconds
$time = strtotime($overview->date);
if ($time < $last) { continue; }
$count++;
$head = imap_fetchheader($src, $overview->msgno);
$body = imap_body($src, $overview->msgno);
imap_append($dst, "{" . $DST['host'] . ":993/imap/ssl}INBOX", $head.$body);
}
imap_close($src);
imap_close($dst);
header("Content-Type: text/html; charset=shift_jis");
echo($count . ' messages copied');
exit();
?>
これを適当な名前(拡張子.php)で保存し、Webサーバーにアップロードします。ブラウザからそのファイルにアクセスすれば、出力結果が返されます。「0 messages copied」とか出てきたら成功しているっぽいです。エラーが出やすいのは@imap_openあたりで、認証エラーだとメールサーバーが返したエラーを「can’t connect:」に続けて出力するようにしています。メールサービスのオプションは将来変更されることもあるので、エラーが出たらその都度オプションを調整する必要があります。
うまく動くようになったら、後はcronで一定時間(この例だと30分)毎にスクリプトを動かすよう設定すれば完成です。ソフトバンクの契約でiPhoneを使っていて、Gmailをメインに使っていて、phpとcronが動くサーバーを管理している人(ってどんだけいるんだ?)は活用してみて下さい。
初めまして。
iPhoneを使っていて、Gmailをメインに使っていて、phpとcronが動くサーバーを管理している人です。ただiphoneがシムフリーでbmobileを使っています。MMSが無くなり不便なんでipadの契約で貰えるSiメールアドレスを使えればと検索していたところ貴ページにたどり着きました。早速設定し大満足で使わせて頂いております。一つ教えて頂きたいのですが、Gmailがコピーした時にSiメールを既読にさせない方法は有りますか。有ればお助け下さい。
宜敷くお願い致します。
コメントありがとうございます。phpやimapの仕組みをちゃんと理解しているわけではないので残念ながらお役には立てないかもしれません。
Softbank側のimapサーバーに対する操作としては、まずimap_openで開いておいてimap_check、imap_fetch_overviewでリストを取得、それぞれのメールについてimap_fetchheader、imap_bodyでヘッダと本文を取得するという流れになります。このforeachループの中のimap_bodyの次の行あたりに($src, $overview->msgno)を引数にして未読フラグを立てる処理を書いてやればよいのだと思いますが、具体的には調べていません。
imapのコマンドを調べて、他の処理の書式をまねて書いてみて、うまくいくまでパターンを変えてテストしてみたらそのうち見つかるでしょう。私個人は今のところ現在の仕様で困っていないので頑張って調べる気力がありませんが、もしうまくいったら是非他の人のためにどこかに公開するか、こちらにコメントして頂けるとうれしく思います。
頑張ってみます。
知識は0ですのでいつできるやらですが、完成したらこちらへ投稿させて頂きます。
有り難うございます。
はじめまして。少し前の記事にコメント失礼します。
私もi.softbankをgmailに転送する方法は無いものかといろいろ検索しましたが、結局やはりCron+PHPが自分の環境ではなんとかできそうです。(とはいえPHPの知識はありません…)
上記のコードをDreamWeaverでPHPファイルを作成し、WebにUPしcronで実行しましたがどうもうまく転送されません。ブラウザで直接アクセスしてもなにも反応がありません。
原因は何が考えられますでしょうか・・・。サーバーはレンタルサーバーのロリポップ!を使用しています。よろしくお願いします。
実は、私の環境でもしばらく前にPHPの設定が変わったらしく、動かなくなっています。iPhoneのアプリ(iメール転送)で同じことができるようになったこともあってそのまま放置しています。とは言え、me.comのメールを転送したりするのにも使えるはずなのでいずれは何とかしたいと思っていますが。
サーバーの環境に依存するとは思いますが、ログを確認するなどしてエラーメッセージを探し、何でコケているかを特定することから手を付けることになると思います。PHPの呼び出しなのかスクリプトの中身なのか、あるいはcronが動いていないのか、それぞれで対処は異なってくると思います。スクリプトを置く場所やパーミッションも関係するかもしれません。コマンドを実行できて出力を見ることのできる環境(私の場合ですとwebから)があれば、アップロードしたスクリプトファイルに実行権限を付けて直接実行してみる、phpコマンドに引数として渡してみるなどして、標準エラー出力に出力されるエラーを見てみることからですかね。
お力になれるかどうか分かりませんが、エラーの内容が分かれば、何らかのアドバイスができるかもしれません。