quoted printable что это

quoted_printable_encode

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

quoted_printable_encode — Преобразует 8-битную строку с помощью метода quoted-printable

Описание

Возвращает строку, закодированную в формат quoted-printable в соответствии с разделом 6.7 » RFC2045.

Список параметров

Возвращаемые значения

Возвращает закодированную строку.

Смотрите также

User Contributed Notes 6 notes

Both PHP’s native implementation and the function of ericth at NOSPAM dot pennyworth dot com (below) contain an feature/error (usage for SMTP mismatch) which has been solved in my adjustment below.

The error causes a text containing period character(s), when passed through these functions, end up with encoded lines starting with a period character, the first period character on that line will be discarded when it is transported over SMTP.

Solution: add (another) leading ‘.’ to period characters which would end up as first character on a line when encoded.

See http://stackoverflow.com/a/13949483: «This is a dirty artifact of your transport layer. SMTP is the most probable culprit (see the call for caution in the mail function documentation) but there may be other low level mecanisms that behave similarly. For example if you tweaked the sendmail_path setting or use a buggy sendmail program you may experience similar woes.»

1) your linebreak is wrong

2) continuation of lines with no whitespace is broken

Источник

Quoted printable что это

Этот механизм предназначен для представления данных, в основном состоящих из байтов, соответствующих символам, имеющим изображение в символьном наборе ASCII. В результате данного кодирования все байты будут иметь такие значения, гарантированные от дальнейшей модификации почтовым транспортом. Если конвертируемые данные в основном представляют собой ASCII-текст, то конечная их форма остается узнаваемой и читаемой для человека. Тело, полностью состоящее из ASCII-символов, также может быть конвертироавано в Quoted-Printable, что гарантирует его содержимому целостность при прохождении через всякие шлюзы, в которых происходит языковая перекодировка символов или преобразование концов строк и т.д.

В Quoted-Printable байты должны быть представлены в соответствии со следующими правилами:

ПРАВИЛО #1: (обычное 8-битное представление). Каждый байт, кроме тех, которые используются для обозначения конца строки, может быть представлен с помощью двух шестнадцатеричных цифр, предваряемых знаком «=». При написании шестнадцатеричных цифр с A по F должны использоваться заглавные буквы. Кроме тех случаев, когда нижеследующие правила позволяют альтернативное кодирование, данное правило является обязательным.

ПРАВИЛО #2: (Буквенное представление). Байты с десятичным значением с 33 по 60 и с 62 по 126 МОГУТ быть представлены ASCII-символами, соответствующими этим значениям (с ‘!’ по ‘ ‘ по ‘

ПРАВИЛО #3: (Пробелы): Байты со значениями 9 и 32 МОГУТ быть представлены как ASCII-символы «Табуляция» и «Пробел», но НЕ ДОЛЖНЫ быть представлены так в конце строки. Везде, где они представлены соответствующими ASCII-символами, за ними должен следовать символ, имеющий графическое изображение (печатный символ). В конце же строки символы табуляции и пробела должны быть представлены в соответствии с правилом #1, так как некоторые почтовые транспорты могут убирать пробелы в конце строки.

ПРАВИЛО #4: (Конец строки): Конец строки в тексте письма должен быть представлен (в соответствии с RFC 822) последовательностью CRLF. Так как в каноническом представлении текста не требуется визуального отображения символов конца строки, в Quoted-Printable не используется видимых символов для обозначения конца строки. Для представления бинарных данных более предпочтительной является кодировка base64.

Необходимо заметить, что многие реализации почтовых программ могут кодировать по-своему. В частности, при представлении текста в системах, использующих другие соглашения по обозначению конца строки (отличные от CRLF). Такие реализации недопустимы, и генерация концов строки должна быть стандартизована везде, чтобы не требовалось распознавать, используется ли какое-либо альтернативное представление.

ПРАВИЛО #5: (Мягкий конец строки): В соответствии с Quoted-Printable длина строки не должна превышать 76 символов. В противном случае используется ‘мягкий’ перевод строки, представимый знаком равенства. Например, если исходная строка имела вид:

