CakePHP 3 でメール本文に適切な改行を挿入する方法
はじめに
開発者は、メール本文の各行が 1000 バイト を超えないようにする必要があります。この制約は RFC 5321 および RFC 5322 に記載されており、この制約を遵守しないと文字化けが発生する可能性があります。
RFC の仕様
RFC 5321 のテキスト行制限
RFC 5321 セクション 4.5.3.1.6 では次のように述べられています。
The maximum total length of a text line including the
is 1000 octets (not counting the leading dot duplicated for transparency). This number may be increased by the use of SMTP Service Extensions.
RFC 5322 の行長制限
RFC 5322 セクション 2.1.1 では以下のように述べられています。
Each line of characters MUST be no more than 998 characters, and SHOULD be no more than 78 characters, excluding the CRLF.
…
However, there are so many implementations that (in compliance with the transport requirements of RFC 5321) do not accept messages containing more than 1000 characters including the CR and LF per line, it is important for implementations not to create such messages.
一部の実装ではこれらの制限を超える行を許容する場合もありますが、転送要件との互換性を確保するためにこれらの制限を遵守することが重要です。
解決方法:改行をプログラム的に挿入する
CakePHP 3 は AbstractTransport
クラスを通じてメール処理を簡素化します。このクラスを拡張して send
メソッドをオーバーライドし、行長の制約を強制するコードを実装できます。詳細は 公式 CakePHP ドキュメント をご参照ください。
改行をプログラム的に挿入するには、Cake\Utility\Text::wordWrap
メソッドを使用します。この関数はマルチバイト文字をサポートしており、文字数制限を指定して強制的に改行を挿入することが可能です。
コード例
use Cake\Utility\Text;
$message = 'hogefuga';
$result = Text::wordWrap($message, 4, "\n", true);
// 結果: "hoge\nfuga"
第 4 引数を true
に設定することで、単語の途中であっても改行を挿入し、RFC 標準に準拠します。
まとめ
CakePHP 3 でメール送信機能を実装する際は、メール本文の各行が RFC 5321 および RFC 5322 の標準に準拠していることを常に確認してください。これにより、メールクライアント間での互換性が保証され、文字化けを防ぐことができます。
Happy Coding! 🚀