Статьи

UTF-8 Электронная почта на PHP с компонентами eZ

Одной из тем, которые я рассмотрел на прошлой неделе, было то, как вы работаете с UTF-8 в электронной почте, потому что у меня нет полной картины о том, как решить эту проблему. Фундаментальная проблема вкратце изложена в обсуждении MIME в Википедии;

Основной протокол передачи электронной почты через Интернет, SMTP, поддерживает только 7-битные символы ASCII […]. Это эффективно ограничивает электронную почту в Интернете сообщениями, которые при передаче содержат только символы, достаточные для написания небольшого числа языков, прежде всего английского. Другие языки, основанные на латинском алфавите, обычно включают диакритические знаки, не поддерживаемые в 7-битном ASCII, что означает, что текст на этих языках не может быть корректно представлен в базовой электронной почте.

Отчасти проблема заключается в том, что существуют разные подходы к решению этой проблемы. Вы отправляете необработанное текстовое тело UTF-8, закодированное как печатаемое в кавычках или Base64 ? Или вы могли бы преобразовать его в UTF-7 ? Или было бы проще отправить текст в виде HTML и использовать html-сущности для всего, что не является ASCII? Ограничивает ли это количество клиентов, которые могут читать почту? Как насчет кодирования заголовков, таких как имена субъектов или отправителей / получателей (как в iconv_mime_encode () )? Есть много ошибок и явно больше, чем вы получаете по умолчанию с помощью почтовой функции PHP (это после того, как вы исправили свой код для внедрения электронной почты ). Другими словами, выбор « не изобретен здесь » вызовет у вас большую нагрузку.

Как бы то ни было, Дерикс видел беседу о компонентах eZ на PHP в Лондоне, поэтому предложил людям взглянуть на классы Mail на выступлении на прошлой неделе .

Из просмотра источника (напомнившего в блоге Джад Мади, что нужно посмотреть), есть хорошая новость в том, что в системах eZ эта проблема хорошо решена. Класс ezcMail и связанные с ним классы по умолчанию (предполагают) ASCII, но вы можете явно указать ему использовать UTF-8 (примечание iconv требуется) для темы, получателя, отправителя и тела. На самом деле это очень впечатляющая почтовая библиотека, которая обрабатывает и обрабатывает многокомпонентные сообщения и все такое.

Похоже, вам все еще нужно знать, как обрабатывать текст сообщения (что оставляет некоторые открытые вопросы относительно наилучшего подхода), но заголовки автоматически закодированы для вас. Если я правильно понял ezcMail, следующий (непроверенный) пример должен проиллюстрировать это, позволяя обрабатывать его MTA, которые не являются 8-битными ;


<?php

// ...

$mail = new ezcMail();

// There are automatically encoded using iconv_mime_encode
$mail->from = new ezcMailAddress( '[email protected]', 'Hans Gräser', 'UTF-8' );
$mail->addTo( new ezcMailAddress( '[email protected]', 'Werner Dröge-Modelmog', 'UTF-8' ) );

$mail->subject = 'Ich bin spät...';

// Flag as UTF-8 - will also be automatically encoded with iconv_mime_encode
$mail->subjectCharset = 'UTF-8';

// Encode the UTF-8 as base64 for 7 bit MTAs
$mail->body = new ezcMailText(
    base64_encode('...noch 30 minuten bis Zürich'), 'UTF-8', ezcMail::BASE64
    );

// Send the mail
$transport = new ezcMailMtaTransport();
$transport->send( $mail );

В противном случае, общий вопрос, который Патрис поднял на собрании на прошлой неделе, и мне также было бы интересно услышать мнения по поводу: насколько 7-битное ограничение SMTP все еще остается проблемой сегодня? 8BITMIME теперь так широко используется, что мы можем перестать беспокоиться об этом?