то в Quoted-Printable encoding он может быть представлена следующим образом:

Это обеспечивает механизм восстановления исходной длины строки пользовательским почтовым агентом.

Поскольку символ дефиса («-«) представляется в Quoted-Printable в обычном виде, особую осторожность нужно соблюдать при заключении тела в Quoted-Printable в многочастное письмо, чтобы удостовериться, что граница этого включения не проявляется нигде внутри этого включения (лучше всего выбрать обозначение границы в виде последовательности символов «=_», которая никогда не появляется в теле, закодированном в Quoted-Printable. См. определение многочастного письма далее.)

в соответствии с правилом #1.

Так как данные в quoted-printable являются строчно-ориентированными, можно ожидать, что представление концов строки в Quoted-Printable будет изменено почтовым транспортом таким же образом, как и обычный текст может измениться при пересылке по Internet-почте между системами с разными соглашениями по представлению концов строки. Если подобные изменения могут нарушить целостность данных, то имеет смысл пользоваться кодировкой base64, а не Quoted-Printable.

Вниманию создателей ПО: Если двоичные данные пересылаются в Quoted-Printable, то надо соблюдать осторожность при кодировании символов CR и LF. В частности, последовательность CRLF должна быть представлена как «=0D=0A», в противном случае, если CRLF означает конец строки, то она может быть неверно интерпретирована в платформах с другими соглашениями по концу строки.

Синтаксис данных в quoted-printable описывается следующим образом:

Приложение 4. Механизм конвертации Base64

Этот алгоритм разработан для представления произвольных последовательностей байтов в форму, читаемую для человека. Кодирующий и декодирующий алгоритмы очень просты, но закодированные данные примерно на 33% больше, чем не кодированные. этот метод идентичен тому, который используется в приложениях PEM (Privacy Enhanced Mail), описанной в RFC 1421 с одним отличием: base64 не приемлет встроенного «чистого» текста.

Base64 использует 65-символьный поднабор из US-ASCII, выделяя 6 бит на каждый печатный символ. (65-й символ «=» используется для обозначения функции спец. обработки).

Процесс кодирования преобразует 3 входных символа в виде 24-битной группы, обрабатывая их слева направо. Эти группы затем рассматриваются как 4 соединенные 6-битные группы, каждая из которых транслируется в одиночную цифру алфавита base64. При кодировании base64, входной поток байтов должен быть упорядочен старшими битами вперед.

Каждая 6-битная группа используется как индекс для массива 64-х печатных символов. Символ, на который указывает значение индекса, помещается в выходную строку. Эти символы выбраны так, чтобы быть универсально представимыми и исключают символы, имеющие специальное значение для SMTP-транспорта («.», CR, LF) и для синтаксиса вложенных тел MIME («-«).

Источник

Кодировка Quoted-Printable

Добрый день.
Использую Aspose.Email для получения входящих писем через ImapClient. Все хорошо, но часть писем приходят в кодировке Quoted-Printable и библиотека их не может распознать. Находит в инете несколько декодеров, но так же без успешно.
Приложил пример одного из писем.
Нашел онлайн декодер, который справился с шифрованием. Но не могу понять как можно раскодировать письмо программно.

Добавлено через 2 минуты
Вот текст файла

