【问题标题】:java mailx multipart attachments from iphone missing来自iphone的java mailx多部分附件丢失
【发布时间】:2014-08-22 11:11:32
【问题描述】:

我使用 javax.mail 从给定的邮件地址下载邮件,以获取附件(我需要图像)并自动将图像保存在磁盘上(轮询邮件地址)。这工作正常,除非邮件是从 iPhone 发送的。似乎在这些情况下,图像嵌入在邮件中(我可以在网络邮件窗口中看到图像)并且无法作为附件下载。

  • 如何从邮件中提取图片?
  • iPhone 邮件和其他邮件在附件方面有什么区别?
  • 图像是邮件内容的特殊部分吗?

在我的程序日志中我可以看到:
- 内容类型:多部分/混合;边界=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();
      }
    }

【问题讨论】:

    标签: java iphone jakarta-mail email-attachments


    【解决方案1】:

    您拥有的代码充满了对消息结构的假设。最有可能的是,这些假设之一是错误的。启动一个调试器,添加一些打印语句,或者做任何必要的事情来单步调试你的代码,比较你实际得到的和你期望得到的。您还可以使用 Message.writeTo 方法转储邮件的原始 MIME 内容,以查看邮件的 MIME 结构究竟是什么。

    可能首先要检查的是图像是否标记为附件。也许它是作为 INLINE 发送的?

    顺便说一句,您永远不想直接使用消息中的文件名;有人可能会在那里向您发送各种恶意垃圾。

    【讨论】:

    • 感谢您的提示。
      来自 iPhone 的邮件可以通过以下方式识别:“X-Mailer: iPhone Mail”
      内容类型为:“multipart/mixed”
      相关部分的内容类型为:“image/jpeg”
      由于有一个有效的文件名,我可以将图像保存到磁盘。

      File file = new File(filename);

      ((MimeBodyPart)part)。 saveFile(file);

      为避免“恶意垃圾”,我将检查文件属性并仅保存图像。

      您在 msgshow.java 中的示例代码来自 javax.mail 1.5 很有帮助。
    【解决方案2】:

    可以检查以下代码:

    Multipart mp = new MimeMultipart("related")

    使用默认构造函数,可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多