#java #iphone #jakarta-mail #email-attachments
#java #iPhone #джакарта-почта #вложения электронной почты
Вопрос:
Я использую javax.mail для загрузки писем с заданного почтового адреса, чтобы получать вложения (я ожидаю изображения) и автоматически сохранять изображения на диске (опрашивая почтовый адрес). Это работает нормально, за исключением случаев, когда почта была отправлена с iPhone. Кажется, что в этих случаях изображение встроено в почту (я вижу изображение в окне веб-почты) и не может быть загружено как вложение.
- Как я могу извлечь изображение из почты?
- В чем разница между письмами iPhone и другими письмами, касающимися вложений?
- Является ли изображение особой частью содержимого почты?
В моем журнале программы я вижу:
— ContentType: multipart / mixed; boundary= Apple-Mail-…
— numberOfParts = 2
Версия Java 1.7.0_21 javax.mail версия 1.4.7
Это соответствующий код (большая его часть взята изhttp://www.codejava.net )
if (contentType.contains("multipart")) {
// content may contain attachments
Multipart multiPart = (Multipart) message.getContent();
numberOfParts = multiPart.getCount();
for (int partCount = 0; partCount < numberOfParts; partCount ) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
// this part is the attachment
String fileName = part.getFileName();
attachFiles = fileName ", ";
if (fileName.endsWith("jpg") || fileName.endsWith("JPG")
|| fileName.endsWith("jpeg") || fileName.endsWith("JPEG")) {
part.saveFile(saveDirectory File.separator fileName);
} else {
// attachment is not an image
}
} else {
// this part may be the message content
messageContent = part.getContent().toString();
}
}
if (attachFiles.length() > 1) {
attachFiles = attachFiles.substring(0, attachFiles.length() - 2);
}
} else if (contentType.contains("text/plain") || contentType.contains("text/html")) {
Object content = message.getContent();
if (content != null) {
messageContent = content.toString();
}
}
Ответ №1:
Приведенный ниже код можно проверить:
Multipart mp = new MimeMultipart("related")
Используйте конструктор по умолчанию, который устраняет проблему.
Ответ №2:
Имеющийся у вас код полон предположений о структуре сообщения. Скорее всего, одно из этих предположений неверно. Запустите отладчик, добавьте несколько инструкций печати или сделайте все необходимое для пошагового выполнения вашего кода и сравнения того, что вы на самом деле получаете, с тем, что вы ожидаете получить. Вы также можете удалить необработанное содержимое MIME сообщения, используя метод Message.writeTo, чтобы увидеть, какова структура MIME сообщения на самом деле.
Вероятно, первое, что нужно проверить, это то, помечено ли изображение как ВЛОЖЕНИЕ. Возможно, вместо этого они отправляются как встроенные?
Кстати, вы никогда не захотите напрямую использовать имя файла в сообщении; кто-то может отправить вам туда всевозможный вредоносный мусор.
Комментарии:
1. Спасибо за подсказки. <br/> Письма с iPhone можно идентифицировать с помощью: «X-Mailer: почта iPhone»<br/> Тип содержимого: «составное / смешанное»<br/> Тип содержимого соответствующей части: «изображение / jpeg»<br/> Поскольку существует допустимое имя файла, я могу сохранить изображение на диск.<br/><br/> File файл = новый файл (filename);<br/><br/> (частьMimeBodyPart).SaveFile(файл) ;<br/><br/>Чтобы избежать «вредоносного мусора», я проверю свойства файла и сохраню только изображения.<br/><br/>Ваш пример кода в msgshow.java javax.mail 1.5 очень полезен.