Content-Type: text/plain; charset=»koi8-r»
Content-Transfer-Encoding: quoted-printable
Delivered-To: anton_dobrydin@mail.ru
Return-path:
Authentication-Results: mxs.mail.ru; spf=pass (mx17.mail.ru: domain of help-s.ru designates
144.76.175.133 as permitted sender) smtp.mailfrom=webmaster@help-s.ru
smtp.helo=help-s.ru
Received-SPF: pass (mx17.mail.ru: domain of help-s.ru designates 144.76.175.133 as
permitted sender) client-ip=144.76.175.133;
envelope-from=webmaster@help-s.ru; helo=help-s.ru;
Received: from help-s.ru ([144.76.175.133]:45133) by mx17.mail.ru with esmtp
(envelope-from ) id 1dKdVx-00032P-5E for
anton_dobrydin@mail.ru; Tue, 13 Jun 2017 07:33:13 +0300
To: anton_dobrydin@mail.ru
Subject: =?windows-1251?B?aGVscC1zLnJ1IC0g7/Do4+vg+OXt6OUg6iDn4Org5/MguSA1MTEyMTIyIM/w6Orr4OTt4P8g8fLg8ujx8ujq4A==?=
X-PHP-Originating-Script: 500:tools.php
From: robots@help-s.ru
Reply-To: robots@help-s.ru
X-EVENT_NAME: COME_TO_ZAKAZ
X-MID: 84278022.71 (13.06.2017 07:22:51)
Message-Id:
Date: Tue, 13 Jun 2017 07:25:02 +0300 (MSK)
X-7FA49CB5: A9FCD207E66530D88AA50765F79006373C6C989874D5081ECFB931F3CA25 0F2426E476CCD9869EB1A97D441D8FF7050A2AA436226CE5DB9A20AF3D72 6B1109708AFFB15F59A6FCE5E7DDDDC251EA7DAB690DBCE64404DB64EF16 ED7C73410E2EDC6DB0B82859FA8140A5AABA2AD371193195499CA005F545 C09775C1D3CA48CF4964A708C60C975A62C0DB630611AE6CCF19DD082D76 33A0CB2BC3E503F5EF6C3195499CA005F54578DA827A17800CE74890415E FB06EE6843847C11F186F3C51F1B9B83E9B91ABB6CCF125D649525966728 EF9445E047E42000CF5874DE7BA7BD9CCCA9EDD067B1A6052E9E940221E8 4AD6D5ED66289B5278DA827A17800CE77504163C1D4734E34AD6D5ED6628 9B52647C4D45D821075AB289B51CCB092ABD8AA50765F79006379BF04B24 BEB7B2D5B3661434B16C20AC508DBCF57D525389A0CE4F2CABFC2051D4B1 CBACBD0457718C25CC9661502BD3E7DDDDC251EA7DAB1B59CA4C82EFA658 78F0DF4210788FE3B0AA1F0801165047CB5012B2E24CD356
X-DMARC-Policy: no
X-Mras: OK
X-Spam: undefined
MIME-Version: 1.0

