RT:ドヤリング

Twitterのドヤリングアカウント(@doyaling)の出張所です。文章が長くなるときにコチラ使用します。

Macから送るメールの本文が消えてしまう問題のつづき

 一昨日のエントリ(Macの標準メールアプリからGmailアカウントでメールを送信した際に本文が消えてしまう現象について)で書いたように、Macの標準メールアプリからメールを送信した際に、ときどき本文が消えてしまって、代わりに本文が書かれた「ATT00001.txt」などの変なテキストファイルが添付されるという「謎エラー」が起きています。


 同じような現象についてネット上には解説がなかったと書いたのですが、同僚からこれを説明した記事(MITの学内向けFAQ?)を教えてもらいまして、読んでみたところ、ほぼ私が推測した通りの内容でした。


 Q: Why is Exchange creating ATT00001 attachments?
 http://kb.mit.edu/confluence/pages/viewpage.action?pageId=4981187


 ちなみに、相当いろいろ検索したはずなのに一昨日このページを見つけられなかったのは、「ATT00001」ではなく「AT00001」(Tが1個足りない)で検索してたからでした・・・。


 f:id:doyaling:20140621105013p:plain


 「ATT00001」で検索したら、ふつうにトップから3番目ぐらいにヒットしますね。失礼しました。


 で、解説されている内容としては、

  • メールに「インライン」で添付ファイルが貼られているようなメールの場合、添付ファイルより後ろのテキストが削除されて、「ATT00001」とかいう添付ファイルにぶち込まれてしまいます。
  • この問題は、テキストと添付ファイルが混ざったメールを送ったときに発生します。
  • これはMITのExchangeサーバ(Microsoft Exchange server version 2007をつかっている)を通る全てのメールで発生する現象です。
  • Exchangeは、メール本文のテキストのセクションは、必ず添付ファイルのセクションよりも前になければならないという仕様になっていて、添付ファイルが1つでも登場したらそれよりも後のデータは全て添付ファイルであると認識されます。
  • だから、添付ファイルよりも後ろの本文が「ATT00001」などのテキストファイルに変身してしまうというわけです。
  • この現象は、Macのメールが送られてくる場合によく発生します。Macは、フレキシブルなレイアウトを認めてるからです。
  • これはもうサーバの仕様なので回避する方法はありません。
  • 対策としては、とにかく添付ファイルは一番後ろに、つまり本文や署名よりも下の方に配置するようにしてください。
  • Macを使っている人は、メールアプリの設定で、「Always Send Windows-Friendly Attachments」と「Always Insert Attachments at End of Message」を必ずオンにしといてください。メールのフォーマットも「Plain Text」とするように。
  • ただし、ゼムクリップ型のボタンから添付した場合は上記の設定によって添付ファイルを一番最後に配置してくれますが、ドラッグ&ドロップの場合は関係ないので、自分で気をつけてください。


 というもの。だいたい、推測した通りでしたね・・・。


 「セクション」というのはたぶん、Eメールの本文がマルチパートされているときの各エンティティのことです。
 詳しいことは知りませんが、Eメールに添付ファイルがついているときって、Eメールの中身としてはまずヘッダーの「content-type」という設定欄が「multipart/mixed」と指定されて、ボディ(本文)部分には入れ子状に複数のメールのデータが埋め込まれてるような感じになり、この埋め込まれるやつをエンティティと呼んでるらしいです。
 このエンティティがまたそれぞれ「content-type」の値を持っており、あるものはテキストであるものはイメージだったりするわけで、受信したときにメールサーバーかメーラー*1が、「こっちは本文、こっちは添付ファイル」って仕分けして表示してくれるんでしょう。
 で、Exchange的には、マルチパートするんだったら本文に相当するエンティティは一番始めにおいといてくださいよという意味なんでしょう。
 インラインに添付ファイルを表示できるメーラーは、テキスト→画像→テキスト→画像みたいにエンティティが並んでいるメールを受信した場合、順番に再構成してくれてるってことなんでしょうか。


 なお、上記MITの解説だと、添付ファイルから後ろのテキストは全部消えてしまうことになっていますが、昨日のエントリで書いたとおり、メール作成ウィンドウでメール本文の左上に詰めて添付ファイルを配置した場合(つまり添付ファイルの「左」や「上」にテキストがない状態)であれば、謎エラーは発生しません。
 一昨日のエントリでは、発生条件として、

  • 作成中のメール本文中に埋まっているいずれかの添付ファイルの、左側か上側に、スペース(全角でも半角でも)や改行が入っている


 というのを挙げましたが、これはたぶん、スペースとか改行コードが入っているとその部分がテキスト形式のエンティティとして独立したものとして判断されるためで、だからべつにスペースとか改行じゃなくて文字なら何を入れても同じことになるのでしょう。
 逆にいうと、テキスト形式のエンティティが最低1個出てくるまでは、本文がまだ見つかっていないと判断されて、逆にそれより「前」のエンティティを添付ファイルとして認識した上で、本文が出てくるまで探すという仕様になってるんでしょうね。


 つまり、


 f:id:doyaling:20140621115519p:plain


 ↑こういうふうにメールを書いた場合は、当然、↓こうなります。


 f:id:doyaling:20140621115716p:plain


 1個目の添付ファイルを認識した段階では、まだ本文がみつかっていないので本文探しを継続し、「どやどや」が見つかったので安心して、そっから先は何があろうと添付ファイルとして認識するわけです。


 というわけで、現象はとりあえず理解できましたが、謎も残っています。私が試した環境では、添付ファイルがPDFだとこの「謎エラー」が発生するのですが、pngの画像の場合は発生しませんでした。画像については本文のインラインに配置されることもあり得ることになってるんでしょうかね。


 あと、べつに謎ではないですが、Macのメールアプリで「本文よりも後に添付ファイルを配置するように」って言われても、ちょっと抵抗があるのは、誰かに返信するときにオリジナルメッセージを引用している場合です。返信に添付しようと思っているファイルを、オリジナルメッセージの下に、つまり返信相手のメッセージの下に配置するというのはなんか気持ち悪いですね。


 まぁとりあえず、だいたい解決したので良しとします。

*1:どっち?