获取邮件JPG图像时不支持的数据类型

问题描述 投票:0回答:1

我正在尝试获取邮件的嵌入式图像,为此,我具有以下代码:

protected void setCidAttachments(Message message, MensajeEmail mensajeEmail) {

    try {

        MimeMultipart mimeMultipart = (MimeMultipart) message.getDataHandler().getContent();

        for (int k = 0; k < mimeMultipart.getCount(); k++) {

            MimeBodyPart part = (MimeBodyPart) mimeMultipart.getBodyPart(k);
            processPart(part, mensajeEmail);

        }

    }

    catch (Exception e) {
        log.error("Error obtendo adxuntos con cid", e);
    }

}

private void processPart (BodyPart part, MensajeEmail mensajeEmail) throws MessagingException, IOException {

    String type = getContentType(part);
    StringBuilder content = new StringBuilder(mensajeEmail.getContenido());

    if (isImage(type) && part.getDataHandler() != null && part.getDataHandler().getContent() != null) {

        if (part.getDataHandler().getContent() instanceof MimeMultipart) {

            MimeMultipart p = (MimeMultipart) part.getDataHandler().getContent();

            for (int i = 0; i < p.getCount(); i++) {

                BodyPart subpart = p.getBodyPart(i != p.getCount() - 1 ? i + 1 : i);
                processPart(subpart, mensajeEmail);

            }

        } else {

            mensajeEmail.setContenido(getInlineImage(part, content));

        }

    }

}

private String getInlineImage (BodyPart part, StringBuilder content) throws MessagingException, IOException {

    Base64 decoder64 = new Base64();
    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    // Get type

    String type = getContentType(part);

    // Get Content-ID

    String contentId = getContentId(part);

    // Replace

    if (contentId.length() > 0) {

        part.getDataHandler().writeTo(bos);
        int start = content.indexOf("src=\"cid:" + contentId + "\"") + 5;

        if (start > 4) {

            int length = contentId.length() + 4;
            content.replace(start, start + length, "data:" + (isImage(type) ? type : "image/png;") + " base64," + decoder64.encodeToString(bos.toByteArray()));

        }

    }

    bos.close();

    return content.toString();

}

private String getContentId (BodyPart part) throws MessagingException {

    Enumeration headers = part.getAllHeaders();

    while (headers.hasMoreElements()) {

        Header header = (Header)headers.nextElement();

        if (header.getName().equalsIgnoreCase("Content-ID"))
            return cleanContentId(header.getValue());

    }

    return "";

}

private String getContentType (BodyPart part) throws MessagingException {

    return part.getContentType().split(" ")[0];

}

private boolean isImage (String mime) {

    return !mime.equals("text/html;") && !mime.equals("text/plain;");

}

private String cleanContentId (String contentId) {

    if (contentId.charAt(0) == '<') contentId = contentId.substring(1, contentId.length() - 1);
    return contentId;

}

当我发送PNG图像时,这工作得很好(这使我认为我的代码确实正确)。但是,当我尝试发送JPG图像时,出现以下异常:

javax.activation.UnsupportedDataTypeException: Unknown image type image/jpeg; name=sony-car-796x418.jpg
at org.apache.geronimo.activation.handlers.AbstractImageHandler.getContent(AbstractImageHandler.java:57)
at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:795)
at javax.activation.DataHandler.getContent(DataHandler.java:542)
at es.enxenio.fcpw.plinper.daemons.email.AbstractProtocoloObtencionEmail.processPart(AbstractProtocoloObtencionEmail.java:378)

...

该框架真的无法使用JPG图片吗?有什么办法可以解决这个问题?

编辑:Gmail甚至都不让我发送JPG图像,因此它可能不是邮件图像的一种非常常见的格式,这使我认为可能未得到广泛实施,这可能是Java似乎无法实现的原因使用它

java email png jpeg unsupporteddatatypeexception
1个回答
0
投票

我发现了问题。此行

if (isImage(type) && part.getDataHandler() != null && part.getDataHandler().getContent()

不应该检查类型是否为图像,而是是否为多部分。否则,我们可能会将jpg图像作为多部分处理。出于某种原因,png图像对此并不介意,这就是它起作用的原因。这是代码的更改部分:

protected void setCidAttachments(Message message, MensajeEmail mensajeEmail) {

    try {

        processPart(message, mensajeEmail);

    }

    catch (Exception e) {
        log.error("Error obtendo adxuntos con cid", e);
    }

}

private void processPart(Part part, MensajeEmail mensajeEmail) throws MessagingException, IOException {

    String type = getContentType(part);
    StringBuilder content = new StringBuilder(mensajeEmail.getContenido());

    if (isMultipart(type) && part.getDataHandler() != null && part.getDataHandler().getContent() != null && part.getDataHandler().getContent() instanceof MimeMultipart) {

        MimeMultipart multipart = (MimeMultipart) part.getDataHandler().getContent();

        for (int i = 0; i < multipart.getCount(); i++) {

            BodyPart subpart = multipart.getBodyPart(i);
            processPart(subpart, mensajeEmail);

        }

    } 

    else {

        mensajeEmail.setContenido(getInlineImage(part, content));

    }

}

private boolean isMultipart(String mime) {

    return (Pattern.matches("multipart/.*", mime));

}
© www.soinside.com 2019 - 2024. All rights reserved.