=C3=87=C3=A4=C3=B0=C3=A0=C3=A2=C3=B1=C3=B2=C3=A2=C3=B3=C3=A9 =C3=B2=C3=A5 To=
xa45 =20
=C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=B7=C3=A8=C3=AA chilii =C3=AF=C3=B0=C3=A8=
=C3=A3=C3=AB=C3=A0=C3=B8=C3=A0=C3=A5=C3=B2 =C3=A2=C3=A0=C3=B1 =C3=AF=C3=AE=
=C3=B1=C3=AC=C3=AE=C3=B2=C3=B0=C3=A5=C3=B2=C3=BC =C3=A7=C3=A0=C3=AA=C3=A0=
=C3=A7 =C2=B9 5112122
=C3=B2=C3=A5=C3=AC=C3=A0 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=8F=C3=B0=
=C3=A8=C3=AA=C3=AB=C3=A0=C3=A4=C3=AD=C3=A0=C3=BF =C3=B1=C3=B2=C3=A0=C3=B2=
=C3=A8=C3=B1=C3=B2=C3=A8=C3=AA=C3=A0=20
=C3=8F=C3=B0=C3=A5=C3=A4=C3=AC=C3=A5=C3=B2: =20
=C3=84=C3=A8=C3=B1=C3=B6=C3=A8=C3=AF=C3=AB=C3=A8=C3=AD=C3=A0 : =C3=8C=C3=A0=
=C3=B2=C3=A5=C3=AC=C3=A0=C3=B2=C3=A8=C3=B7=C3=A5=C3=B1=C3=AA =C3=A8=C3=A5/=
=C3=92=C3=A5=C3=AE=C3=B0=C3=A8=C3=BF =C3=B1=C3=B2=C3=A0=C3=B2=C3=A8=C3=B1=
=C3=B2=C3=A8=C3=AA=C3=A8
=C3=82=C3=A8=C3=A4: =C3=8A=C3=AE=C3=AD=C3=B2=C3=B0=C3=AE=C3=AB=C3=BC=C3=AD=
=C3=A0=C3=BF
=C3=A4=C3=A0=C3=B2=C3=A0 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: 13=2E06=2E20=
17 07:22:34
=C3=B1=C3=B0=C3=AE=C3=AA =C3=A2=C3=BB=C3=AF=C3=AE=C3=AB=C3=AD=C3=A5=C3=AD=
=C3=A8=C3=BF =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: 15 =C3=A8=C3=BE=C3=AD=C3=
=BF
=C3=AA=C3=B0=C3=A0=C3=B2=C3=AA=C3=AE=C3=A5 =C3=AE=C3=AF=C3=A8=C3=B1=C3=A0=
=C3=AD=C3=A8=C3=A5 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=87=C3=A0=C3=A4=
=C3=A0=C3=B7=C3=A0 =C2=B9 1 (=C3=B1=C3=B2=C3=B0=2E111-112) =C3=A2=C3=A0=C3=
=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E =C3=87=C3=A0=C3=A4=C3=A0=C3=B7=
=C3=A8 =C2=B9 1, =C2=B9 2, =C2=B9 3 (=C3=B1=C3=B2=C3=B0=2E 113-118)=2E =C3=
=82 =C3=AD=C3=A8=C3=B5 =C3=A2=C3=AE =C3=A2=C3=B1=C3=A5=C3=B5 =C3=A4=C3=A5=
=C3=AB=C3=A0=C3=B2=C3=BC =C3=A2=C3=A0=C3=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 1=
1-20=2E N=3DV=3D3
=C3=AF=C3=AE=C3=AB=C3=AD=C3=AE=C3=A5 =C3=AE=C3=AF=C3=A8=C3=B1=C3=A0=C3=AD=
=C3=A8=C3=A5 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=87=C3=A0=C3=A4=C3=A0=
=C3=B7=C3=A0 =C2=B9 1 (=C3=B1=C3=B2=C3=B0=2E111-112) =C3=A2=C3=A0=C3=B0=C3=
=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E =C3=87=C3=A0=C3=A4=C3=A0=C3=B7=C3=A8 =
=C2=B9 1, =C2=B9 2, =C2=B9 3 (=C3=B1=C3=B2=C3=B0=2E 113-118)=2E =C3=82 =C3=
=AD=C3=A8=C3=B5 =C3=A2=C3=AE =C3=A2=C3=B1=C3=A5=C3=B5 =C3=A4=C3=A5=C3=AB=C3=
=A0=C3=B2=C3=BC =C3=A2=C3=A0=C3=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E N=
=3DV=3D3
=C3=93=C3=AD=C3=A8=C3=AA=C3=A0=C3=AB=C3=BC=C3=AD=C3=AE=C3=B1 =C3=B2=C3=BC: =
=C3=93=C3=AA=C3=A0=C3=A7=C3=BB=C3=A2=C3=A0=C3=A5=C3=B2=C3=B1 =C3=BF =C3=88=
=C3=B1=C3=AF=C3=AE=C3=AB=C3=AD=C3=A8=C3=B2=C3=A5=C3=AB=C3=A5 =C3=AC
=C3=84=C3=AE=C3=B0=C3=A0=C3=A1=C3=AE=C3=B2=C3=AA=C3=A8: =C3=8F=C3=AE =C3=A4=
=C3=AE=C3=A3=C3=AE=C3=A2=C3=AE=C3=B0=C3=A5=C3=AD=C3=AD=C3=AE =C3=B1=C3=B2=C3=
=A8
=C3=91=C3=B1=C3=BB=C3=AB=C3=AA=C3=A0:=20

=C3=8D=C3=A5 =C3=AE=C3=B2=C3=A2=C3=A5=C3=B7=C3=A0=C3=A9=C3=B2=C3=A5 =C3=AD=
=C3=A0 =C3=BD=C3=B2=C3=AE =C3=AF=C3=A8=C3=B1=C3=BC=C3=AC=C3=AE=2E

