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