- 2010/04/23 18:39
- programming
携帯メールの最大の欠点として,
差出人(送信元)アドレスを自由に設定できない
という欠点がある。
アプリやWebメールを使う手もあるが,
パケット代・手間を考えると気が進まない。
やはり手間を考えると,標準の携帯メーラーから
送信元アドレスを自由に設定して送れないものか。
メール使いホーダイに入っていれば,定額で実現できるし。
色々考えた末
GmailとPHPとcronを使えば,実現できるのでは?
ということで,PEAR::Mail, PEAR::Net_POP3を使いやってみた。
結果は,可能だし,実用的。
欠点は,予め送信したいアドレスにid numberを割り振り,
配列やDBに登録しておく必要があること。
(未登録のアドレスには送信できない)
アルゴリズムは次の通り。
- 1. 携帯から「To: xxx+###@gmail.com」へ送信する。
-
「xxx+###@gmail.com」というアドレスに送信しても,
“+”以降はGmailでは無視され「xxx@gmail.com」に届く。
例として,xxx+000@gmail.comに送ったと仮定する。
- 2. Gmail「xxx@gmail.com」にメールが届く
- 3.PHPでメールを転送する
-
GmailからPOP3でメールを取得しSMTPで送信(転送)
SMTPで送信する際,ヘッダーを設定するのだが
Return-PathとFromに任意のアドレスを設定できる。
「xxx+000@gmail.com」の000をidとして
予め対応するアドレスを配列なりDBに登録しておくことで
(例: 000->xxx@yyy.com)
###の部分を変えれば,任意の相手に送信することができる。要するに
xxx+000@gmail.com: xxx@yyy.comへ転送
xxx+001@gmail.com: aaa@bbb.comへ転送
xxx+002@gmail.com: ccc@ddd.comへ転送
xxx+000.001@gmail.com: xxx@yyy.com, aaa@bbb.comへ転送(複数)
このPHPをcronで定期実行することで,
定期的にGmailをチェック,転送させる。
gmailで送受信するためのクラス(gmail)を作成し
それを用いて送受信するようにした。
- 例)メールの送信
-
<?phprequire_once 'gmail.php';$gm=new gmail();$gm->set_account_info('xxx@gmail.com','password'); $header=array('From'=>'aaa@bbb.com','To'=>'yyy@gmail.com','Subject'=>'Test');$body='メール本文'; $gm->send(array('to'=>'yyy@gmail.com','header'=>$header,'body'=>$body));?>
cron.sh
#!/bin/sh<br />#PHP<br />/usr/local/bin/php /***/***/main.php<br />exit
main.php
<br /><?php<br />require 'gmail.php';<br />$gm=new gmail();<br />$gm->set_account_info(<br /> 'xxx@gmail.com','password'<br />);<br />$p=0;<br />while(TRUE):<br /> $msg=$gm->getMessage($p);<br /> if($msg===FALSE){break;}<br /> $arry=explode('+',$msg['header']['To']);<br /> $arry=explode('@',$arry[1]);<br /> $arry=explode('.',$arry[0]);<br /> $tol=array();<br /> foreach($arry as $eac):<br /> $tol[]=$ir->get_addr_by_sn($eac);<br /> endforeach;<br /> $header=array(<br /> 'To'=>implode(', ',$tol),<br /> 'From'=>'xxx@yyy.com',//差出人を設定<br /> 'Subject'=>$msg['header']['Subject'],<br /> 'Return-Path'=>'xxx@yyy.com',//差出人を設定<br /> 'MIME-Version'=>$msg['header']['MIME-Version'],<br /> 'Content-Type'=>$msg['header']['Content-Type'],<br /> 'Content-Transfer-Encoding'=>$msg['header']['Content-Transfer-Encoding'],<br /> 'Date'=>$msg['header']['Date'],//携帯からの送信日時と同じにする場合設定<br /> 'X-Priority'=>3<br /> );<br /> if(count($tol)>0):<br /> $gm->send(array(<br /> 'to'=>$tol,<br /> 'header'=>$header,<br /> 'body'=>$msg['body'],<br /> 'body_encode'=>FALSE<br /> ));<br /> endif;<br /> $p++;<br /> if($p>3){break;}//1回に処理するのは3通までに設定<br />endwhile;<br />?>
gmail.php
<?php<br />require_once 'Mail.php';<br />require_once 'Mail/mime.php';<br />require_once 'Net/POP3.php';<br />mb_language('ja');<br />mb_internal_encoding('iso-2022-jp');<br />class gmail{<br /> function __construct(){<br /> $this->par=array(<br /> 'pop3'=>array(<br /> 'host'=>'ssl://pop.gmail.com',<br /> 'port'=>'995',<br /> ),'smtp'=>array(<br /> 'host'=>'smtp.gmail.com',<br /> 'port'=>587,<br /> 'auth'=>true,<br /> 'debug'=>true<br /> ));<br /> }<br /><br /> function set_account_info($usr,$pwd,$smtpusr='',$smtppwd=''){<br /> $this->par['username']=$usr;<br /> $this->par['password']=$pwd;<br /> if($smtpusr==''){$smtpusr=$usr;}<br /> if($smtppwd==''){$smtppwd=$pwd;}<br /> $this->par['smtp']['username']=$smtpusr;<br /> $this->par['smtp']['password']=$smtppwd;<br /> }<br /><br /> function send($arg){<br /> if($arg['body_encode']!==FALSE):<br /> $arg['body']=mb_convert_encoding($arg['body'],'ISO-2022-JP','auto');<br /> endif;<br /> $mo=Mail::factory('smtp',$this->par['smtp']);<br /> $ret=$mo->send($arg['to'],$arg['header'],$arg['body']);<br /> if(PEAR::isError($ret)):<br /> die('Error: '.$ret->getMessage());<br /> endif;<br /> }<br /><br /> function getMessage($pointer,$del=TRUE){<br /> if(!$this->connect_pop3()){die('connect error');}<br /> $res=array();<br /> $list=$this->pop3->getListing();<br /> if(count($list)<$pointer+1):<br /> return FALSE;<br /> else:<br /> $res['header']=$this->pop3->getParsedHeaders($list[$pointer]['msg_id']);<br /> $res['body']=$this->pop3->getBody($list[$pointer]['msg_id']);<br /> if($del){$this->pop3->deleteMsg($list[$pointer]['msg_id']);}<br /> return $res;<br /> endif;<br /> }<br /><br /> function connect_pop3(){<br /> if(is_null($this->pop3)):<br /> $this->pop3=&new Net_POP3();<br /> if($this->pop3->connect($this->par['pop3']['host'],$this->par['pop3']['port'])):<br /> if($this->pop3->login($this->par['username'],$this->par['password'])):<br /> else:<br /> return FALSE;<br /> endif;<br /> else:<br /> return FALSE;<br /> endif;<br /> endif;<br /> return TRUE;<br /> }<br /> function __destruct(){<br /> if(!is_null($this->pop3)):<br /> $this->pop3->disconnect();<br /> endif;<br /> }<br />}<br />?>
- 新しい: 院外実習 (1)
- 古い: NTTドコモ(SH-01B)に変えました (4)
コメント:0
トラックバック:0
- この記事のトラックバック URL
- http://www.sasapy.com/mtcontents/entry/100423_gmail.php/trackback
- トラックバックの送信元リスト
- 携帯のメールで,擬似的に差出人を任意アドレスに設定し,送信する - sasapy.com より







