質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

0回答

326閲覧

QdmailでGmailアプリで送ったメール受信時のOSによる差異について

avantgarden

総合スコア121

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/04/15 04:57

メールサーバーからパイプライン処理で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でなぜ差異が出るのか教えて欲しいのですが、なるべくヒントを元に自分で見つけ出したいと思っています。

何か不足情報などあれば教えてください。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問