松元です.
各種メールリーダーが8bitで作成したメールをMewがMessage/Rfc822形式で転送
すると,転送したメールの本文が化ける問題(BASE64のdecodeに失敗する)です
が,時間が開いた時に調査してたのですが,だいたいまとまったので,まとめ
て報告しておきます.
BUGを誘発するメールリーダー
gmail(Web, Android)
Outlook(Android, iOS)
AppleMail(iOS, MacOSX)
これについてはコメントを除去する命令を
~/.mew
(setq mew-field-comment "")
を記載すると概ね改善します.ですが,以下のメールリーダまだダメです.
AppleMail(iOS, MacOSX)
上記 ~/.mewの設定では最後に余白がはいります.この余白を除去すると改善し
ます.
初期状態
"Content-Transfer-Encoding: base64 (modified by Mew)"
概ね改善「(setq mew-field-comment "")」
"Content-Transfer-Encoding: base64 " (最後に空白あり)
すべての環境で改善(ソースファイルを直接書き換え)
"Content-Transfer-Encoding: base64" (最後に空白無し)
最後の余白を取り除くには~/.mewへの加筆では難しくMewのソースコードの修正
が必要です.
Mew開発者の皆様:
可能でしたら 次期リリースでは ~/.mew の記述のみで最後の空白を取り除くの
を対応可能にしていただけないでしょうか.もしくは書き換えたという事を別
のヘッダ「X-ホゲホゲ」に記述するなど.(ソースコードの差し替えは可能なら
職場への周知としては使いたくないので.)
よろしくお願いします.
補足: 別解ですが,8bitスルーにするという方法についても教えていただきま
した.
~/.mew
(setq mew-use-8bit t)
この設定する事により,8bitスルーになり,Mewが引用メールを修正しなくなる
という副作用による,改善策です.
補足2: 最初の私のメール2021/6/9で「format=flowed」が誘発するBUGの件につ
いて記載していましたが,きちんと記録してなかったので,よくわからないの
ですが再現しなくなりました.
------------------------------------------------------------------
次に,転送したメール(Message/RFC822)の本文は読めるが,転送ファイル内に
(入れ子状態で)添付されている(日本語の)ファイル名が化ける問題です.
(※メールリーダーの組み合わせ数が多すぎて,限定的にしか調査してません.
調査が漏れてたらすいません.)
以下のメールリーダーで閲覧するとファイル名が文字化けします.
文字化けA. Outlook(iOS, Android): ファイル名が全部化ける
文字化けB. AppleMail(iOS): ファイル名の後半が化ける.
この件,文字化けAとBでは原因が違いました.
「文字化けA」についてはヒントを教えていただきましたが,ご指摘の通り,エ
ンコーディングの問題で,引用したメールの(入れ子状態の)ファイル名が
RFC2231だと文字化けするようです.具体的にはContent-Dispositionの
parameter「filename」のエンコードがRFC2231だと文字化けします.BASE64だ
と化けません.
注意: 入れ子状態の場合のみです.普通に添付されていた場合はRFC2231のファ
イル名は解釈できます.
なので,引用元のメールのContent-Dispositionのparameter「filename」のエ
ンコードがBASE64の場合は,ファイル名が文字化けしません.
(新規に作成する添付ファイルの)
ファイル名がRFC2231のメールリーダ
Mew
Thunderbird
Sylpheed(デフォルト設定)
DeepMail(Webメール/有償ソフト/職場で提供されてる)
ファイル名がBASE64のメールリーダ
Outlook2019
Rainloop
Sylpheed(オプションで変更可能),
となっています.ですが,いろいろな組み合わせで確認してみると,ファイル
名がRFC2231のメールを引用して転送してもファイル名が文字化けしない場合が
あります.
引用に用いるメールリーダーですが,Message/Rfc822で引用できるメールリー
ダーはあまりないのですが,以下で確認しました.
Thunderbird 78.11.0
Sylpheed 3.7.0(JIS)
DeepMail (JIS/Webメール/有償ソフト/職場で提供されてる)
Mew6.8
このうち,Sylpheed とDeepMailだと引用して転送してもファイル名が文字化け
しません.
差分比較(diff)などで調査したところ,Sylpheed とDeepMailは引用したメール
の(入れ子状態の)ファイル名をRFC2231からBASE64に修正していました.それで
ファイル名が文字化けしなかったようです.
ここで注意点ですが,Sylpheed とDeepMailは平時はファイル名をRFC2231にし
ます.ですが,引用したメールの(入れ子状態の)添付ファイルのファイル名は
RFC2231からBASE64に書き換えます.何らかのバグ対策をおこなっているようで
す.
補足: RFC822で引用したときに,どのような加工が行われるかですが,おそら
くThunderbirdは内容を一切変更しません.Mewは8bitをbase64などに加工する
場合があります.Sylpheed とDeepMailは色々書き換えます.(詳細省略.)
次に,「文字化けB」のファイル名の途中から文字化けする問題です.これにつ
いてですが,引用でなくても発生します.普通に添付されていても長いと文字
化けします.
Content-Dispositionのparameter「filename」が長い時は複数行にする事がで
きますが,複数行になった場合のみ文字化けするようです.ですが,Mewは文字
化けしないので不思議に思い調べたところMewはfilenameが長くなっても改行し
ないようです.この文字化けの件についてはこちらにまとめてます.
Ref:
https://qiita.com/qiitamatumoto/items/40cf965a5ef1bb2dd1a0
電子メール添付の日本語ファイル名の名前の後半が化ける
(RFC2231形式の長いファイル名)
以上です.
---
補足資料.内容が重なりますが,調査の全データ.雑多なメモ書きなので,
誤記などあると思います.
http://www.emaillab.org/essay/japanese-filename.html#rfc2231
Content-Transfer-Encoding: [base64|quoted-printable|7bit|8bit]
Subject: 「エンコード形式」
Content-Type, name: 「エンコード形式」
-> Content-Typeのparameter「name」のエンコード形式
Content-Disposition, filename: 「エンコード形式」
-> Content-Dispositionのparameter「filename」のエンコード形式
ファイルを保存した時の名前.
-> Mewのみ画像ファイルを添付すると「inline」属性になる.それ以外は「attachment」
エンコード形式: [UTF-8|iso-2022-jp], [B|Q|RFC2231]
B: Base64形式 (=?charset?B?.....?=)
複数行の場合は行頭に空白入れる.
Subjectの時はダブルクオート不要だが,Content-Type,nameではダブル
クオート「name="xxxx"」でくくる.
Q: Quoted Printable形式 (=?charset?Q?=16進数...?=)
RFC2231: RFC2231形式(filename*=charset''%%16進数)
英語の場合は「*」不要だがダブルクオート「filename="xxxx"」でくくる.
長くて二行にする場合は filename*0*, filename*1*.英語の場合は filename*0, filename*1.
継続行の後ろには「セミコロン改行空白」つける.
ここから.
添付ファイルは日本語ファイル名のjpgとpdfを付けてます.
1. Thunderbird + Plain(UTF-8) + 添付ファイル
Subject: UTF-8, B
base64の幅: 72
本文:
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: UTF-8, B
Content-Disposition, filename: UTF-8, RFC2231
2. Thunderbird + Plain(UTF-8) + HTML + 添付ファイル
Subject: UTF-8, B
base64の幅: 72
添付テキスト(Content-Type: multipart/alternative)
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit
添付HTML(Content-Type: multipart/alternative)
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: UTF-8, B
Content-Disposition, filename: UTF-8, RFC2231
3. Thunderbird + Plain(JIS) + 添付ファイル
Subject: UTF-8, B (BUG: JISではない)
base64の幅: 72
本文:
Content-Type: text/plain; charset=iso-2022-jp; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: UTF-8, B
Content-Disposition, filename: UTF-8, RFC2231
BUG: 本文はJISになるがファイル名はUTF-8.
補足:
ThunderbirdはDefaultはUTF-8だがJISに変更する方法
https://www.cc.yamaguchi-u.ac.jp/guides/mail/setting/wizardwithssl/thunderbird78.phtml
4. Thunderbird + Plain(JIS) + HTML + 添付ファイル
Subject: UTF-8, B (BUG: JISではない)
base64の幅: 72
添付テキスト(Content-Type: multipart/alternative)
Content-Type: text/plain; charset=iso-2022-jp; format=flowed; delsp=yes
Content-Transfer-Encoding: 7bit
添付HTML(Content-Type: multipart/alternative)
Content-Type: text/html; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: UTF-8, B
Content-Disposition, filename: UTF-8, RFC2231
BUG: 本文はJISになるがファイル名はUTF-8.
BUG: 添付ファイルの Content-Disposition, filenameがBASE64.
12. DeepMail + Plain(JIS) + 添付ファイル
Subject: ISO-2022-JP, B
base64の幅: 72
本文:
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: ISO-2022-JP, B
Content-Disposition, filename: ISO-2022-JP, RFC2231
Content-Type: image/pjpeg (属性が変わってる: jpeg -> pjpeg)
13. Mew + Plain(JIS) + 添付ファイル
Subject: ISO-2022-JP, B
base64の幅: 76
本文:
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, name: ISO-2022-JP, B
Content-Disposition, filename: ISO-2022-JP, RFC2231
14. Mew + Plain(UTF8) + 添付ファイル + 8bit
Subject: utf-8, B
base64の幅: 76
本文:
Content-Type: Text/Plain; charset=utf-8
Content-Transfer-Encoding: 8bit
添付ファイル:
Content-Transfer-Encoding: base64
Content-Type, inline, name: utf-8, B
Content-Disposition, filename: utf-8, RFC2231
---------------------------------------------------------------
* メール転送方式(以下すべてMessage/Rfc822で転送)
a. 転送:Thunderbird + Plain(JIS)
実装: 転送時は加工しない.
Bug:転送メール本文が8bit/UTF-8であっても
添付ファイルのヘッダが7bit.
Content-Type: message/rfc822;
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
Content-Type:nameは基本はBだが時々Qが混ざる。
b. 転送:Thunderbird + Plain(UTF-8)
実装: 転送時は加工しない.
転送メール本文によりContent-Transfer-Encoding:7 or 8bitが切り替わる.
Content-Type: message/rfc822;
Content-Transfer-Encoding: 7bit or 8bit
Content-Disposition: attachment;
Content-Type:nameは基本はBだが時々Qが混ざる。
c. 転送:Sylpheed + Plain(JIS)
実装: 転送メールを多数加工する.
添付ファイルのヘッダが,転送メール本文がJISの時は7bit
転送メール本文がUTF-8の時は7bit
Content-Type: Message/Rfc822
Content-Transfer-Encoding: 7bit or 8bit
Content-Disposition: inline"
添付ファイルを多数加工する.
1.転送時にBASE64のlen=72をlen=76にresizeする。
2.転送ファイル内のjpg/PDFにContent-IDを追加する。
3.添付ファイル内のContent-Disposition:filenameがRFC2231の場合はBに修
正する。
4.HTMLの書換が行われる。DeepMailとSylpheedと同じ修正のため、何等かの
ライブラリ? 空白の位置や改行が変わる.
5.Thunderbirdが付けるContent-Type: format=flowedを削除する。
6.Thunderbirdが本文JISでも添付ファイル名やSubjectをUTF-8にするバグは、
全てJISに修正される。
d. 転送:DeepMail + Plain(JIS)
実装: 転送メールを多数加工する.
添付ファイルのヘッダが,転送メール本文がJISでもUTF-8でも
転送メールのファイル名はJIS.
Content-Type: message/rfc822; name=JIS,B
Content-Disposition: attachment; filename=JIS,RFC2231
(無し Content-Transfer-Encoding: )
添付ファイルを多数加工するが,修正内容は「Sylpheed + Plain(JIS)」と
同じ.同じライブラリ?
e. 転送:Mew + Plain(JIS)
転送時に8bitメールをBエンコーディングにする.Mewコメント追加.
f. 転送:Mew + Plain(JIS) + Mewコメント除去
転送時に8bitメールをBエンコーディングにする.
g. 転送:Mew + Plain(JIS) + 8bit
転送時は加工しない.
h. 転送:Mew + Plain(UTF-8) + 8bit
転送時は加工しない.
Mew注釈
8bit:
~/.mew に(setq mew-use-8bit t)加筆
Mewコメント除去
~/.mewに(setq mew-field-comment "")加筆
Plain(UTF-8)
~/.mewに
> (setq mew-cs-database-for-encoding
> `(((ascii) nil "7bit" "7bit")
> (nil utf-8 "base64" "B")))
加筆.
Thunderbird注釈
Thunderbirdはメール転送のDefaultは「メール本文に含める」だが「ファイルとして添付」
に変更した.
* 閲覧確認メールリーダー
Outlook/(Web版),
Outlook2019(Win10),
Thunderbird(78.11.0/Win10),
DeepMail(Web)
Sylpheed(3.7.0/Win10),
GOOD: すべてのメールの本文/添付ファイル名が問題なし.
Rainloop(1.15.0/Web)
NG: RFC822の添付ファイルはダウンロードになるので直接閲覧できない.
gmail/(Web版)
NG: [1,2]-e(本文NG, ファイル名OK)
原因: 本文NGはMewのコメント
gmail/(Android版)
NG: [1,2]-e(本文NG, ファイル名OK)
原因: 本文NGはMewのコメント
Outlook/(Android版)
NG: [1,2,3,4,9,12]-a (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-b (本文OK, ファイル名NG)
NG: [1,2]-e (本文NG, ファイル名NG)
原因: 本文NGはMewのコメント
NG: [3,4,9,12]-e (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-f (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-g (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-h (本文OK, ファイル名NG)
Bug: Message/Rfc822で引用した時のみRFC2231が解釈できない.
Outlook/(iOS版)
NG: [1,2,3,4,9,12]-a (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-b (本文OK, ファイル名NG)
Bug: Message/Rfc822で引用した時のみRFC2231が解釈できない.
NG: [2,4,6,8]-c (本文OK,ファイル名OK.添付ファイルの画像ファイルが消える)
NG: [2,4,6,8]-d (本文OK,ファイル名OK.添付ファイルの画像ファイルが消える)
原因不明.
NG: [1,2]-e(本文NG, ファイル名NG)
原因: 本文NGはMewのコメント
NG: [3,4,9,12]-e (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-f (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-g (本文OK, ファイル名NG)
NG: [1,2,3,4,9,12]-h (本文OK, ファイル名NG)
Bug: Message/Rfc822で引用した時のみRFC2231が解釈できない.
AppleMail/iOS版
NG: 12-a,12-b(本文OK, ファイル名途中から文字化け)
NG: [1,2,3,4,5,7,8,11,12]-d (本文OK, ファイル名OKだが,RFC822の添付ファイル名が途中から文字化け)
NG: 12-e(本文OK, ファイル名途中から文字化け)
NG: 12-f (本文OK, ファイル名途中から文字化け)
NG: 12-g (本文OK, ファイル名途中から文字化け)
NG: 12-h (本文OK, ファイル名途中から文字化け)
-> MEMO: AppleMailのバグ.
Ref:
https://qiita.com/qiitamatumoto/items/40cf965a5ef1bb2dd1a0
NG: [1,2]-e (本文NG,ファイル名OK)
NG: [1,2]-f (本文NG,ファイル名OK)
原因: 本文NGはMewのコメント.ただし, 最後の空白1個も消さないといけない.
「setq mew-field-comment ""」では最後に空白が1個入る.
ORGNAL: "Content-Transfer-Encoding: base64 (modified by Mew)"
NG: "Content-Transfer-Encoding: base64 " (最後に空白あり)
OK: "Content-Transfer-Encoding: base64" (最後に空白無し)
AppleMail/MacOS(11.4, メール バージョン14.0(3654.100.0.2.22))
NG: [1,2]-e(本文NG,ファイル名OK)
NG: [1,2]-f(本文NG,ファイル名OK)
原因: 本文NGはMewのコメント.ただし,最後の空白1個も消さないといけない.
以上.