QUOTED_PRINTABLE_ENCODEは、電子メールコンテンツまたは特定のMIMEエンコード形式を扱う際に一般的に使用されるPHP関数です。文字列を「引用された印刷可能な」形式にエンコードして、特に7ビットASCIIの互換性が必要な環境で、より安全に転送されるようにするために使用されます。ただし、実際に使用すると、多くの開発者は一般的な問題に遭遇します。エンコードされたコンテンツに混乱を引き起こし、混乱した形式、さらには電子メールコンテンツの解析に影響を与えます。
この記事では、 Quoted_printable_encodeエンコードと実用的なソリューションで、開発者がこの機能をより安定に使用できるようにする実用的なソリューションの新しいライン文字の混乱の理由を要約します。
QUOTED_PRINTABLE_ENCODEエンコードを使用した後、一部の開発者は次の問題に遭遇する可能性があります。
元の文字列の新しいライン位置が変更されます。
過剰=記号はNewlineの前に表示されます。
一部の電子メールクライアントが解決すると、ラインブレークまたはコンテンツが整列されます。
ソフトラインラッピングのために、長い線が自動的に挿入され、コンテンツ構造が破壊されます。
これらの問題のほとんどは、QUOTED_PRINTABLE_ENCODE関数内のエンコードルールとデフォルトの動作に起因します。
QUOTED_PRINTABLE_ENCODEは、RFC 2045標準のエンコード仕様に従います。その重要な機能には次のとおりです。
各ラインの最大長は76文字で、ソフトラインブレークがそれらを超えると自動的に挿入されます( = \ r \ n )。
非ASCII文字または特殊文字は、 = xxフォームに変換されます。
ラインブレークを扱う場合、元の文字列が標準\ r \ nの代わりに\ nまたは\ rを使用している場合、エンコード後に予期しないラインブレークが発生する可能性があります。
したがって、エンコードする前に\ r \ nに新しいラインを標準化することが非常に重要です。
ラインブレイクの混乱を避けるためのいくつかの実用的なヒントとヒントを次に示します。
エンコードする前に、すべての新しい文字は\ r \ nとして均一に処理されます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_line_endings</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$string</span></span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/\r\n|\r|\n/'</span></span><span>, </span><span><span class="hljs-string">"\r\n"</span></span><span>, </span><span><span class="hljs-variable">$string</span></span><span>);
}
</span><span><span class="hljs-variable">$original</span></span><span> = </span><span><span class="hljs-string">"これが最初の行です\nこれは2行目です\r\nこれは3行目です\rこれは4行目です"</span></span><span>;
</span><span><span class="hljs-variable">$normalized</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_line_endings</span></span><span>(</span><span><span class="hljs-variable">$original</span></span><span>);
</span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">quoted_printable_encode</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span></span>
これにより、ラインブレークフォーマットが一貫していることが保証され、エンコード後の不必要な休憩が回避されます。
各行の最大長は76文字であるため、元のテキストが長すぎる場合、ソフトラインブレークが自動的に追加されます。これは、いくつかのシナリオで予想される動作ではないかもしれません。
1つの方法は、コンテンツを手動でセグメント化するか、エンコード後にソフトラインブレークを処理することです。
<span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">quoted_printable_encode</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span><span><span class="hljs-comment">// ソフトラインブレークを交換します,1つの行にマージします(シーンに依存します)</span></span><span>
</span><span><span class="hljs-variable">$cleaned</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">"=\r\n"</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$encoded</span></span><span>);
</span></span>
注:このアプローチは、埋め込まれたテキスト転送など、ソフトラインブレークに依存していないが、Mimeがエンコードされたメールボディには適していないシナリオに適しています。
HTMLメッセージを処理するときに完全なHTMLコンテンツにquoted_printable_encodeを使用する場合、タグを分割したり、構造を破壊したりするのは簡単です。プレーンテキストパーツのみをエンコードするか、phpmailerなどのプロのメールライブラリを使用して処理することをお勧めします。
<span><span><span class="hljs-keyword">use</span></span><span> </span><span><span class="hljs-title">PHPMailer</span></span><span>\</span><span><span class="hljs-title">PHPMailer</span></span><span>\</span><span><span class="hljs-title">PHPMailer</span></span><span>;
</span><span><span class="hljs-variable">$mail</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title class_">PHPMailer</span></span><span>();
</span><span><span class="hljs-variable">$mail</span></span><span>-></span><span><span class="hljs-title function_ invoke__">isSMTP</span></span><span>();
</span><span><span class="hljs-comment">// ...</span></span><span>
</span><span><span class="hljs-variable">$mail</span></span><span>->CharSet = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
</span><span><span class="hljs-variable">$mail</span></span><span>->Encoding = </span><span><span class="hljs-string">'quoted-printable'</span></span><span>; </span><span><span class="hljs-comment">// エンコードを自動的に処理します</span></span><span>
</span></span>
PHPのIMAP_8bit関数は、引用符で囲まれた形式を生成することもできます。
<span><span><span class="hljs-variable">$encoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imap_8bit</span></span><span>(</span><span><span class="hljs-variable">$normalized</span></span><span>);
</span></span>
ただし、この機能はIMAP拡張に依存しており、サーバー環境がサポートするかどうかを確認する必要があります。
QUOTED_PRINTABLE_ENCODEは、電子メール処理とデータエンコーディングで広く使用されていますが、デフォルトの動作はラインブレークやその他の問題で混乱を引き起こす可能性があります。次のポイントは、エンコード中のトラブルを効果的に回避できます。
エンコーディング前の統一されたラインブレイク文字は\ r \ nです。
ソフトラインブレークの挿入メカニズムに注意してください。
シーン= \ r \ nに従って手動でクリーンアップするかどうかを決定します。
HTMLコンテンツをエンコードするように注意してください。
成熟したメールライブラリまたは代替機能を使用することを検討してください。
上記のスキルを習得した後、 quoted_printable_encodeを使用すると、より便利になります。エンコードコンテンツはより安定して信頼性が高くなります。