обходной путь для ограничения 990 символов для почтовых серверов электронной почты

Хотел узнать, есть ли какие-либо функции/классы/и т. д., чтобы помочь с ограничением в 990 символов для электронной почты, так как мой HTML-код действует из-за этого.

Проблема: (Источник)

Обратите внимание, что почтовые серверы имеют ограничение в 990 символов на каждую строку, содержащуюся в сообщении электронной почты. Если отправлено сообщение электронной почты, содержащее строки длиннее 990 символов, эти строки будут разделены дополнительными символами конца строки, что может привести к повреждению сообщения электронной почты, особенно для содержимого HTML. Чтобы этого не произошло, добавьте свои собственные символы окончания строки в соответствующие места в сообщении электронной почты, чтобы строки не превышали 990 символов.

Кажется, у кого-нибудь еще есть эта проблема? и как ты это исправил?

Похоже, мне нужно найти хорошее место, чтобы разделить мой HTML и вручную добавить разрыв строки, тьфу...

ОБНОВИТЬ:

Это табличные данные со многими строками. Так мне нужно где-то добавить \n или <br />?

ОБНОВЛЕНИЕ № 2: добавление кода типа MIME

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1\r\n";
$headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; // added this, but still no results
$headers .= "From: [email protected]\r\n";

Вот как я вызываю функцию (ы):

Как я изначально звонил:

return $html;

Что я пробовал:

return imap_8bit($html); // not working, nothing is captured in the error log

И

return imap_binary($html); // not working, nothing is captured in the error log

ОБНОВЛЕНИЕ №3 (добавление функции почты)

try {
    mail(
        '[email protected]',
        'Subject of Email',
        $html,
        $headers
        );
    } catch (Exception $e) {
        echo ("ERROR: Email NOT sent, Exception: ".$e->getMessage());
    }

Пример HTML (это сообщение электронной почты в формате HTML) (это также относится к классу, который является частью службы XMLRPC)

private function getHTML() {
    $html  = '<html><head><title>Title</title></head><body>';
    $html .= '<table>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '<tr><td>many many rows like this</td></tr>';
    $html .= '</table>';
    $html .= '</body>';
    $html .= '</html>';

    return $html;
    //return imap_8bit($html); // not working, nothing is captured in the error log
    //return imap_binary($html); // not working, nothing is captured in the error log
    // Both of these return the XMLRPC Fault Exception: 651 Failed to parse response
}

Исключение ошибки: 651 Не удалось проанализировать ответ, в основном не нравится формат или способ возврата данных.


person Phill Pafford    schedule 19.01.2011    source источник
comment
Могу я спросить, что вы делаете в HTML, где не может быть разрыва строки? Вы можете разделить промежуточный тег между атрибутами и не повлияете на разметку.   -  person Brad Christie    schedule 19.01.2011
comment
так что я предполагаю, что мой вопрос заключается в том, нужно ли мне вводить разрыв строки следующим образом: \n или с работой HTML ‹br /›? Также я хотел поддерживать проверку HTML W3C настолько, насколько это возможно.   -  person Phill Pafford    schedule 19.01.2011
comment
Вам не нужно беспокоиться о HTML, если вы правильно используете функции, которые я упомянул в своем ответе.   -  person Alix Axel    schedule 19.01.2011
comment
это не имеет ничего общего с вашими разрывами HTML. <br/> здесь не при чем. Решение состоит в том, чтобы кодировать base64, но если вы не хотите этого делать, подойдет простой \r\n.   -  person Brad    schedule 19.01.2011


Ответы (3)


Вы можете разместить свой контент с помощью функции wordwrap(), чтобы вам не приходилось вручную вставлять новые строки.

Рассматривали ли вы возможность использования одной из множества доступных почтовых библиотек? PHPMailer, PEAR Mail, SwiftMailer и т. д.?

