#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:
Используйте конструктор MimeMessage, который принимает входной поток. Затем получите доступ к вложениям в сообщении обычным способом. Смотрите msgshow.java пример программы для примера кода.
Комментарии:
1. Проблема в том, что у меня нет почтового сеанса, нет конструктора, который просто принимает входной поток
2. Просто создайте сеанс для использования с этой целью. Сеанс просто содержит информацию о конфигурации. Если вам не нужно изменять какие-либо значения по умолчанию, это так же просто, как сеанс session = Session.getInstance(новые свойства ());