Занимаюсь приемом почты и возник вопрос про парсинг тела письма.
На сайте есть система комментариев с уведомлениеми на почту.
Пользователь может сделать reply со своего почтового клиента для
ответа.
Как я понял, то стандартизации в оформлении тела письма клиентами при
ответе нет. И каждый это делат по-своему.
http://stackoverflow.com/questions/2424382/parsing-email-text-reply-forward
Большинство клиентов (gmail, hotmail, mac mail) в ответе формируют
сначала тект (сам ответ) в plain text, а затем каждый городит свою
html разметку с ответом и самим сообщением. На сайте мне нужно
показывать только сам ответ.
Так вот, мне бы вполне хватило plain text'а (т.е. до первого html
тега), но есть Hotmail. Из списков и прочего он оставляет лишь текст
для этого самого plain text, когда gmail и компания делают что-то
вроде "1. First item /n 2. Second item /n". Т.е. нет никакого
форматирования у Hotmail'а в plain text секции.
Оставлять html мне не очень хочется, так как приходится вырезать само
письмо, на который был ответ.
Может кто-то занимался подобным и поделится опытом?
Мне думается что вы тут что-то путаете. То ли две части с форматами
text/plain и text/html в multipart/alternative письме, то ли вас
вводит в заблуждение тот факт, что если в основном тексте письме (по
вашей терминологии, в "ответе") пользователь не использовал никакой
Rich Text разметки, то и в тексте ее не будет. Если же пользователь
вставит в самое начало своего ответа ссылку - то в text/html уже
вполне себе будет <a href=""> в самом начале.
> На сайте мне нужно показывать только сам ответ.
Т.е. вам нужно отделить где в теле письма идет цитата и удалить ее?
Во-первых, если присылаемая в письме информация хоть сколько-нибудь
важна, то совсем удалять ее чревато - пользователи, бывает, вставляя
свой ответ inline в цитату, умудряются сбить разметку, в результате
их текст выглядит как цитата. Лучше сделать как в gmail - цитата по
умолчанию скрыта, но ее можно при желании посмотреть.
> Так вот, мне бы вполне хватило plain text'а (т.е. до первого html
> тега), но есть Hotmail. Из списков и прочего он оставляет лишь текст
> для этого самого plain text, когда gmail и компания делают что-то
> вроде "1. First item /n 2. Second item /n". Т.е. нет никакого
> форматирования у Hotmail'а в plain text секции.
>
> Оставлять html мне не очень хочется, так как приходится вырезать само
> письмо, на который был ответ.
Во-первых, убирайте всю HTML разметку полюбому, иначе словите XSS.
Во-вторых, если в письме есть text/plain часть, то парсить ее
намного проще. Если у вас есть текст на который пользователь
отвечает - то для определения где идет цитата можно воспользоваться
diff'ом. Если нет - то только по разметке. Если письма, на которые
отвечают пользователи, генерируются вами - то можно чуть-чуть
упростить себе жизнь вставляя в них строчку вроде следующего
(навеяно только что пришедшим тикетом с bitbuket'а):
--- please reply above this line ---
--
Alex L. Demidov (ALD9-RIPE).
http://alexeydemidov.com/
Freelance Consulting.
Выкусить разметку чрезвычайно сложно.
Если внешний сервис неприемлим (проблемы с выделением бюджета под
него, например), то они же раньше использовали крон-таск:
https://github.com/teambox/teambox/blob/master/lib/tasks/mail.rake
https://github.com/teambox/teambox/blob/master/lib/teambox.rb
https://github.com/teambox/teambox/blob/master/app/models/emailer/incoming.rb
2 февраля 2011 г. 15:48 пользователь Andrew Djoga
<andrew...@gmail.com> написал:
> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
>
> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> ror...@googlegroups.com
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
> Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
2 февраля 2011 г. 15:48 пользователь Andrew Djoga
<andrew...@gmail.com> написал:
Лучше сделать как в gmail - цитата по
умолчанию скрыта, но ее можно при желании посмотреть.
Во-первых, убирайте всю HTML разметку полюбому, иначе словите XSS.
Если письма, на которые
отвечают пользователи, генерируются вами - то можно чуть-чуть
упростить себе жизнь вставляя в них строчку вроде следующего
(навеяно только что пришедшим тикетом с bitbuket'а):
--- please reply above this line ---
2011/2/3 Alexander Simonov <asim...@gmail.com>:
> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
> FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
>
> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> ror...@googlegroups.com
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
> Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
--
Alexey Kovyrin
http://kovyrin.net/
В text/plain большинство MUA используют для цитирования символ
угловой скобки или > (">") с небольшими вариациями, от него и
пляшите. Если уж очень хочется парсить text/html, то наверное
придется рисовать XPath выражения для каждого MUA. Муторно конечно,
но количество MUA не превышает нескольких десятков и все зависит от
вашего бюджета и доступного времени, хотя за вечер это сделать точно
не получиться.
>
>
> > Во-первых, убирайте всю HTML разметку полюбому, иначе словите XSS.
> >
>
> Так санитайзеры же есть.
А что по вашему санитайзеры делают, как не убирают HTML разметку?
Только делать это надежнее сразу в том месте, где потенциально
опасный контент входит в систему, а не во view.
В случае почтовых сообщений text/plain обычно уже присутствует
наряду с text/html. Письма html only встречаются достаточно редко
даже в спаме. Для преобразования text/html в text/plain достаточно
пострипать html тэги, поскольку в text/plain вы все равно никакой
разметки (цвет, размер шрифта и т.д.) не сохраните, кроме переводов
строк. Зачем для этого нужен браузерный движок я, честно говоря, не
понимаю.
--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror...@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-un...@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
> > Во-первых, убирайте всю HTML разметку полюбому, иначе словите XSS.
> >А что по вашему санитайзеры делают, как не убирают HTML разметку?
>
> Так санитайзеры же есть.
Рельсовый sanitize не гарантирует избавления от XSS, он прямо
декларирует что он делает лишь "best effort". Чем больше вы
тегов/атрибутов оставляете, тем больше возможностей протащить что-то
нехорошее. Так же совершенно нет гарантии что санированный html будет
well-formed, т.е. могут просто испортить верстку каким-нибудь
допустимым, но незакрытым тегом.
https://github.com/github/email_reply_parser
--
Best regards,
Maxim Filatov