Как преобразовать байт [] в сообщение с помощью библиотеки javax.mail

#java #email #bytearray #jakarta-mail #mime-message

#java #Адрес электронной почты #bytearray #джакарта-почта #mime-сообщение

Вопрос:

Прямо сейчас у меня есть электронные письма, хранящиеся в базе данных, и мне нужно иметь возможность извлекать их и загружать вложения, если они у них есть. В настоящее время я не знаю, как преобразовать byte [], в котором я сохранил электронное письмо, в MailMessage или MimeMessage. Я полагаю, что я добрался до byte[] в части Mimebody, но я не уверен, как я буду анализировать его и извлекать вложение.

 final byte[] mailMessageString = resultSet.getBytes(mailMessageIndex);
File file = new File("C:\Users\khurt\Downloads\op.txt");
List<File> attachments = new ArrayList<File>();
@SuppressWarnings("deprecation")
String mimeType = file.toURL().openConnection().getContentType();
MimeBodyPart att = new MimeBodyPart(); 
ByteArrayDataSource efe = new ByteArrayDataSource(mailMessageString, mimeType); 
DataHandler dh = new DataHandler(efe);
att.setDataHandler(dh);
att.setFileName(bds.getName());
Multipart multipart = (Multipart) att.getContent();
multipart.addBodyPart(att);
for (int i = 0; i < multipart.getCount(); i  ) 
{
    BodyPart bodyPart = multipart.getBodyPart(i);
    if(!Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())
        amp;amp; !StringUtils.isNotBlank(bodyPart.getFileName())) 
    {
        InputStream is = bodyPart.getInputStream();
        File f = new File("C:\Users\khurt\Downloads\"
              bodyPart.getFileName());
        FileOutputStream fos = new FileOutputStream(f);
        byte[] buf = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buf)) != -1) 
        {
            fos.write(buf, 0, bytesRead);
        }
        fos.close();
        attachments.add(f);
    }
    else
    {
        System.out.println("there is nata");
    }
}   
 

Фактических ошибок при попадании в цикл for нет, но я еще не проанализировал электронное письмо, чтобы получить какой-либо из файлов. Можно ли выполнить синтаксический анализ через MimeBodyPart?

Для справки в электронных письмах будут данные об этом, затем вложение электронной почты начинается с пустой строки, а затем: (Электронное письмо inst java, Stack Overflow не позволило бы мне опубликовать его без форматирования. Также в некоторых электронных письмах нет заголовка с информацией о вложении).

 --_002_2733D716DEFD0D49BF462DE618263C07019302260BCVGEXCEMAIL01_
Content-Type: image/gif; name="image001.gif"
Content-Description: image001.gif
Content-Disposition: inline; filename="image001.gif"; size=1669;
    creation-date="Tue, 14 Jun 2011 14:42:12 GMT";
    modification-date="Tue, 14 Jun 2011 14:42:12 GMT"
Content-ID: <image001.gif@01CC2204.E828E6F0>
Content-Transfer-Encoding: base64

R0lGODlhiwA9ANUAAAAzZv/4 lvKwABVBzlstgY q/wCBNebwwNN/l7H ZsrHB0NuPkc/Z4kBm
jLEQFW MqZ yxQ8/b8wAANLb5NV/gu/y9eWwsl9/nzBZg8ZQU6 /z /P0MFARPrv79BvcuCfobYg
JICZs /39/Xf4NDZ47/M2ZGnvXCNqWGBoNaAgt6UlNBwcxFBcM7e5gAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAACLAD0AAAb/wIBw
SCwaj8ikcslsOp/QqHRKrVqv2Kx2y 16v CweEwum8/otHrNtnoMcFBlTq9c4O189s2oaDoDgYKD
hIIPHR8XHnqMSgYMHx0PhYIhHZeYl5SDGiSNjRwMBQiElgUqIHhPcCoak4Ign2sGFYCCHacGHF0X
tg esmS0tiEaKgbAYwWBDMFgJAyuxQwGi2kekyrOXBcfliqKjIAG21ceIAUFDLvBkuVV5 vvASEF
8/dVHAPJ P1OBSz8CWxC4oG1gQiPnErIsEjBgw0ZAiQIp2K1iHpIDAg4hMOjWh1IbRKEoIMdjGhA
BDo0csChTJlErryAsoxKQ7hUULvYxEOv/0D8aoLxyM4cqRCphAr0oCLEoA6xlOLjU2ASAqkCOUzC
KjBECK6y3oAcRCoq2DbnNLjswELFsUcsNJxFWwEBiwtB5zK6wKLoPRMKMCgQkMBCAoYkIM5rcODA
AiELMgAQoZdRgxYAShQhQLlyngMAUhixECFABAcOFEhwIEBIAgwOBCsg0GCIhRYOhIhIDcEBAQUQ
WnhWYgIAgNJJjAvBAACF7slCTJgYEgHzYQEWAhTPHaBzCgDDi4gwPj05 AACAHAf37lICwWhiWwn
 

Комментарии:

1. Выполните итерацию по BodyPart MimeMultipart . Используется MimeMultipart.getCount() для извлечения количества частей, а затем MimeMultipart.getBodyPart(index) для извлечения фактической части

2. Ваш код не кажется завершенным, вы загружаете байты в mailMessageString, затем создаете из него источник ByteArrayDataSource с именем efe, но затем никогда не используете его. Также вы используете переменную bds, но она нигде не определена и не установлена.

3. Это была моя ошибка при вводе кода, я отредактировал его несколько часов назад после того, как выяснил более раннюю проблему и забыл изменить переменную с bds на efe

Ответ №1:

Комментарии:

1. Проблема в том, что у меня нет почтового сеанса, нет конструктора, который просто принимает входной поток

2. Просто создайте сеанс для использования с этой целью. Сеанс просто содержит информацию о конфигурации. Если вам не нужно изменять какие-либо значения по умолчанию, это так же просто, как сеанс session = Session.getInstance(новые свойства ());