gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:08:50 25 4
gpt4 key购买 nike

我正在尝试获取邮件的内联图像,为此我有以下代码:

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 似乎不被广泛实现的原因能够使用它

最佳答案

我发现了问题。这一行

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));

}

关于java - 获取邮件 JPG 图像时不支持的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60504587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com