#前提
Linuxのmailコマンドで「長めの日本語の件名」を持つメールを送信しようとして、謎の文字化けに悩まされた時の対応方法
#今回ぶつかった壁
mail -s "あいうえおかきくけこさしすせそ" test@example.com
テスト
.
EOF
としたところ、
件名:あいうえおかきくけこさし��せそ
本文:テスト
という件名が中途半端に文字化けしたメールが飛んできた。
まあphpとかシェルスクリプトとか、他の方法使えよって話になるんですが、どうしてもmailコマンドでどうにかしたかった~~(上司にやれって言われた)~~ので、やってみることにしました。
#環境
OS | serverのメーラー | clientのメーラー |
---|---|---|
CentOS7 | Heirloom mailx 12.5 7/5/10 | Thunderbird 45.4.0 |
#やったこと
##エスケープ処理してみる
mail -s "あいうえおかきくけこさし\すせそ" test@example.com
テスト
.
EOF
件名:あいうえおかきくけこさし��せそ
本文:テスト
変わらない。
##文言を変えてみる
mail -s "鳴かぬなら鳴くまで待とうホトトギス" test@example.com
テスト
.
EOF
件名:鳴かぬなら鳴くまで待とう��トトギス
本文:テスト
やっぱり変わらないが、ここら辺で規則性を見つける。
13文字目がなんか化けてる!
##メールヘッダを見てみる
Subject: =?utf-8?B?44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX4w==?=
=?utf-8?B?gZnjgZvjgZ0=?=
echo 44GC44GE44GG44GI44GK44GL44GN44GP44GR44GT44GV44GX4w== | nkf -W -mB -w
あいうえおかきくけこさし
echo gZnjgZvjgZ0= | nkf -W -mB -w
せそ
なんか13文字目で切れて改行されてるようだ。
##調べてみる
13文字目が改行されているということで色々調べてみた結果、以下のサイトに行き着いた。
RFC 2822
the 998/78 character limitations per line
(1ライン当たり78分の998文字の制限)
とあるので、998/78=12.7948....文字までしか1行に表示できない(らしい)。
12文字目の次の文字でsubjectに改行が入れられてしまった結果、次の行に当たる部分がおかしな表示になってしまう(らしい)。
これが文字化けしている原因と推定する
##逆に13文字目より前の部分で改行してみる
mail -s `echo -e "あいうえおかきくけこ\rさしすせそ"` test@example.com
件名:あいうえおかきくけこさしすせそ
本文:テスト
キマシタワァ・゜゚・:.。..。.:・゜(n'∀')η゚・:.。..。.:・゜゚・
##別の回避方法
連続した13文字がダメなのであって、半角スペースなどを入れられるのであれば、入れてしまえば回避できる。
mail -s "鳴かぬなら 鳴くまで待とう ホトトギス" test@example.com
テスト
.
EOF
件名:鳴かぬなら 鳴くまで待とう ホトトギス
本文:テスト
件名に半角スペースを入れても違和感がないのであれば、これでも回避できそう。
#応用
shellでmailコマンドで日本語の長いタイトルのメールを送る機会となるとあんまり無い気がしますが、例えばcronの結果をパイプしてメールで送るとか、何かと組み合わせると使用用途があるような気がしないでもないです。
例えば
1 * * * * /bin/sh/ sagyou.sh 2>&1 | mail -s `echo -e "あいうえおかきくけこ\rさしすせそ"` to@example.com
みたいな使い方とか?
#備考
メーラーの環境やWEBメールだと\r
が半角スペースになってしまうことがあるようです。