=C3=8A=C3=AE=C3=AD=C3=B1=C3=B3=C3=AB=C3=BC=C3=B2=C3=A0=C3=B6 =C3=A8=C3=A8 =
=C3=A8 =C3=B2=C3=A5=C3=B5=2E=C3=AF=C3=AE=C3=A4=C3=A4=C3=A5=C3=B0=C3 =A6=C3=
=AA=C3=A0 http://help-s=2Eru/support/

Добавлено через 1 минуту
Если на сайт https://2cyr.com/decode/?lang=ru
вставить только

=C3=87=C3=A4=C3=B0=C3=A0=C3=A2=C3=B1=C3=B2=C3=A2=C3=B3=C3=A9 =C3=B2=C3=A5 To=
xa45 =20
=C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=B7=C3=A8=C3=AA chilii =C3=AF=C3=B0=C3=A8=
=C3=A3=C3=AB=C3=A0=C3=B8=C3=A0=C3=A5=C3=B2 =C3=A2=C3=A0=C3=B1 =C3=AF=C3=AE=
=C3=B1=C3=AC=C3=AE=C3=B2=C3=B0=C3=A5=C3=B2=C3=BC =C3=A7=C3=A0=C3=AA=C3=A0=
=C3=A7 =C2=B9 5112122
=C3=B2=C3=A5=C3=AC=C3=A0 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=8F=C3=B0=
=C3=A8=C3=AA=C3=AB=C3=A0=C3=A4=C3=AD=C3=A0=C3=BF =C3=B1=C3=B2=C3=A0=C3=B2=
=C3=A8=C3=B1=C3=B2=C3=A8=C3=AA=C3=A0=20
=C3=8F=C3=B0=C3=A5=C3=A4=C3=AC=C3=A5=C3=B2: =20
=C3=84=C3=A8=C3=B1=C3=B6=C3=A8=C3=AF=C3=AB=C3=A8=C3=AD=C3=A0 : =C3=8C=C3=A0=
=C3=B2=C3=A5=C3=AC=C3=A0=C3=B2=C3=A8=C3=B7=C3=A5=C3=B1=C3=AA =C3=A8=C3=A5/=
=C3=92=C3=A5=C3=AE=C3=B0=C3=A8=C3=BF =C3=B1=C3=B2=C3=A0=C3=B2=C3=A8=C3=B1=
=C3=B2=C3=A8=C3=AA=C3=A8
=C3=82=C3=A8=C3=A4: =C3=8A=C3=AE=C3=AD=C3=B2=C3=B0=C3=AE=C3=AB=C3=BC=C3=AD=
=C3=A0=C3=BF
=C3=A4=C3=A0=C3=B2=C3=A0 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: 13=2E06=2E20=
17 07:22:34
=C3=B1=C3=B0=C3=AE=C3=AA =C3=A2=C3=BB=C3=AF=C3=AE=C3=AB=C3=AD=C3=A5=C3=AD=
=C3=A8=C3=BF =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: 15 =C3=A8=C3=BE=C3=AD=C3=
=BF
=C3=AA=C3=B0=C3=A0=C3=B2=C3=AA=C3=AE=C3=A5 =C3=AE=C3=AF=C3=A8=C3=B1=C3=A0=
=C3=AD=C3=A8=C3=A5 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=87=C3=A0=C3=A4=
=C3=A0=C3=B7=C3=A0 =C2=B9 1 (=C3=B1=C3=B2=C3=B0=2E111-112) =C3=A2=C3=A0=C3=
=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E =C3=87=C3=A0=C3=A4=C3=A0=C3=B7=
=C3=A8 =C2=B9 1, =C2=B9 2, =C2=B9 3 (=C3=B1=C3=B2=C3=B0=2E 113-118)=2E =C3=
=82 =C3=AD=C3=A8=C3=B5 =C3=A2=C3=AE =C3=A2=C3=B1=C3=A5=C3=B5 =C3=A4=C3=A5=
=C3=AB=C3=A0=C3=B2=C3=BC =C3=A2=C3=A0=C3=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 1=
1-20=2E N=3DV=3D3
=C3=AF=C3=AE=C3=AB=C3=AD=C3=AE=C3=A5 =C3=AE=C3=AF=C3=A8=C3=B1=C3=A0=C3=AD=
=C3=A8=C3=A5 =C3=A7=C3=A0=C3=AA=C3=A0=C3=A7=C3=A0: =C3=87=C3=A0=C3=A4=C3=A0=
=C3=B7=C3=A0 =C2=B9 1 (=C3=B1=C3=B2=C3=B0=2E111-112) =C3=A2=C3=A0=C3=B0=C3=
=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E =C3=87=C3=A0=C3=A4=C3=A0=C3=B7=C3=A8 =
=C2=B9 1, =C2=B9 2, =C2=B9 3 (=C3=B1=C3=B2=C3=B0=2E 113-118)=2E =C3=82 =C3=
=AD=C3=A8=C3=B5 =C3=A2=C3=AE =C3=A2=C3=B1=C3=A5=C3=B5 =C3=A4=C3=A5=C3=AB=C3=
=A0=C3=B2=C3=BC =C3=A2=C3=A0=C3=B0=C3=A8=C3=A0=C3=AD=C3=B2=C3=BB 11-20=2E N=
=3DV=3D3
=C3=93=C3=AD=C3=A8=C3=AA=C3=A0=C3=AB=C3=BC=C3=AD=C3=AE=C3=B1 =C3=B2=C3=BC: =
=C3=93=C3=AA=C3=A0=C3=A7=C3=BB=C3=A2=C3=A0=C3=A5=C3=B2=C3=B1 =C3=BF =C3=88=
=C3=B1=C3=AF=C3=AE=C3=AB=C3=AD=C3=A8=C3=B2=C3=A5=C3=AB=C3=A5 =C3=AC
=C3=84=C3=AE=C3=B0=C3=A0=C3=A1=C3=AE=C3=B2=C3=AA=C3=A8: =C3=8F=C3=AE =C3=A4=
=C3=AE=C3=A3=C3=AE=C3=A2=C3=AE=C3=B0=C3=A5=C3=AD=C3=AD=C3=AE =C3=B1=C3=B2=C3=
=A8
=C3=91=C3=B1=C3=BB=C3=AB=C3=AA=C3=A0:=20

