Використання бібліотеки MIME-Base64, Perl, Програмування, статті

Suhhinin A., Webscript.ru

Бібліотека MIME-Base64 включає в себе 2 модуля:

Перший – MIME :: Base64

служить для кодірванія / розкодування рядків в Base64 кодовані рядкизгідно специфікації RFC 2045 – MIME (Multipurpose Internet Mail Extensions). Цей метод полягає в тому, що всі символи кодуються в форму, абсолютно нечитабельним людиною.
Для кодування використовується підмножина з 65 символів US-ASCII ([A-Za-z0-9+/=]).наприклад, рядок виду

=?koi8-r?B?+sTSwdfT1NfVytTFIQ==?=

по-русски буде звучати як

Доброго дня!

Помітити треба, що закодований рядок починається після комбінації
?B? і закінчується ?=.У модулі дві функції:

Цією функцією виконується кодування даних. Перший аргумент – кодована стрічка,другий – ознака закінчення рядка (за замовчуванням – “\ n”). Возвращаемая кодована рядок розбивається на рядки не більш, ніж 76 символів,і закінчуються символом $ eol.
Якщо не хочете, щоб результат був розбитий на рядки, в якості другого аргументу передайте порожню рядок.
Якщо не хочете імпортувати процедури в простір імен, можна використовувати наступним чином:

use MIME::Base64 ();$ Test = "Привіт!";
$encoded = MIME::Base64::encode($test);
$decoded = MIME::Base64::decode($encoded);
print $test,"\n";
print $encoded, "\n";
print $decoded, "\n";

результат буде наступний:

Привіт!
j+CooqXiIQ==
Привіт!

після кодованої рядка йде порожній рядок, бо результат encode повертається з символом “\ n”;

Функція decode_base64 ($ str) розкодує раніше закодовану рядок.

Другий модуль – MIME :: QoutedPrint

призначений для кодування / розкодування Quoted-printable рядків (Американці люблятьпридумувати труднопереводімие терміни, по русски звучить як “обмежені роздільниками друковані рядки"Виглядає ця рядок так:

=FA=C4=D2=C1=D7=D3=D4=D7=D5=CA=D4=C5!

по-русски буде звучати як
Доброго дня!

Зауважимо, що, на відміну від Base64 знак оклику не закодований.Сей метод кодування представляє закодовану інформацію в обсязі, приблизно в трирази більше, ніж вихідний текст. Непечатиемие символи (Янкеси все, що не входить в їх алфавіт,обізвали непечатиемимі) представляються знаком “=” і за ним дві шесстнадцатірічние цифри.
У модулі дві функції:

  • encode_qp($str);Ця функція повертає закодовану рядок. Функція не замінює сиволов “\ n” на комбінацію CRLF.
  • decode_qp ($ str); Ця функція фозвращает розкодований рядок у вигляді чистого тексту.
    Прямий виклик функції проводиться так:

    use MIME::QuotedPrint ();
    $encoded = MIME::QuotedPrint::encode($decoded);
    $decoded = MIME::QuotedPrint::decode($encoded);
    

    Оскільки ці методи широко застосовуються в поштових програмах, і широко застосовуються обидва методи, потрібно знати, як змусити вашу Perl-програмурозрізняти ці рядки.Дуже часто кодуються поля “from”, “to”, “Subject” і тіло листи,особливо, якщо надсилається лист з OutlookExpress.

    Службові поля в заголовку позначаються наступним чином:
    from, to, subj: =?koi8-r?B?+sTSwdfT1NfVytTFIQ==?=

    • між =? і наступним ? йде тип кодової таблиці рядка-джерела.
    • B? означає Base-64 encoding, ?Q означає Quoted Printable encoding.

    Значить, для визначення типу рядка можна намалювати наступний код:

    # Такі складнощі з визначенням підрядка викликані тим,# Що вираз $ str = ~ "B \?" не дає потрібного результату# Під ActivePerl в Windows.
     	my $ind1 = index $str,"B?"; # Шукаємо ознака encoded-base64
    my $ind2 = index $str,"Q?"; # Шукаємо ознака encoded quoted-printable
    if ($ind1 > 0) {  # Якщо рядок encoded-base64
    ($b,$s) = split(/B\?/,$str); # Відрубуємо службову інформацію виду =? Koi8-r? B?
    ($st,$rest) = split(/\?=/,$s); # Відрубуємо закінчення рядка? =
    $result = decode_base64($st); # Отримуємо результат
    }
    if ($ind2 > 0) {  # Якщо рядок encoded quoted-printable
    ($b,$s) = split(/Q\?/,$str); # Відрубуємо службову інформацію виду =? Koi8-r? Q?
    ($st,$rest) = split(/\?=/,$s);  # Відрубуємо закінчення рядка? =
    $result = decode_qp($st); # Отримуємо результат
    }
    

    Власне, з закодованими полями в заголовку листа розібралися. Тепер на черзітіло листа.Щоб визначити вид кодування в тілі листа, нам потрібно сновапориться в header-е повідомлення.У заголовках кодованих листів повинна бути присутнім рядок типу:

    Content-Type: text/plain; charset="koi8-r"
    Content-Transfer-Encoding: quoted-printable
    

    У цих полях, визначається, в якому кодуванні початкове повідомлення (koi8-r, windows-1251, ….), і типMIME кодування (quoted-printable, base-64, 8bit, ….).Якщо MIME кодування 8bit, то робити нічого не треба, якщо інша, то читаємо повідомленняпорядково і раскодіруем його:

    # Приклад для quoted-printable;
    foreach $line(@message_body) {
    print decode_qp($line);
    }
    

    Рядки, що містять HTML код і рядки, набрані латинськими знаками (US / English) перекодуватися не будуть.
    Ось, власне, і все.
    У наборі бібліотек MIME є ще пакети

    • Lite-1, Lite-2 “полегшені” MIME кодери / декодери, за допомогою них можна створювати / читати багатосекційні MIME-encoded повідомлення (наприклад, вкладена картинка),
    • HTML для перетворення HTML листа в MIME-Lite формат,
    • Tools для розбору і створення MIME входжень,
    • ispMailGate для створення фільтрів на поштовому сервері з демоном sendmail.

    Щоб їх розбирати і описувати, потрібен десяток статей такого ж обсягу, як ця, а тому, дозвольте на цьому закінчити.

    Схожі статті:


    Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

    Коментарів поки що немає.

    Ваш отзыв

    Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

    *

    *