Scribble at 2020-12-08 09:16:57 Last modified: 2020-12-08 09:24:11

Thunderbird 38.0.1では、本文の文字エンコーディングの設定に関係なく、SubjectなどのヘッダーはUTF-8で処理されるようになりました。

Thunderbird 38.0.1 文字コード

PHP でメールを送信するときに mail() 関数を使うか mb_send_mail() を使うかという選択には、昔から幾つかの流儀があるらしく、オンラインでプロだろうとアマチュアだろうとバラバラなアドバイスを書いていることが分かる。これは PHP を実務で使い始めてから15年以上になる僕の見立てだ(英語では "I've observed..." と言えばいいが、日本語だと「僕が観察してきた限りでは~」という昆虫学者みたいなニュアンスがあるため、敢えてこう書いている。「経験則」とか「結果」と書くと、少し強すぎる)。

結局、こういうことが起きる理由は明らかだ。誰もが限られた経験の中でしかプログラミングしたり設計していないため、どういう条件で mail() / mb_send_mail() 関数をどう使えば良いか、そしてどういう条件で mail() / mb_send_mail() 関数を使ったら失敗したのかという経験が限られているからである。経験したことのない、あるいは想定したこともない条件でどうなるのかは、それぞれの関数の内部処理を処理系のソースコードというレベルで把握し、なおかつメールに関する RFC なり MTA それぞれの挙動なりを把握していない限り、いやそれどころかメール・クライアントの特徴も常にフォロー・アップしていなければ、exhaustive かつ comprehensive であるがゆえに decisive な結論というものは出せない。

現在、大半のメール・クライアントやウェブ・メールのサービスでは utf-8 のエンコーディングをサポートしているため、過去に比べたらメールの送信は非常に楽になった。もともとは iso-2022-jp でエンコーディングせよというアドバイスが大半を占めていたが、いっときから複雑なアドバイスが増えてしまったのだが、メールを本文でも件名でも utf-8 でエンコーディングするようになって、それも終息しつつある。そういう複雑さの原因は幾つかあったのだが、最も技術者を困惑させた下らない(しかし影響が大きい)理由は、Thunderbird というメール・クライアントが subject を UNICODE でしか正常に扱わない(つまり本文のエンコーディングを無視する)という仕様を何年も公に告知もせず放置してきたことにあった。そのため、iso-2022-jp で全てのデータをエンコーディングしたメールを 7bit ヘッダーで正しく送信しても、受信側の Thunderbird では件名だけが化けるという現象が起きて、奇妙なことに本文は iso-2022-jp でエンコーディングして、subject だけは utf-8 でエンコーディングしたメールを送るという異常なアドバイスが出てくるようになった。

  1. もっと新しいノート <<
  2. >> もっと古いノート

冒頭に戻る


※ 以下の SNS 共有ボタンは JavaScript を使っておらず、ボタンを押すまでは SNS サイトと全く通信しません。

Twitter Facebook