=C3=8D=C3=A5 =C3=AE=C3=B2=C3=A2=C3=A5=C3=B7=C3=A0=C3=A9=C3=B2=C3=A5 =C3=AD=
=C3=A0 =C3=BD=C3=B2=C3=AE =C3=AF=C3=A8=C3=B1=C3=BC=C3=AC=C3=AE=2E

Источник

Quoted printable что это

Этот механизм предназначен для представления данных, в основном состоящих из байтов, соответствующих символам, имеющим изображение в символьном наборе ASCII. В результате данного кодирования все байты будут иметь такие значения, гарантированные от дальнейшей модификации почтовым транспортом. Если конвертируемые данные в основном представляют собой ASCII-текст, то конечная их форма остается узнаваемой и читаемой для человека. Тело, полностью состоящее из ASCII-символов, также может быть конвертироавано в Quoted-Printable, что гарантирует его содержимому целостность при прохождении через всякие шлюзы, в которых происходит языковая перекодировка символов или преобразование концов строк и т.д.

В Quoted-Printable байты должны быть представлены в соответствии со следующими правилами:

ПРАВИЛО #1: (обычное 8-битное представление). Каждый байт, кроме тех, которые используются для обозначения конца строки, может быть представлен с помощью двух шестнадцатеричных цифр, предваряемых знаком «=». При написании шестнадцатеричных цифр с A по F должны использоваться заглавные буквы. Кроме тех случаев, когда нижеследующие правила позволяют альтернативное кодирование, данное правило является обязательным.

ПРАВИЛО #2: (Буквенное представление). Байты с десятичным значением с 33 по 60 и с 62 по 126 МОГУТ быть представлены ASCII-символами, соответствующими этим значениям (с ‘!’ по ‘ ‘ по ‘

