Bug(バグ) #2261
未完了
メール投稿で画像を1つだけ送信すると画像として扱われないことがある
Naoya Tozuka さんが13年以上前に追加.
4年以上前に更新.
説明
Overview (現象)¶
日記やコメント等をメールで投稿する際、本文なしで画像を1つだけ送信すると、画像として認識されずBase64テキストとして本文に展開されてしまうことがある。
本来は本文なしで画像のみが送信された場合のフローに従い、メール投稿を成功させず日記が作成されないようにすべき(そして「本文を入力してください。」というメールを返信すべき)である。
★写真のみの投稿も(オプション等で)許可すべきではないかという議論も必要かと思われるが別チケットで。
Environment (再現バージョン)¶
Way to repro (再現方法)¶
- 現在この現象が確認できているのはiPhoneのMMSからメール投稿を行ったケースのみ。
Causes (原因)¶
iPhoneのMMSでは、画像単体を送信した場合 Content-type: image/jpeg で画像データのみを(base64エンコーディングでテキスト化して)送信するが、
opMailMessage クラスは multipart でないメールを全てJISエンコーディングのテキストとして認識してしまうのが原因。
Way to fix (修正内容)¶
Content-type が image/jpeg, image/png, image/gif などのメールを正しく処理できるように opMailMessage クラスを修正する。
ファイル
関連するチケット
1 (0件未完了 — 1件完了)
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
iPhoneから本文なしで画像のみをMMSで日記投稿用URLに送信した場合に、日記作成に失敗し
Subject: [***(SNS名称)***]メールの処理中にエラーが発生しました
本文を入力してください。
のようにメール通知が返されるようになることを確認しています。
- 題名 を メール投稿で画像のみで送信すると画像として扱われないことがある から メール投稿で画像を1つだけ送信すると画像として扱われないことがある に変更
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
チケットで示されている問題とは別ですが、PHPのバージョンが新しいとき(5.3.5で再現確認。5.2.13では再現せず)に添付画像が保存されない問題を発見しました。
修正の範囲と内容がこのチケットに収まると判断し、追加で修正します。
PHPのバージョンが新しいとき(この意味は以下の原因と note-8 を参照のこと)、メール投稿において画像を添付すると(添付画像の個数は任意)添付画像が受け付けられない。
最新のPHPにおいて、base64_decode() を strictモード(第2引数をtrue)で使うとmultipartから取得した画像データ(base64-encoded text)の末尾に改行が余分に含まれていると FALSE を返す。添付画像は application/x-empty とみなされ画像とはみなされず無視される。
修正方法¶
base64_decode($content, true); の箇所を base64_decode(rtrim($content), true); に変更する。
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
note-5 時点では、 note-5 で示されている問題を本チケットで併せて対応していますが、問題の内容を考えるとこれは別チケットで扱うべきでした。
note-5 の問題は #2476 で扱います。その修正は本チケットに紐づいている fcab4cf5 です。
このチケットでは 5cbd2e46 の修正のみレビュー、テストを行なってください。
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- 担当者 を削除 (
Naoya Tozuka)
5cbd2e46 の修正が入った master ブランチで、「画像が添付されていない場合に、メール投稿が失敗する」という不具合が見つかっています。
- その修正で次の記述が追加されていますが、
lib/util/opMailMessage.class.php
53- elseif ('text/plain' === strtok($this->getPart(0)->contentType, ';'))
54- {
55- return mb_convert_encoding(parent::getContent(), 'UTF-8', 'JIS');
56- }
- $this->getPart(0) のコールで、次の部分に到達し、例外が投げられているようです
lib/vendor/Zend/Mail/Part.php
239- public function getPart($num)
--
260- if (!isset($this->_parts[$num])) {
261- /**
262- * @see Zend_Mail_Exception
263- */
264- require_once 'Zend/Mail/Exception.php';
265- throw new Zend_Mail_Exception('part not found');
266- }
- 対象バージョン を OpenPNE 3.7.0 から 252 に変更
- 対象バージョン を 252 から OpenPNE 3.8.x に変更
- 対象バージョン を OpenPNE 3.8.x から OpenPNE 3.10.x に変更
- 3.6 で発生するか を Unknown (未調査) にセット
- 対象バージョン を OpenPNE 3.10.x から OpenPNE 3.11.x に変更
他の形式にエクスポート: Atom
PDF