通りマン さん、アドバイスありがとうございます。
通りマン さんが書きました:
拡張子が".tmp"になる場合は、添付ファイルのContent-Typeがapplication/pdfではなくapplication/octet-streamだったりしますか?
メッセージのソースを確認してみてください。[表示(V)]→[メッセージのソース(O)]
手元のメールでちょっと確認してみた感じは、上記の通りContent-Typeに関係しているように思えます。
なるほど、Thunderbird は Content-Type (MIME Type) を見て一時ファイルの拡張子を決めているということでしょうか。
当方でも、次のような手順でテストしてみました。(環境= Windows 7 + Thunderbird 45.4.0)
(1)Content-Type が application/octet-stream で定義された添付ファイル(例:ABCDE.pdf)を持つ元メール(A)
(添付パートのヘッダ)
--------------- <boundary>
Content-Type: application/octet-stream;
name="ABCDE.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="ABCDE.pdf"
―― に対し、[転送]("メッセージ本文に含める" の形式)を実行
(2)開いたメッセージ作成ウィンドウの右上にあるアタッチメントボックスに表示される添付ファイル名を確認。
→ ABCDE.pdf となっている。
(3)この ABCDE.pdf にマウスポインタを重ねたとき表示されるツールチップを確認
→ file:///C:/Users/<UserName>/AppData/Local/Temp/nsmail.tmp と表示される。
(実際に Temp フォルダを開いても、nsmail.tmp の存在を確認しています。)
(4)下書きとして保存する
(5)[下書き] フォルダに保存されたメール(Fwd>A)のアタッチメントバーを確認
→ 添付ファイルとして ABCDE.pdf が表示されていた。
(6)この ABCDE.pdf に対して [開く] を実行
→ 既定の PDF リーダーが起動して正常に開かれた。
(7)(Fwd>A)のメッセージソースを確認
→ 添付パートは(1)と同じ、つまり application/octet-stream で定義されていた。
(8)下書きを再度開き、そのまま自分宛に送信を実行
(9)受信した(8)の添付ファイルの名前、開けるかどうか、メッセージソースを確認
→ (5)(6)(7)と同じだった。
同様に、Content-Type が application/octet-stream になっている *****.xlsx や *****.docx を持つ元メールに対しても転送(メッセージ本文)を実行してみましたが、上記と同様の結果になりました。
qwn さんが書きました:
また.tmpファイルのまま他のメールソフトに送信した結果、
受信相手側でファイル化けが発生して開けなくなってしまう現象が発生しました。
上記テストの各メールを Thunderbird 以外のメールクライアント(Sylpheed など)で受信した場合でも、個々の添付ファイルの名称に異常はなく、どのファイルも正常に開けました。
通りマン さんが仰るように、Content-Type が application/octet-stream で定義されている添付ファイルを持つ元メールに対して転送を実行したとき、その添付ファイルの一時ファイルが nsmail.tmp という名前でテンポラリ領域に作られるのは確かなようです。
qwn さんが書きました:
ただアタッチメントボックス内の添付ファイルにカーソルを合わせるとファイルパスがコメント表示されますが
その表示内容が「C:\Users\***\AppData\Local\Temp\nsmail.pdf」でなく「C:\Users\***\AppData\Local\Temp\nsmail.tmp」となっている場合があります。
前者の場合は転送メール送信後も相手に「ABCDE.pdf」として届いているのですが、後者の場合だと相手の受信メールにてファイル化けが発生しました。
しかし、少なくとも当方で試した複数パターンのテスト結果では、nsmail.tmp だから問題が起こるということはなく、「後者の場合だと相手の受信メールにてファイル化けが発生」みたいな不正常な状態は再現できませんでした。
(考察)
添付ファイルを持つ元メールに転送を実行したとき、元の添付ファイルのデータはいったんテンポラリ領域にデコードされます。このとき与えられる仮のファイル名が nsmail.*** で、拡張子部分は元の添付ファイルが持っていた Content-Type に左右されるようです。
例えば、Content-Type が application/pdf なら、一時ファイル名には nsmail.pdf という仮の名前が与えられます。application/octet-stream なら、nsmail.tmp になります(-> 補足)。
メッセージ作成ウィンドウでの編集中、一時ファイルの動きは次のようになります。
<1> 添付ファイルはいったんデコードされ、一時ファイル(nsmail.***)として生成される
<2> 添付ファイルを開いて修正した場合は nsmail.*** の中身が更新される
<3> 添付ファイルに修正を加えないなら、nsmail.*** は <1> から変化なし
<4> 編集中のメッセージを下書き保存するか送信する時点で、nsmail.*** がエンコードされて取り込まれる
―― という流れで処理されるので、この経過の中で一時ファイルの中身に障害が起こっていなければ、添付ファイルとして取り込まれたデータに異常は起こらないはずです。
要するに、nsmail.*** で一番重要なのは、ファイルの名前ではなくデータの中身です。一時ファイル名が nsmail.pdf だろうが、nsmail.tmp だろうが、本質的には関係ありません。
一方、メール上に表示される添付ファイル名は、メッセージソースの添付パートにある name や filename で定義されています。デコードされた一時ファイルの仮の名前である nsmail.*** とは完全に独立しています。
メッセージ作成ウィンドウのアタッチメントボックスで、名前が ABCDE.pdf となっている添付ファイルに対し、右クリックから [名前を変更] で FGHIJ.docx のように変更することも可能ですが、ここで書き換えられるのは name や filename の内容です。一時作業用に展開された nsmail.*** の名前や中身が書き換えられるわけではありません。
これらのことから、「受信相手側でファイル化けが発生して開けなくなってしまう現象」「相手の受信メールにてファイル化けが発生」というのは、nsmail.tmp だからではなく、作業経過の中で nsmail.tmp の内容が書き換えられるなど、何かしら別の要因が影響してるのではないでしょうか。
拡張子が pdf や xlsx 、docx などのファイルには作用しないが、tmp のファイルには作用するような何かとか...。
あるいは、特定の受信者の環境条件に問題があって、application/octet-stream で指定された PDF ファイル等を適切に扱えないとか、そういったことがあるのかもしれません。(もしこのようなケースであったとしても、添付ファイルをいったん保存すれば、そのシステムで設定されている条件で PDF ファイルを扱えるとは思います。)
元メールに添付された PDF ファイルが application/octet-stream で定義されている以上、[転送] ではその条件を踏襲して送信されるので、根本的には元メールの送信者に正しい Content-Type で送ってもらうのが一番いいとは思うのですが...。
これ以上は、いまある情報からでは詳しいことはわかりません。
「受信相手側でファイル化けが発生して開けなくなってしまう現象」の具体的な症状などがわかれば、今よりは見えてくることがあるかもしれませんね。
(補足)
電子メールにテキスト以外のデータを付加する場合、そのデータの形式を定義するためのコード体系が定められています。これが Content-Type (MIME Type) であるのは、ご承知のことと思います。
このうち、アプリケーション固有のフォーマットを示す application タイプには、ファイルの種類によって指定形式がいくつも存在します。
例えば、PDF ファイルなら application/pdf ですし、Microsoft Excel の xlsx ファイルなら application/vnd.openxmlformats-officedocument.spreadsheetml.sheet です(バリエーションも存在しますが...)。
application/octet-stream は、タイプを特定できない場合の汎用的な指定形式です。拡張子との関係を意識して述べるなら、そのファイルの拡張子を特定できない(判別できない)場合に付ける指定形式、といえましょうか。
したがって Thunderbird は、application/pdf の添付ファイルには nsmail.pdf という一時ファイル名を付けられるが、application/octet-stream では拡張子を特定できないため、仮に nsmail.tmp と付けている、といえるでしょう。
Content-Type が変則的で一時ファイル名が nsmail.tmp になっても、そのデータの中身が正常に取り扱われているのなら、転送先に不正常な添付ファイルが送られることは考えにくいです。
とりあえず以上です。的外れな話になっていたらすみません。
テストの内容や手順に甘いところがあったり、電子メールの標準仕様に関して間違ったことを書いていたら、ご指摘いただけると感謝です。