ПРАВИЛО #3: (Пробелы): Байты со значениями 9 и 32 МОГУТ быть представлены как ASCII-символы «Табуляция» и «Пробел», но НЕ ДОЛЖНЫ быть представлены так в конце строки. Везде, где они представлены соответствующими ASCII-символами, за ними должен следовать символ, имеющий графическое изображение (печатный символ). В конце же строки символы табуляции и пробела должны быть представлены в соответствии с правилом #1, так как некоторые почтовые транспорты могут убирать пробелы в конце строки.

ПРАВИЛО #4: (Конец строки): Конец строки в тексте письма должен быть представлен (в соответствии с RFC 822) последовательностью CRLF. Так как в каноническом представлении текста не требуется визуального отображения символов конца строки, в Quoted-Printable не используется видимых символов для обозначения конца строки. Для представления бинарных данных более предпочтительной является кодировка base64.

Необходимо заметить, что многие реализации почтовых программ могут кодировать по-своему. В частности, при представлении текста в системах, использующих другие соглашения по обозначению конца строки (отличные от CRLF). Такие реализации недопустимы, и генерация концов строки должна быть стандартизована везде, чтобы не требовалось распознавать, используется ли какое-либо альтернативное представление.

ПРАВИЛО #5: (Мягкий конец строки): В соответствии с Quoted-Printable длина строки не должна превышать 76 символов. В противном случае используется ‘мягкий’ перевод строки, представимый знаком равенства. Например, если исходная строка имела вид:

то в Quoted-Printable encoding он может быть представлена следующим образом:

Это обеспечивает механизм восстановления исходной длины строки пользовательским почтовым агентом.

Поскольку символ дефиса («-«) представляется в Quoted-Printable в обычном виде, особую осторожность нужно соблюдать при заключении тела в Quoted-Printable в многочастное письмо, чтобы удостовериться, что граница этого включения не проявляется нигде внутри этого включения (лучше всего выбрать обозначение границы в виде последовательности символов «=_», которая никогда не появляется в теле, закодированном в Quoted-Printable. См. определение многочастного письма далее.)

в соответствии с правилом #1.

Так как данные в quoted-printable являются строчно-ориентированными, можно ожидать, что представление концов строки в Quoted-Printable будет изменено почтовым транспортом таким же образом, как и обычный текст может измениться при пересылке по Internet-почте между системами с разными соглашениями по представлению концов строки. Если подобные изменения могут нарушить целостность данных, то имеет смысл пользоваться кодировкой base64, а не Quoted-Printable.

Вниманию создателей ПО: Если двоичные данные пересылаются в Quoted-Printable, то надо соблюдать осторожность при кодировании символов CR и LF. В частности, последовательность CRLF должна быть представлена как «=0D=0A», в противном случае, если CRLF означает конец строки, то она может быть неверно интерпретирована в платформах с другими соглашениями по концу строки.

Синтаксис данных в quoted-printable описывается следующим образом:

Приложение 4. Механизм конвертации Base64

Этот алгоритм разработан для представления произвольных последовательностей байтов в форму, читаемую для человека. Кодирующий и декодирующий алгоритмы очень просты, но закодированные данные примерно на 33% больше, чем не кодированные. этот метод идентичен тому, который используется в приложениях PEM (Privacy Enhanced Mail), описанной в RFC 1421 с одним отличием: base64 не приемлет встроенного «чистого» текста.

Base64 использует 65-символьный поднабор из US-ASCII, выделяя 6 бит на каждый печатный символ. (65-й символ «=» используется для обозначения функции спец. обработки).

Процесс кодирования преобразует 3 входных символа в виде 24-битной группы, обрабатывая их слева направо. Эти группы затем рассматриваются как 4 соединенные 6-битные группы, каждая из которых транслируется в одиночную цифру алфавита base64. При кодировании base64, входной поток байтов должен быть упорядочен старшими битами вперед.

Каждая 6-битная группа используется как индекс для массива 64-х печатных символов. Символ, на который указывает значение индекса, помещается в выходную строку. Эти символы выбраны так, чтобы быть универсально представимыми и исключают символы, имеющие специальное значение для SMTP-транспорта («.», CR, LF) и для синтаксиса вложенных тел MIME («-«).

