Надійно чисте кодування основного повідомлення електронної пошти

Я пишу невеликий шматок програмного забезпечення на php, який підключається до скриньки електронної пошти IMAP і зберігає повідомлення, що містяться в ньому, у базі даних MySQL для подальшої обробки та іншої користі.

Я помітив, що під час тестування я отримую деякі дивні символи, що з'являються в тілі повідомлення, коли я намагаюся зберегти тіло повідомлення необробленим. Я використовую imap_fetchbody () для вилучення тіла повідомлення.

Я помітив, що коли я використовую quo_printable_decode () для очищення тіла повідомлення, це допомагає! Однак, проводячи багато досліджень, я також дізнався, що це не завжди допоможе, і що для очищення тіла повідомлення натомість слід використовувати інші методи, такі як utf8_encode () та base64_decode ().

Отже, моє запитання: який найкращий спосіб надійно очистити тіло повідомлення електронної пошти за допомогою php, щоб охопити всі сценарії кодування?

надійно

1 відповідь 1

В наш час "тіло електронної пошти" насправді є деревом окремих частин MIME. Іноді є лише одна з них, напр. текст/звичайна пошта. Іноді існує багаточастинна/альтернативна версія, яка обгортає всередині неї дві "еквівалентні" копії повідомлення, одну як text/plain, а іншу як text/html. Іноді структура набагато складніша, з багатьма рівнями гніздування. Досить часто деякі з цих частин насправді є двійковим вмістом, наприклад зображення, прикріплені ZIP-файли, а що ні.

Кожна з цих окремих частин MIME може бути закодована для транспортування; вони вказані в заголовку Content-Transfer-Encoding відповідної частини MIME. Дві схеми кодування, які ви обов’язково повинні підтримувати для взаємодії, наводяться у цитатах та base64. Важливим зауваженням є те, що це кодування відбувається окремо для кожної частини, тобто цілком законно мати багаточастину/альтернативу з текстом/звичайним кодуванням із цитуванням, що друкується, а іншу частину, текстом/html, закодованим в base64 .

Коли ви розшифрували це кодування передачі, вам все одно доведеться декодувати текст із кодування його символів в Unicode, тобто перетворити потік байтів в текст Unicode. Вам потрібно проконсультуватися з параметром кодування заголовка Content-Type MIME (знову ж, заголовком частини, а не заголовком цілого повідомлення, якщо саме повідомлення не має лише однієї частини).

Всі подробиці, які вам потрібно знати, містяться у RFC 2045, RFC 2046, RFC 2047 та RFC 2048 (та їх відповідні оновлення).

Нарешті, є також цікаве питання про те, що є "основною частиною" електронного листа. Припустимо, у вас є щось подібне: