Возможно вы искали: 'Drake of the 99 Dragons'

May 15 2025 19:04:41
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96111483
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18357
• Обзор The Walking ... 18801
• Обзор DMC: Devil M... 19879
• Обзор на игру Valk... 15877
• Обзор на игру Stars! 17764
• Обзор на Far Cry 3 17948
• Обзор на Resident ... 16024
• Обзор на Chivalry:... 17508
• Обзор на игру Kerb... 17981
• Обзор игры 007: Fr... 16619
Превью о играх
• Превью к игре Comp... 17960
• Превью о игре Mage... 14464
• Превью Incredible ... 14721
• Превью Firefall 13479
• Превью Dead Space 3 16334
• Превью о игре SimC... 14730
• Превью к игре Fuse 15442
• Превью Red Orche... 15542
• Превью Gothic 3 16343
• Превью Black & W... 17354
Главная » Статьи » Разное » Альтернатива MIME::Parser и Email::Simple (mime mail perl parser)

Альтернатива MIME::Parser и Email::Simple (mime mail perl parser)

Ключевые слова: mime, mail, perl, parser, (найти похожие документы)

From: jkeks
Newsgroups: email
Date: Mon, 10 May 2004 14:31:37 +0000 (UTC)
Subject: Альтернатива MIME::Parser и Email::Simple

MIME переделки

задумывался кто-нибудь окгда-нибудь о том, зачем в MIME придумали сложные
структуры данных ?

--a

--b
--b--

--c
--c--

--a

--a--

(это чтобы вы имели представление о чем я говорю)

В одном из FAQ валяется такая мысль, что мол кантора Netscape сильно усложнила
жизнь, когда сделала возможным внедрение в пиьсма этого стандарта MIME
т.е. много частей в одном.

На самом деле проблемма не сильно изменилась с тех времен, и сейчас я еще не
встречал концептуально правильных программ подходящщих к разбору структуры
писем, а значит все программы предоставляют КОРЯВЫЙ интерфейс к сложным
письмам.

А ведь непростые структуры появляются всего лишь на этапе, когда мы к письму
прикрепим атач.
А среднестатическое сложное письмо - это две части текст и html. Если к ним
прибавить аттач, то задача разбора станет уже необычной.

Как подходит к делу MIME::Parser ?

