Преобразование текста / обычного содержимого из электронной почты в обычный текст - PullRequest
1 голос
/ 05 мая 2011

Когда я пытаюсь прочитать письмо с моей учетной записи IMAP:

imap.search(['NOT','SEEN']).each do |message_id|
  mail = imap.fetch(message_id, "BODY[1]")
end

Я получаю все виды ASCII ?? коды в моей строке, например = 20 = 93 = 94 и т. д. Пробовал уже много чего преобразовать или расшифровать, но безуспешно. Как я могу избавиться от этих кодов?

Ответы [ 3 ]

3 голосов
/ 06 мая 2011

Существует несколько различных вариантов кодирования тела сообщения, таких как quoted-printable, base-64 и т. Д. В Ruby проще всего передать сообщение целиком в почтовый гем, дать ему выполнить синтаксический анализ и затем вывести текстовое содержимое.

message = Mail.new(raw_source)
puts message.body.decoded

По опыту вы можете обнаружить, что вам нужно сделать что-то вроде следующего:

message.multipart? ? (message.text_part ? message.text_part.body.decoded : nil) : message.body.decoded

Мы используем нечто похожее на это, когда отправляем сообщение в приложение в CloudMailin, чтобы убедиться, что мы находим простую часть, поскольку не всегда гарантируется, что простая часть будет в теле, а не закодирована в mime. *

1 голос
/ 05 августа 2012

Мне пришлось использовать что-то вроде следующего, чтобы разобрать электронную почту.

text = message.multipart? ? (message.text_part ? message.text_part.body.decoded : message.html_part.body.decoded) : message.body.decoded

В одном из проанализированных мною сообщений вообще не было text_part, поэтому в этом случае установка nil не сработает.

0 голосов
/ 05 мая 2011

Звучит так, как будто вы нашли цитируемое печатное тело . Вы должны посмотреть, какая кодировка для тела, и проанализировать его соответствующим образом. Похоже, Net :: IMAP :: BodyTypeBasic может дать вам эту информацию, но, боюсь, я не знаю достаточно рубина, чтобы вы могли продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...