概要
例えば、プロバイダメールや、スマホメールをGoogleメールに集めたい。でも、Gmailでは、POP3による外部メールの取り込み機能はあるけど、IMAPで取り込みが出来ない・・・
そんな時に以下のスクリプトをどこかに仕掛けておけばOKです!
私は使っていませんでしたが、昔imodeのメールを転送するサービス「imoten」というのがあったようですね。今回のツールはメールを転送するものではなくて(結果そうなっているように見えますが)クライアント動作として、source側からIMAPでとってきて、destination側にIMAPで差し込みをしちゃうだけのツールになります。
事前準備
imap接続に際して、以下の準備が必要です。
- Gmailの設定で、IMAPアクセスの項目で、IMAPを有効にするを選択
- googleアカウントの設定で、安全でないデバイスからの接続を許可
- 各種スマホメールをWifiなどのインターネット経由で閲覧可能にする
手順概要
- スクリプトファイルを設置する
- cronの設定をする
手順
スクリプトファイルを設置する
ココでは、設置するファイル名を mailrelaytool.php と、します。
また、phpは imap, sslをコンパイル時に利用できるようにしており、imap.soをphp.iniもしくは実行時のextensionの設定で利用できる状態である事とします。
以下のプログラムを /home/USERNAME/bin/mailrelaytool.php に設置したとします。
< ?php $imapSrc=array( 'user'=> 'test1' ,'pass' => 'test1' ,'host' => 'imap.spmode.ne.jp' ); $imapDst = array( 'user' => 'test2@gmail.com' ,'pass' => 'test2' ,'host' => 'imap.gmail.com' ); $now = time(); $last = $now - 1800; $imapSrc = imap_open("{" . $imapSrc['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $imapSrc['user'] , $imapSrc['pass']) or die (var_dump(imap_errors())); $imapDst = imap_open("{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $imapDst['user'] , $imapDst['pass'] , NULL, 1, array('DISABLE_AUTHENTICATOR' => 'PLAIN') ) or die (var_dump(imap_errors())); $imapSrcs = imap_check($imapSrc); $overview_list = imap_fetch_overview($imapSrc, "1:{$imapSrcs->Nmsgs}", 0); foreach ($overview_list as $overview) { $time = strtotime($overview->date); if ($time < $last) { continue; } $head=imap_fetchheader($imapSrc, $overview->msgno); $body = imap_body($imapSrc, $overview->msgno); imap_append($imapDst, "{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $head . $body); } imap_close($imapSrc); imap_close($imapDst); exit(); ?>
※ここでミソはgmailはPLAINに対応していない事です!
cronの設定をする
% export EDITOR=vi % crontab -e 0,30 * * * * /usr/bin/php -d extension=imap.so -f /home/USERNAME/bin/mailrelaytool.php 2>&1※cliのphp.iniにextension=imap.so の記述があれば、「-d extension=imap.so」の部分は不要です。
以上です!
その後、修正版。2重起動防止。いつ発動しても良いように、前回取得時間を記憶するようにした版
エラー処理とか手抜きなので、使う時には直してね!
< ?php $imapSrc = array( 'user' => 'test1' ,'pass' => 'test1' ,'host' => 'imap.spmode.ne.jp' ); $imapDst = array( 'user' => 'test2@gmail.com' ,'pass' => 'test2' ,'host' => 'imap.gmail.com' ); $count = 0; $wait = 10; $retry = 2; $lockfile = "./relaymail.lock"; $backNumber="./relaymail.bknm"; if(file_exists($lockfile) && (time() - filemtime($lockfile)) < 300){ exit(); } $lock = fopen($lockfile, "w"); $src = imap_open("{" . $imapSrc['host'] . ":993/imap/ssl/novalidate-cert}INBOX" , $imapSrc['user'] , $imapSrc['pass'] ); $dst = imap_open("{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX" , $imapDst['user'] , $imapDst['pass'] , NULL , 1 , array('DISABLE_AUTHENTICATOR' => 'PLAIN') ); if(imap_errors()) { fclose($lock); unlink($lockfile); exit(); } $srcs = imap_check($src); $overview_list = imap_fetch_overview($src, "1:{$srcs->Nmsgs}", 0); $last=file_get_contents($backNumber, true); if(!$last){ $last = time() - 60; } foreach ($overview_list as $overview) { $time = strtotime($overview->date); if ($time < $last) { continue; } $count++; $head = imap_fetchheader($src, $overview->msgno); $body = imap_body($src, $overview->msgno); imap_append($dst, "{" . $imapDst['host'] . ":993/imap/ssl/novalidate-cert}INBOX", $head . $body); } imap_close($src); imap_close($dst); file_put_contents($backNumber, time()); fclose($lock); unlink($lockfile); exit(); ?>