メールサーバーからパイプライン処理でQdmailを起動させて、メール内容をSTDIN経由で受け取るようにしています。
MTAは.qmailを使用しています。 | /usr/bin/php {起動プログラム}
起動プラグラムでqdmail_receiverを呼び出して処理をしています。
■本文を取得する部分は下記のように記述しています。
$receiver = QdmailReceiver::start( 'stdin' ); $receive_mail_body = $receiver->bodyAutoSelect();
■bodyAutoSelectメソッドの中身は元の状態から変更はなく、下記のとおりになっています。
function bodyAutoSelect(){ $ret = $this->body(array('html','value')); if( !empty( $ret ) ){ $this->is_html = true; return $ret; } $ret = $this->body(array('text','value')); if( !empty( $ret ) ){ $this->is_html = false; return $ret; } return false; }
ここから本題なのですが、iPhoneGmailアプリととAndroidのGmailアプリで画像を添付してメールを送信した場合の挙動が異なってしまっており悩んでいます。
事象としては、Androidの方だけが添付画像の情報がDBに格納されません。
順次デバックを行い、上記bodyAutoSelectメソッド内の変数$retを比較したところ、
■iPhoneの場合
string(113) "<div dir="auto">本文テスト<div><img src="cid:16a1f38a9595be0ca571" style="max-width: 100%;"></div></div>
■Androidの場合
string(39) "<div dir="auto">本文テスト</div>
となり、Androidの場合はimgタグが入っていませんでした。
次に、bodyAutoSelectで呼び出されているbodyメソッド
function body( $param = null ){ if( !$this->already_text ){ $this->decodeBody(); } if( !is_array( $param ) ){ $param = array( $param ); } $ret = $this->option(null,array( 'body' ,__LINE__) , false , array('body') ); $ret = $this->arrayDigup( $ret , $param ) ; return $ret;
ここで、同じく変数$retを比較してみても、やはりAndroidの場合だけimgタグが入っていませんでした。
なので、
$this->decodeBody()
以前になにか原因があると思われるのですが、ここからどのように検証すれば良いのかが分かりません。
例えばdecodeBodyメソッドは下記のようになっているのですが、
function decodeBody(){ if( !$this->already_header ){ $this->decodeHeader(); } // body if( ( !$this->already_text && $this->text_decode ) || ( !$this->already_attach && $this->attach_decode ) ){ if( isset( $this->header['content-type'] ) ){ $type = $this->typeJudge( $this->header['content-type'] ); // preg_match( '/boundary\s*=\s*"([^"]+)"/is' , $this->header['content-type'] , $matches ); // preg_match( '/boundary\s*=\s*([^"]+)/is' , $this->header['content-type'] , $matches ); preg_match( '/boundary\s*=\s*"?([^"]+)"?/is' , $this->header['content-type'] , $matches ); if( isset( $matches[1] ) ){ $this->line = preg_split( '/\r?\n/is' , $this->body_all ); $this->num = 0; $this->max = count( $this->line ); $this->buildPart( $matches[1] , $type ); }else{ $this->body[$type] = $this->makeBody( $this->header , $this->body_all ); $this->already_text = true; } }else{ $type ='unknown'; $_hd = array( 'content-type' => $type . '/' . $type ); $this->body[$type] = $this->makeBody( array_merge( $this->header , $_hd ) , $this->body_all ); } } }
真ん中より少し下の
$this->buildPart( $matches[1] , $type )
を比較しても、いずれもbool(false)が出力されます。
どの部分を比較していけばいいのか教えていただきたいです。
もっと言うと、iOSとAndroidでなぜ差異が出るのか教えて欲しいのですが、なるべくヒントを元に自分で見つけ出したいと思っています。
何か不足情報などあれば教えてください。
よろしくお願いします。
あなたの回答
tips
プレビュー