person jasonbar    schedule 19.01.2011
comment
разве wordwrap() не добавит сами символы в просматриваемый html? Данные находятся в таблице с несколькими строками данных, я не уверен, что добавление новой строки или ‹br /› вызовет какие-либо проблемы с отображением того, как форматируются данные. - person Phill Pafford; 19.01.2011
comment
@Phill Pafford, если он не использует теги <pre>, используя wordwrap() для переноса текста, это не повлияет на отображение. Это то, что мы делаем в ESP, в котором я работаю, и так же поступают почтовые библиотеки. - person jasonbar; 19.01.2011
comment
Я думаю, что wordwrap() действительно может работать, сейчас тестирую. Кстати, какое действие по умолчанию, если вы просто используете wordwrap($html); без пармов? Похоже, что строка разделена только на пробелы (это то, что я хотел бы и тестирую прямо сейчас), просто хотел подтвердить - person Phill Pafford; 19.01.2011
comment
@Phill Pafford, правильно, wordwrap($html) просто вставит \n в строку через каждые 75 символов (или меньше, в зависимости от разрывов слов). Слова не будут разбиваться. - person jasonbar; 19.01.2011
comment
Я думаю, что это правильный ответ. Я получал пробелы после 990 символов в электронных письмах, отправленных через функцию php mail(). Я добавил следующий код (после этого ответа), и моя проблема исчезла: mail($to, $subject, wordwrap($message, 75, \n, true), wordwrap($headers, 75, \n, true)) - person SG1; 19.02.2012

Серверы заказов имеют еще более низкий лимит: 76 символов в строке + \r\n.

Вы должны использовать imap_8bit() и imap_binary() для преобразования ваших данных в base64 или кодировка quoted-printable.

Вы также можете использовать существующую библиотеку, например SwiftMailer.

person Alix Axel    schedule 19.01.2011
comment
Я запускаю это в службе XMLRPC, и сбой imap_8bit() и imap_binary(). использование: возврат imap_8bit($html); вместо возврата $html; (то же самое для imap_binary()). Я использую это право? и SwiftMailer сейчас не вариант, так как для его установки на производственный сервер потребуется пройти процесс утверждения. - person Phill Pafford; 19.01.2011
comment
@Phill Pafford: Вы должны соответствующим образом установить заголовки пантомимы, я не могу сказать вам, правильно ли это, не взглянув на ваш код. Рассматривали ли вы возможность использования SwiftMailer или любой другой библиотеки электронной почты, такой как PHPMailer? - person Alix Axel; 19.01.2011
comment
@Phill: Попробуйте добавить этот дополнительный заголовок: Content-Transfer-Encoding: quoted-printable. - person Alix Axel; 19.01.2011
comment
обновил мой заголовок, чтобы добавить код (см. основной вопрос), все еще не повезло - person Phill Pafford; 19.01.2011
comment
@Phill: Хорошо, тогда мне нужно больше информации. Что значит разбился? Как вы отправляете электронное письмо — используя встроенную функцию mail()? - person Alix Axel; 19.01.2011
comment
@Phill Pafford: Помогите мне помочь вам, добавьте полезный контекст к вопросу. Где ты делаешь return $html;? И что ты имел в виду под словом разбился? Любой вывод ошибки? - person Alix Axel; 19.01.2011
comment
хорошо, я добавил больше к основному вопросу, XMLRPC не предлагает много кодов ошибок, и в журнале ошибок Apache также ничего не отображается. - person Phill Pafford; 19.01.2011
comment
@Phill Pafford: Итак, проблема в том, как экранировать символы в XML, я не уверен, как это сделать правильно. Что произойдет, если вы base64_encode() свой $html? Кроме того, вы можете опубликовать новый вопрос об экранировании XML, поскольку это не имеет ничего общего с протоколом электронной почты SMTP. - person Alix Axel; 19.01.2011

На самом деле это не проблема "почтового сервера". Ограничение строки SMTP определяет количество символов, разрешенных в каждой строке во время передачи. SMTP RFC допускает использование до 1000 символов в строке, а ограничение постфикса по умолчанию составляет 998 символов. Вам следует обратиться к своему хостинг-провайдеру по поводу увеличения лимита линии SMTP, если вы считаете необходимым превысить RFC.

person GuestSysAdmin    schedule 10.02.2015