В документации упомянуто, что это средство способно работать с любыми сложными
структурами, однако единоразовый разбор письма почему-то парсит только первый
уровень письма (на нашем примере в результате мы получим parts --a, при этом
первая часть --a будет содержать нераспарсенные части --c и --b.

Получается что нам нужно самому выяснять нужно ли парсить дальше.
Меня как разработчика правильно-концептуального ядра и как в дальнейшем
прикладного программиста использующего данное ядро - такой расклад никак не
устраивает.

Я хочу чтобы я просто вызвал функцию и чтобы я получил список содержимого
письма в виде объекта или в виде сложной структуры или чего-то еще, неважно
чего но откуда можно достать любые данные письма, не обращаясь рекурсивно
каждый раз к ядру как только обнаружу очередную нераспарсенную часть.

Модуль Email::Simple подошел к проблемме абсолютно аналогично, вот и
собственно все самые известные обработчики MIME. Email::Simple правда имеет те
приемущества, что код парсера принципиально минимален, в сравнении с коровьей
лепешкой MIME::Parser. Однако Первый не решил проблемму рекурсивного вызова, и
единой структуры для всех частей письма.

Можно сказать - ну и правильно, нам это и не надо, ведь письма приходят в
более менее оговоренных стандартах, а значит атачи можно легко вытащить зная
заранее структуру и обращаясь сразу к нужным частям.
Глубокий маразм - скажу я вам. Раз уж ввели универсальный стандарт, так и
нужная правильна универсальная обработка.

Сам я подумал что надо бы самому накидать какой-нибудь простецкий модуль,
который бы скаляр в структуру разводил без понтов лишних. А как ?
В голову пришел красивый алгоритм, красивая структура.

И я уже было начал писать, как вдруг напоролся на проблемму:
Нужно создавать сложную структуру сопоставимую со структурой письма.
Объектную модель Perl я не стал использовать потому что незнаю ее.
А все должно было быть завязано на сложных структурах.

К тому же слава богу сам я уже не раз писал переборщики сложных структур,
поэтому впринципе это не проблемма, но все таки код перебора структуры - дело
небыстрое, нужно что-то более красивое.
И опять же концептуально правильное.

И после часа мучительных размышлений в голову пришла прекрасная мысль о том,
что ведь по сути не так важна структура писем, как простой доступ к
содержимому.Решение всплало само собой.. вся структура письма должна
раскрываться в линейную структуру, доступ к каждой части письма возможен через
простой цикл, без использования рекурсии. А Если возникнет необходимость в
анализе все-таки самой структуры, то тут можно прибегнуть к анализу
последовательностей частей.

Эта идея была положена в основу универсального парсера MIME, который входит в
сосотав ret WebOS, и является принципиально свободным от модулей данного
проекта, как и все сотальные модули данного проекта независимы.
В совокупности с остальными модулями проект теперь принял еще одно направление
парсинг MIME.

Ну и плюсом является то что в результате работы функции обработки письма
создается одна сложная линейная структура, которая в дальнейшем может быть
полностью вся созранена как одна запись в базу данных СУБД ret WebOS, которая
ставит под собой один из важнейших и важных задач: хранение сложных структур
(структура любой сложности может быть записана как одна единственная запись в
блоговой модели ret баз.

Становиться смешно, когда посмотрев на модуль MIME::Parser
затем смотришь на следующий кусок кода, который я написал в несколько
присядов:

sub ParseEmail
{
($msg)=@_;
$#main_structure=-1;
$main_structure[0]='';
push @stack,$msg;
# start stack working
while (scalar @stack>0)
{
$msg_process=pop @stack;
$msg_process =~ /(.*?($crlf))2(.*)/sm;
$head=$1;
$body=$3;
for (split /$crlf/, $head)
{
if (/^([^:]+):s*(.*)/)
{
$pos=$#main_structure;
$main_structure[$pos]{$1}=$2;
}
}
# found boundary Easiest way to get boundary in fucked MIME
$head =~ /s*boundary="?([^s"]+)"?/sm;
$boundary=$1;

# has we a boundary ?
if (length $boundary>4 and length $boundary<40)
{
# separate body to parts to stack
$tempo=-1;
@tempo=split (/--$boundary/, $body);
my $o=$#tempo;
for (my $i=1;$i<$o;$i++)
{push @stack,$tempo[$i];}
}
else
{
# save bady to massive
$pos++;
$main_structure[$pos]=$body;
}
}
}


Данный кусок парсит MIME, который ему передается в строке.
Причем из письма любой сложности получается сложная линейная структура, которую
можно всю перебрать в цикле!
Воощем все как написано выше.

Чего тут нету ?

Тут нет перекодировок, а для этого существуют готовые решения.
Возникла какая-то проблемма с парсингом сложных параметров таких как
Content-Type.Поэтому для параметров заголовка действует один
единственный алгоритм.

Заголовок: Текст
Где текст может содержать несколько параметров.
Я тут этого не учитывал (не считая boundary)
Вообще история с boundary оочень странная и я никак не пойму этот стандарт MIME,
зачем было разрешать вообще boundary писать как часть заголовка Content-Type,
а если уж на то пошло, то зачем было разрешать перед boundary указывать символ
crlf. Получается что все заголовки как заголовки начинаются исключительно с
новой строки, а тут не заголовок, а кусок от предидущего заголовка вдруг начался
с новой строки, вот и догадывайся где тут начало boundary а где начало
заголовка. Мало того Провел небольшой анализ писем.. и действительно
используются совершенно безбашенные врианты записи boundary
то в одной строке то в двух, то в кавычках то без, а уж какие символы
использованы для указания boundary - и вообще не стоит и писать.
Благо пробелов не видел.

Поэтому способ который приведен тут расчитан на то что в заголовке будет один
единственный указатель на boundary, поэтому соблюдение различных правил для нас
является перебором.Для специалистов тут уже действительно нужно взять RFC и
просто написать именно по нему.Мой же вариант будет работать в большинстве
случаев. А если что-то не так, то можно легко что-то изменить, ведь код
помещается на один листок формата А4 в читабельном виде. Изучайте - нехочу.
Можно сказать что это один из самых маленьких вариантов парсинга mIME с учетом
сложных структур и созданием таковых.

На сим завершаю лирику.
Пришла пора декодировать тело и заголовки и все сотальное.

Наши проделки: http://revda.biz
873 Прочтений •  [Альтернатива MIME::Parser и Email::Simple (mime mail perl parser)] [08.05.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Альтернатива MIME::Parser и Email::... Ukraine Vova 08.05.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка