Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP8.2にバージョンアップしたら文字化けが発生して道頓堀に飛び込みたくなった話

藤掛治
February 18, 2024

 PHP8.2にバージョンアップしたら文字化けが発生して道頓堀に飛び込みたくなった話

皆さんはリリース後に文字化けが発生して、道頓堀に飛び込みたくなったことはありますか?
私はあります(※)。

PHP8.2の下位互換性のない修正の1つにmb_detect_encodingの文字コード検出の仕様変更があります。

私が担当しているメール共有サービスのメールディーラーでバージョンアップ後に、一部の受信メールが文字化けをしました。

受信したメールのエンコード時にmb_detect_encodingを使っていたからです。

下位互換性がないため文字化けを回避することができず、結果的にメールヘッダに文字コードの指定がないRFCに準拠していないメールまで対応しました。

メールディーラーの保守運用・顧客対応チームのリーダである私が顧客対応で泣きをみたことを中心にお話いたします。

私と同様に顧客対応されているエンジニアの方々の参考になれば幸いです。

※実際には飛び込んでいません

藤掛治

February 18, 2024
Tweet

More Decks by 藤掛治

Other Decks in Programming

Transcript

  1. 2 自己紹介 • 株式会社ラクス ◦ 2014年3月入社 ◦ メールディーラーの運用・サポートエンジニア • 吹田市在住

    • 家族は妻と中2男子 • 趣味はサッカー ◦ ボランチ ◦ ガンバ大阪のガチサポーター 藤掛治(ふじかけおさむ)
  2. メールディーラー 開発課 6 メールディーラー開発チームの構成 運用サポート チーム 実装チーム ・実装 ・オフショア対応 ・問合わせ対応

    ・運用の課題解決 上流チーム ・要件定義 CSチーム ・問合わせ1次対応 ・顧客支援 製品企画
  3. 7 メールディーラーのご紹介 • メール共有管理サービス ◦ メールの処理を複数人で対応可能にするWebメーラー ◦ 主に企業の問い合せの対応と管理に利用されています ▪ 対応漏れや重複対応を防止する

    ▪ 問い合せに起因するアクションの管理 • メール共有管理システム市場における売上シェアNo1(※) • 累計導入社数8000社以上 ※出典:ITR「ITR Market View:メール/Webマーケティング市場2023」メール 処理市場:ベンダー別売上金額推移およびシェア2009-2022年度(予測値)
  4. 9 いろんなことの一例 1. サーバが差し押さえられそうになる ◦ あるお客様が警察の捜査対象になり、その証拠集めのため ◦ サーバは勘弁してもらい、メールデータを引っこ抜いて提出 ◦ 人生で初めて捜査令状を見る。多分コレが最後。

    2. 嫌がらせのメールを大量に受信し、ハードディスクが枯渇しそうになる ◦ 「このままだと日曜日にディスクが枯渇します!!」 3. スパムメールを受信するのは日常茶飯事 ◦ Fromがない、フィッシングメール、文字化けしたメール などなど、いろんなことが起こります
  5. 12 ここでメールの構造の説明 メール ヘッダ(header) 本文(body) テキストパート Content-Type:text/plain; charset=”utf-8” ・ ・

    ・ HTMLパート Content-Type:text/html; charset=”utf-8” ・ ・ ・ メールは大きく2つにわかれている • ヘッダ(header) ◦ 属性情報(日付、件名など) ◦ 経由したサーバ などが記載 • 本文(body) ◦ メールの本文 ◦ テキストメール、HTMLメール、 添付ファイルなどいくつかに分か れている このフォーマットはRFCで規定されている
  6. 13 文字化けした原因 メール ヘッダ(header) 本文(body) テキストパート Content-Type:text/plain; charset=”utf-8” ・↑これがない ・

    ・ HTMLパート Content-Type:text/html; charset=”utf-8” ・↑これがない ・ ・ 文字コードの設定がない • 文字コードがわからないのにどう やって表示せよというのだ? • そもそもRFCに違反している でもお客様の話をよく聞くと・・・ • 昨日受信したメールは見える • 今日の受信から文字化けした つまりリリース前は文字化けはしてい なかった
  7. 15 文字化けした理由 メールディーラーの仕様で、文字コードの設定がない場合は・・・ ⚫ mb_detect_encodingを使って文字コードを検出 ⚫ 検出した文字コードでメールをエンコードして表示する PHPのバージョンアップでmb_detect_encodingの仕様が変わった • mb_detect_encoding(評価するデータ,

    エンコードリスト) ⚫ 8.0以前では引数のエンコードリストの前から順に評価して適切なものがあれば、そ れが採用された ⚫ 8.1以降は引数のエンコードリストをすべて評価して最も適切なものを採用する これにより、想定した文字コードを返さなくなり文字化けが発生!
  8. 16 コードの修正方法 $encodeList = [エンコードの配列] ← 1 for ($encodeList =>

    $encode) { if (mb_check_encoding(メールデータ, $encode) ← 2 ここでほぼ捕捉できるはず return $encode } mb_detect_encoding(メールデータ, $encodeList); ← 3 1. エンコードする文字コードの候補をリスト化 2. mb_check_encodingを使って上記1のリストでチェックする 3. 合致する文字コードがなかったらmb_detect_encodingを使ってリストに近い文 字コードを探す
  9. メールディーラー 開発課 実は開発中に開発チームは文字化けすることを知って いた 22 運用サポート チーム 実装チーム 上流チーム 報告漏れ

    CSチーム ヘルプディスク ・問い合わせ1次対応 ・顧客支援 説明しんどい 文字化けするこ とを知っていた 謝罪 「実はわかっていました」 なんて言えない。ゆえに板挟み