メール本文から消えたピリオドの謎
単純ではない Simple Mail Transfer Protocol
問題の発生
- ある顧客に送ったメール本文からピリオドが消えたという報告を受けた。
- 同じメールを別の顧客に送ったときは、ピリオドは消えなかった。
プロジェクトの振り返り
- 約7年前、文書テンプレートを単一システムに統合するソリューションを開発した。
- クライアントは Microsoft Word テンプレートを使い、文書内にプレースホルダーを入れていた。
- スタッフがメールで文書を送るたびに、プレースホルダーを実際の内容に置き換える必要があった。
テンプレート管理の問題
- テンプレートのバージョンが複数存在し、管理が難しかった。
- 一部のテンプレートでは古い利用規約、ロゴ、フォントなどが使われていた。
- すべてのテンプレートを中央で管理できるソリューションを開発した。
ソリューションの実装
- クライアントは PDF 文書、テキストメッセージ、メール本文を生成するテンプレートを中央で管理できた。
- たとえば、新規顧客に送るウェルカムレターのテンプレートを設定できた。
- 各配信方法(メール、テキストメッセージ、郵便)ごとに異なるテンプレートを構成できた。
問題の再現
- 特定の顧客に送ったメールでのみ、ピリオドが消える問題が発生した。
- テンプレートのソースコードにはピリオドが含まれていた。
- ローカル環境でメール本文をプレビューしたときは、ピリオドが表示されていた。
原因の分析
- メール本文を生成する際、各行の長さを制限するコードがあった。
- 行がその長さを超えると、新しい行を作成して残りの内容を移動していた。
- SMTP 仕様では、行がピリオドで始まる場合は追加のピリオドを挿入し、サーバーは先頭のピリオドを削除する。
解決策
- コードを修正し、行がピリオドで始まる場合は追加のピリオドを挿入して、サーバーが削除してもピリオドが残るようにした。
- 修正したコードをテストした結果、ピリオドが消えないことを確認した。
- 問題を解決し、ほかのチームにもこのバグを知らせた。
その後の問題
- 数か月後、別のチームが同じバグを修正していなかったため、重要なメールでピリオドが消えた。
- 一部の顧客には、新しい月額料金が $27.00 ではなく $2700 と表示されたメールが送られた。
- すぐにコードをパッチし、問題を解決した。
GN⁺の意見
- SMTP 仕様を理解する重要性: メール送信時に起こりうる問題を解決するには、SMTP 仕様を深く理解することが重要。
- テンプレート管理の複雑さ: 複数バージョンのテンプレート管理は複雑になりうるため、中央管理システムが必要。
- デバッグ技術: 問題を再現し、原因を分析するデバッグ技術が重要。
- チーム間コミュニケーション: 問題を解決した後は、ほかのチームと情報を共有することが重要。
- 自動テスト: このような問題を防ぐために、自動テストを導入するのが望ましい。
2件のコメント
タイトルの
periodをピリオドではなく期間として解釈したみたいですね(笑)Hacker News の意見
Hacker News コメントまとめ要約
SMTP クライアント実装の難しさ
ドイツの推薦状の話
cron ジョブと SMTP クライアント
2つの悪い習慣
ドットスタッフィングが必要
HTML MIME 添付ファイルの問題
最初の文字がドットの場合
バグ修正の通知
NNTP サーバー実装経験