Источник

quoted_printable_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

quoted_printable_decode — Convert a quoted-printable string to an 8 bit string

Description

This function returns an 8-bit binary string corresponding to the decoded quoted printable string (according to » RFC2045, section 6.7, not » RFC2821, section 4.5.2, so additional periods are not stripped from the beginning of line).

Parameters

Return Values

Returns the 8-bit binary string.

See Also

User Contributed Notes 21 notes

As soletan at toxa dot de reported, that function is very bad and does not provide valid enquoted printable strings. While using it I saw spam agents marking the emails as QP_EXCESS and sometimes the email client did not recognize the header at all; I really lost time :(. This is the new version (we use it in the Drake CMS core) that works seamlessly:

Taking a bunch of the earlier comments together, you can synthesize a nice short and reasonably efficient quoted_printable_encode function like this:

I use a hack for this bug:

$str = str_replace(«=\r\n», », quoted_printable_encode($str));
if (strlen($str) > 73)

I modified the below version of legolas558 at users dot sausafe dot net and added a wrapping option.

Please note that in the below encode function there is a bug!

so the correct code is

Some browser (netscape, for example)
send 8-bit quoted printable text like this:
=C5=DD=A3=D2=C1= =DA

«= =» means continuos word.
php function not detect this situations and translate in string like:
abcde=f

If you want a function to do the reverse of «quoted_printable_decode()», follow the link you will find the «quoted_printable_encode()» function:
http://www.memotoo.com/softs/public/PHP/quoted printable_encode.inc.php

my approach for quoted printable encode using the stream converting abilities

Be warned! The method below for encoding text does not work as requested by RFC1521!

Good QP-encoding takes a bit more than this.

If you do not have access to imap_* and do not want to use
�$message = chunk_split( base64_encode($message) );�
because you want to be able to read the �source� of your mails, you might want to try this:
(any suggestions very welcome!)

A small update for Andrew’s code below. This one leaves the original CRLF pairs intact (and allowing the preg_replace to work as intended):

If you’re getting black diamonds or weird characters that seemingly block an echo but still encounter strlen($string) > 0 you’re probably encountering an encoding issue. Unlike the people writing ENCODE functions on a DECODE page I will actually talk about DECODE on a DECODE page.

The specific problem I encountered was that an email was encoded using a Russian encoding (KOI8-R) though I output everything as UTF-8 because: compatibility.

If you try to do this with a Russian encoding:

echo quoted_printable_decode ( ‘=81’ );
?>

You’ll get that corrupted data.

I did a couple of tests and it turns out the following is how you nest the mb_convert_encoding function:

‘ ;
?>

Unfortunately I could not find a character mapping table or anything listed under RFC 2045 Section 6.7. However I came across the website https://dencode.com/en/string/quoted-printable which allows you to manually choose the encoding (it’s an open source site, they have a GIT repository for the morbidly curious).

As it turns out the start of the range is relative to the encoding. So Latin (ISO-8859-1) and Russian (KOI8-R) will likely (not tested this) encode to different characters **relative to the string encoding**.

If you’re really lazy and producing HTML anyways and the end, just convert it to HTML entities and move the Unicode/ISO struggling to the document’s encoding:

If there is a NULL byte in the string that is passed, quoted_printable_decode will crop everything after the NULL byte and the NULL byte itself.

Another (improved) version of quoted_printable_encode(). Please note the order of the array elements in str_replace().
I’ve just rewritten the previous function for better readability.

In Addition to david lionhead’s function:

My version of quoted_printable encode, as the convert.quoted-printable-encode filter breaks on outlook express. This one seems to work on express/outlook/thunderbird/gmail.

= This function enables you to convert text to a quoted-printable string as well as to create encoded-words used in email headers (see http://www.faqs.org/rfcs/rfc2047.html).

No line of returned text will be longer than specified. Encoded-words will not contain a newline character. Special characters are removed.
EOF;

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *