メール本文が一行1000バイトを超えると文字化ける問題


sendmail、qmail、Postfixで送信するメールで一行あたり1000バイトを超えると、自動で改行コードが挿入される問題。
マルチバイト文字列とか全然考慮されないまま改行コードが挿入されるらしく、それが原因で日本語が文字化けてしまう。
上記のMTAに限らずどのMTAでもだいたいそういう仕様になってるっぽい。

RFCのドキュメントにも、一行1000バイト超えたメール本文を作っちゃだめだよーって明記されている。
ので、おとなしくアプリケーション側で長い行に対して改行文字を差し込む。

以下、長い行に改行文字を入れるPHPのメソッド書いた。

function _preventGarbledCharacters($bigText, $width=249) {
    // wordwrap()はマルチバイト未対応のため正規表現を使う。
    $pattern = "/(.{1,{$width}})(?:\\s|$)|(.{{$width}})/uS";
    $replace = '$1$2' . "\n";
    $wrappedText = preg_replace($pattern, $replace, $bigText);
    return $wrappedText;
}

これで強制改行が原因の文字化けは無くなるはず。

参考

http://srgia.com/docs/rfc2822j.html#p2.1.1
http://www.geek.sc/archives/743
https://siiz.biz/memo/detail.php?id=70