こんにちは。
mailコマンドですが、今ある2台のdebianで異なるcharsetで送信されます。 1台の方は Content-Type: text/plain; charset="ANSI_X3.4-1968" もう一台の方は Content-Type: text/plain; charset="UTF-8"
送信コマンドは mail -s "xxxxxxxx" foo@sendto.address です。 localeは LANG=C です。
特に問題ではないのですが、どこの何を参照してcharsetを決めているのでしょ うか?
野村
mailコマンドが/usr/bin/mailで、それがbsd-mailxだという前提です。 確認はこのコマンドで。 $ update-alternatives --display mailx または $ ls -l /usr/bin/mail /etc/alternatives/mail
From: Tomoo Nomura nomurat@tmo.co.jp Subject: [debian-users 00690] mail コマンドのcharset Date: Fri, 27 Nov 2020 09:41:37 +0900
1台の方は Content-Type: text/plain; charset="ANSI_X3.4-1968" もう一台の方は Content-Type: text/plain; charset="UTF-8"
送信コマンドは mail -s "xxxxxxxx" foo@sendto.address です。
再現実験をしてもらうのであれば、メール本文も固定のほうがよいでしょう。 (でも、今回はあまり影響ないかも?)
$ echo abcd | mail -s 以下略
localeは LANG=C です。
localeコマンドを実行してみてください。 私の環境ではこんな感じ。
$ locale LANG=ja_JP.UTF-8 LANGUAGE= LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL= $
この状態で、無指定のmailコマンドでUTF-8、LC_ALL=CでANSI_X3.4-1968に なりました。
特に問題ではないのですが、どこの何を参照してcharsetを決めているのでしょ うか?
manページをみてみるとか。 mail(1)の、“Character sets and MIME”あたり、でしょうか。 https://manpages.debian.org/buster/bsd-mailx/mail.1.en.html#Character_sets_a...
“ANSI_X3.4-1968”で検索してもよいのかも。
KISE Hiroshi 様
ありがとうございました。とりあえず、 LC_ALL=en_US.UTF-8 を入れればUTF-8になりました。 LANG=Cでしたが、その他は LC_MONETARY=en_US.utf8 LC_PAPER=en_US.utf8 LC_MEASUREMENT=en_US.utf8 LC_TIME=en_US.utf8 LC_NUMERIC=en_US.utf8 としていたので、UTF-8になると思っていたのですが、LC_ALLが必要だったよう です。 ただ、もう一台の方は LC_ALL= でもcharset=UTF-8になってます。 bsd-mailxのバージョンは同じで、8.1.2-0.201808 です。 う〜ん。 ただし、utf-8となる側のマシンのpostfixはansiとなる側のマシンにrelayして 発信しています。そこで、uft-8となる側のマシンから直接発信してみました。 すると、ansiとなり2台の結果は同じになりました。 結論、postfixがrelayで受け取ったメールはutf-8となり、直接発するメールは ansiとなるようです。postfixの設定になにかありそうです。いずれにしろ、 LC_ALL=en_US.UTF-8をいれればどちらもutf-8になるようです。 postfixを調べてみます。 ありがとうございました。
野村
On 11/27/20 10:46 PM, KISE Hiroshi wrote:
mailコマンドが/usr/bin/mailで、それがbsd-mailxだという前提です。 確認はこのコマンドで。 $ update-alternatives --display mailx または $ ls -l /usr/bin/mail /etc/alternatives/mail
From: Tomoo Nomura nomurat@tmo.co.jp Subject: [debian-users 00690] mail コマンドのcharset Date: Fri, 27 Nov 2020 09:41:37 +0900
1台の方は Content-Type: text/plain; charset="ANSI_X3.4-1968" もう一台の方は Content-Type: text/plain; charset="UTF-8"
送信コマンドは mail -s "xxxxxxxx" foo@sendto.address です。
再現実験をしてもらうのであれば、メール本文も固定のほうがよいでしょう。 (でも、今回はあまり影響ないかも?)
$ echo abcd | mail -s 以下略
localeは LANG=C です。
localeコマンドを実行してみてください。 私の環境ではこんな感じ。
$ locale LANG=ja_JP.UTF-8 LANGUAGE= LC_CTYPE="ja_JP.UTF-8" LC_NUMERIC="ja_JP.UTF-8" LC_TIME="ja_JP.UTF-8" LC_COLLATE="ja_JP.UTF-8" LC_MONETARY="ja_JP.UTF-8" LC_MESSAGES="ja_JP.UTF-8" LC_PAPER="ja_JP.UTF-8" LC_NAME="ja_JP.UTF-8" LC_ADDRESS="ja_JP.UTF-8" LC_TELEPHONE="ja_JP.UTF-8" LC_MEASUREMENT="ja_JP.UTF-8" LC_IDENTIFICATION="ja_JP.UTF-8" LC_ALL= $
この状態で、無指定のmailコマンドでUTF-8、LC_ALL=CでANSI_X3.4-1968に なりました。
特に問題ではないのですが、どこの何を参照してcharsetを決めているのでしょ うか?
manページをみてみるとか。 mail(1)の、“Character sets and MIME”あたり、でしょうか。
https://manpages.debian.org/buster/bsd-mailx/mail.1.en.html#Character_sets_a...
“ANSI_X3.4-1968”で検索してもよいのかも。
下森です。
postfixの設定というより動いてるプロセスのユーザーの環境設定によるんじゃないですかね? postfixってユーザーがあるのかどうかも知らないですけど。
On Sun, 29 Nov 2020 06:50:45 +0900 Tomoo Nomura nomurat@tmo.co.jp wrote:
結論、postfixがrelayで受け取ったメールはutf-8となり、直接発するメールは ansiとなるようです。postfixの設定になにかありそうです。いずれにしろ、 LC_ALL=en_US.UTF-8をいれればどちらもutf-8になるようです。 postfixを調べてみます。
mailコマンド(bas-mailx)がContent-Typeヘッダを追加しているか、について。 mailコマンドは一時ファイル /tmp/R* を作成しているので、次のようにすれば 確認できそうです。
$ echo abcd | env LC_ALL=ja_JP.UTF-8 strace -s 255 -e trace=write mail -s hoge foobar@example.com write(3, "abcd\n", 5) = 5 write(4, "To: foobar@example.com\nSubject: hoge\nMIME-Version: 1.0\nContent-Type: text/plain; charset="UTF-8"\nContent-Transfer-Encoding: 8bit\n\nabcd\n", 135) = 135 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=675303, si_uid=121, si_status=0, si_utime=0, si_stime=0} --- +++ exited with 0 +++ $
さらに、私の環境で LC_ALL=en_US.UTF-8 で試したところ、
write(4, "To: foobar@example.com\nSubject: hoge\nMIME-Version: 1.0\nContent-Type: text/plain; charset="ANSI_X3.4-1968"\nContent-Transfer-Encoding: 8bit\n\nabcd\n", 144) = 144
となりました。これ、ロケールの設定によるようです。
$ locale -a C C.UTF-8 POSIX ja_JP.utf8 $
/etc/locale.genを編集してen_US.UTF-8を有効にし、“locale-gen”を 実行したあとに再度上記のmailコマンドを実行したところ、
write(4, "To: foobar@example.com\nSubject: hoge\nMIME-Version: 1.0\nContent-Type: text/plain; charset="UTF-8"\nContent-Transfer-Encoding: 8bit\n\nabcd\n", 135) = 135
になりました。
ソースコードをみてみました。Content-Typeを扱うのはパッチ部分のみ? https://salsa.debian.org/debian/bsd-mailx/-/blob/master/debian/patches/33-Ad...
+ const char* const cs = nl_langinfo(CODESET); + ADDHEADER("MIME-Version", "1.0"); + ADDHEADER("Content-Type", "text/plain; charset="%s"", + cs && *cs ? cs : "ANSI_X3.4-1968"); + ADDHEADER("Content-Transfer-Encoding", "8bit");
不明なロケールのときに ANSI_X3.4-1968 を付けるようです。