CakePHP 3 でメール本文にプログラムで改行を挿入する方法
開発者は、メール本文の各行が 1,000 バイトを超えないように注意する必要があります。 そうでないと、文字化けしたテキストが送信される可能性があります。 これについては、RFC 5321 と RFC 5322 で言及されています。
RFC Specification
RFC 5321 4.5.3.1.6. Text Line
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 2.1.1. Line Length Limits
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 [RFC5321]) 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
メソッドをオーバーライドして、メール本文の各行に改行を挿入するコードを記述できます。
この投稿ではこれについては詳細に触れませんので、 Transport
機能の使用方法については公式ドキュメントをご参照ください。
特定の文字数で改行を挿入するには、マルチバイト文字を処理するために設計された Cake\Utility\Text::wordWrap
を使用できます。
第四引数を true に設定すると、単語の途中でも改行が挿入されます。
$message = 'hogefuga';
$result = Text::wordWrap($message, 4, "\n", true);
// Result: "hoge\nfuga"
まとめ
メール送信機能を実装する時は、各行が 1,000 バイトを超えないように意識しておく必要があります。
この投稿が、お役に立てば幸いです。