конвертировать/декодировать почтовую строку в кавычках из переменной с помощью javax.mail.internet.MimeUtility или другим способом?

У меня есть текстовое содержимое файла .eml, которое я помещаю в переменную, и я буду анализировать его содержимое, включая преобразование в разные форматы. Если в заголовке строка "quoted-printable" окружена тегами =? Утф-8? В? ....? = функция mimeUtlility.decodeText() работает хорошо, но если у меня есть закодированный текст "quoted-printable" в теле письма без этих тегов, mimeUtlility.decodeText() из javax.mail.internet.MimeUtility не работает. Как я могу декодировать эти тексты разных форматов и кодировок? пример части текста: «Cell Manager S = = E9 E9curit / Pr = E9vention / Suret = E9», а иногда в конце строк есть «=CRLF».


person ericire    schedule 03.08.2016    source источник


Ответы (1)


Вам необходимо использовать MimeUtility.decode.

Больший вопрос может заключаться в том, почему вы делаете всю эту работу самостоятельно. Если у вас есть данные в файле .eml, JavaMail сможет их прочитать, проанализировать и декодировать.

person Bill Shannon    schedule 03.08.2016
comment
Привет, на самом деле я избегаю иметь файл .eml, я напрямую помещаю текст формата электронной почты .eml в текстовую переменную. Я пробовал mimeUtility.decode (текстовая переменная, кавычки-печать), но это не работает, потому что функция декодирования (java.io.InputStream есть, кодировка java.lang.String) требует InputStream, и я не знаю, как поместите переменный текст в InputStream - person ericire; 03.08.2016
comment
Если вы создаете сообщение в формате MIME вручную (вместо использования для этого JavaMail) и сохраняете его в строке, содержащей только символы ASCII, вы можете использовать устаревший StringBufferInputStream. Вы можете использовать это с MimeUtility.decode или, что еще проще, использовать его с конструктором MimeMessage, который принимает InputStream. Но опять же, какую проблему вы решаете, создавая необработанный текст сообщения MIME самостоятельно? - person Bill Shannon; 03.08.2016
comment
Я помещаю строку во входной поток с InputStream is = new ByteArrayInputStream(string.getBytes()); но результатом декодирования является com.sun.mail.util.QPDecoderStream@1a3a420, и я не знаю, что это значит - person ericire; 03.08.2016
comment
yes I Сохранение почты в переменной с помощью javax.mail для экономии времени, потому что это явно (?) быстрее, чем создание файла .eml. затем разберите его. Но я попробую другие способы сделать дальше. - person ericire; 03.08.2016
comment
Я не ставил под сомнение необходимость избегать создания файла, я ставил под сомнение подход к созданию необработанного сообщения формата MIME в строке по сравнению с использованием JavaMail для создания сообщения формата MIME. Кроме того, что вы делаете с сообщением после его создания? - person Bill Shannon; 03.08.2016
comment
я не создаю сообщение, я импортирую сообщение из своего почтового ящика в переменную и анализирую его - person ericire; 04.08.2016
comment
Почему вы не используете для этого JavaMail? - person Bill Shannon; 04.08.2016
comment
Мне удалось получить желаемый результат, добавив BufferedReader br = new BufferedReader(new InputStreamReader (QPdecode, UTF-8)); Большое спасибо - person ericire; 04.08.2016
comment
BufferedReader не декодирует кавычки. Что такое QPdecode в вашем примере? - person Bill Shannon; 04.08.2016
comment
Я импортирую его с помощью javamail - person ericire; 04.08.2016
comment
InputStream is = new StringBufferInputStream(string) InputStream QPdecode = javax.mail.internet.MimeUtility.decode(is, code) BufferedReader br = new BufferedReader(new InputStreamReader(QPdecode,charset)); и код = кавычки-печатные и кодировка = utf-8 - person ericire; 04.08.2016
comment
Я думаю, нам нужно сделать шаг назад и посмотреть на более широкую картину. Если вы используете JavaMail для чтения сообщения из своего почтового ящика, вам (как правило) никогда не нужно использовать класс MimeUtility или самостоятельно декодировать содержимое, доступное для печати в кавычках. Если вы правильно используете JavaMail, JavaMail прозрачно выполнит все это декодирование за вас. Что именно вы делаете, что заставляет вас хотеть декодировать контент самостоятельно? - person Bill Shannon; 04.08.2016
comment
Повторяю, я импортирую сообщение mime целиком, затем анализирую пакет, чтобы сэкономить время, вместо того, чтобы импортировать тему, затем дату, затем сообщение и вложения с javamail, заставляющим каждый раз анализировать одно и то же сообщение, поэтому каждый раз открывайте ящик электронной почты и мешает читать - person ericire; 04.08.2016
comment
Я извлек отдельно тему, сообщение и прочее в поля базы файлмейкера - person ericire; 04.08.2016
comment
JavaMail не анализирует сообщение каждый раз. Если вы читаете сообщение с сервера IMAP, сервер анализирует сообщение, JavaMail должен анализировать только команды протокола IMAP. Используя метод Folder.fetch, значения различных полей могут быть предварительно загружены, чтобы для каждого из них не требовалось отдельной команды для сервера. Может быть, вы могли бы поделиться более подробной информацией об используемом вами коде и проведенном вами тестировании производительности, которое показывает, что ваш подход является улучшением? Может быть, я не понимаю, что вы делаете, но похоже, что вы усложняете проблему без всякой причины. - person Bill Shannon; 04.08.2016
comment
Привет, извините за мой плохой английский, потому что я француз :) цель состоит в том, чтобы накормить базу данных файлового производителя различной информацией из почты. Итак, у меня есть скрипт для создания файлов, который будет импортировать каждое сообщение и распределять информацию по разным полям. Сначала заголовки, тема, дата, от, до, копия и само сообщение, желательно в формате html и, наконец, вложения. - person ericire; 04.08.2016
comment
Я выбрал в качестве метода импортировать по одному непрочитанные сообщения с помощью FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); Сообщения folder.search = (ft); После этого сообщения помечаются как прочитанные. Поэтому я импортирую сообщение, а затем последовательно извлекаю каждую информацию для правильного его разделения. Итак, у меня есть сценарий javascript для каждого действия. Первый открывает папку «Входящие» IMAP и ищет сообщение, второй извлекает тему сообщения, хранящуюся в текстовом файлмейкере, третье свидание и т. д. Я открыт для других способов сделать это, но я признаю, что не вижу, как это сделать это иначе - person ericire; 04.08.2016
comment
Я не понимаю, как вы используете JavaScript по сравнению с тем, что вы делаете с Java и JavaMail. Выполняется ли JavaScript в браузере? Выполняется ли Java на сервере? Как данные попадают с сервера в браузер? База данных FileMaker находится на сервере? Зачем вам нужно копировать данные с сервера IMAP на сервер базы данных FileMaker? - person Bill Shannon; 04.08.2016
comment
Мне не нужен был браузер. В файлмейкере у меня есть расширение (аддон), которое позволяет мне выполнять JavaScript или отличный код. Моя база данных файлового мастера не является серверной, потому что она пока доступна только для меня. - person ericire; 05.08.2016
comment
в файлмейкере также есть веб-просмотрщик, своего рода внутренний браузер из Internet Explorer, который позволяет вам выходить в сеть, а также выполнять javascript - person ericire; 05.08.2016
comment
Ваш Java-код работает в надстройке FileMaker, работает в FileMaker локально на вашем рабочем столе/ноутбуке? Копирует ли он содержимое почтовых сообщений с удаленного почтового сервера в таблицы базы данных в FileMaker? Тем не менее, нет причин, по которым вам нужно самостоятельно расшифровывать содержимое почтовых сообщений. Просто используйте API-интерфейсы JavaMail для извлечения различных полей в виде строк Java Unicode и сохранения результатов в базе данных. - person Bill Shannon; 05.08.2016
comment
привет Ваш Java-код работает в надстройке FileMaker, работает в FileMaker локально на вашем рабочем столе/ноутбуке? Да, это так - person ericire; 05.08.2016
comment
Копирует ли он содержимое почтовых сообщений с удаленного почтового сервера в таблицы базы данных в FileMaker? это моя цель - person ericire; 05.08.2016
comment
и если я конвертирую электронное письмо в файл .eml, могу ли я использовать getSubject () getFrom () и т. д. javax.mail с этим файлом? - person ericire; 05.08.2016
comment
да, я могу сделать это с помощью InputStream is = new FileInputStream(FilePath); mimeMessage = новое MimeMessage (null, is); Затем я ищу, как получить сообщение тела и вложения - person ericire; 06.08.2016
comment
Если вы скопируете весь необработанный MIME-контент сообщения в базу данных, а затем извлечете его из базы данных, вы можете использовать конструктор MimeMessage выше, чтобы создать новый MimeMessage, который затем позволит вам получить доступ ко всему содержимому сообщения, используя MimeMessage и связанные API. Существует множество примеров JavaMail, показывающих, как получить доступ к содержимому (тема, дата, тело, вложения и т. д.) с помощью этих APIS. Кроме того, вы можете использовать эти API до того, как сохраните сообщение в базе данных, и вместо этого сохранить только результаты этих вызовов API. В любом случае будет работать. - person Bill Shannon; 06.08.2016
comment
Начните с Часто задаваемые вопросы по JavaMail. - person Bill Shannon; 06.08.2016