gpt4 book ai didi

java - 在java中下载包含内联图像的电子邮件正文

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:41 24 4
gpt4 key购买 nike

我的问题如下:

我有我的代码设置来读取来自特定帐户的电子邮件。那部分工作得很好。

问题在于解析电子邮件。分离附件和电子邮件正文(包含内联图像)。

我的代码是这样的:

    Void readMessages(Folder folder){

Message[] messages = folder.getMessages();
// loading of message objects.
for (int messageNumber = 0; messageNumber < messages.length; messageNumber++) {

final Message currentMessage = messages[messageNumber];
logger.info("Handling the mail with subject " + currentMessage.getSubject());
logger.info("Content type for the current message is " + currentMessage.getContentType());
final String messageFileName = currentMessage.getFileName();
logger.info("File name for the message " + messageFileName + ". File name is blank "
+ StringUtils.isBlank(messageFileName));


Object messageContentObject = currentMessage.getContent();
if (messageContentObject instanceof Multipart) {
Multipart multipart = (Multipart) messageContentObject;

// downloading all attachments....
int attachmentCount = multipart.getCount();
logger.info("Number of attachments ");
for (int i = 0; i < attachmentCount; i++) {
Part part = (Part) multipart.getBodyPart(i);
downloadAttachment(part, folderPath.toString());
}

}

}
}
}
private void downloadAttachment(Part part, String folderPath) throws Exception {
String disPosition = part.getDisposition();
String fileName = part.getFileName();
String decodedText = null;
logger.info("Disposition type :: " + disPosition);
logger.info("Attached File Name :: " + fileName);

if (disPosition != null && disPosition.equalsIgnoreCase(Part.ATTACHMENT)) {
logger.info("DisPosition is ATTACHMENT type.");
File file = new File(folderPath + File.separator + decodedText);
file.getParentFile().mkdirs();
saveEmailAttachment(file, part);
} else if (fileName != null && disPosition == null) {
logger.info("DisPosition is Null type but file name is valid. Possibly inline attchment");
File file = new File(folderPath + File.separator + decodedText);
file.getParentFile().mkdirs();
saveEmailAttachment(file, part);
} else if (fileName == null && disPosition == null) {
logger.info("DisPosition is Null type but file name is null. It is email body.");
File file = new File(folderPath + File.separator + "mail.html");
file.getParentFile().mkdirs();
saveEmailAttachment(file, part);
}


}
protected int saveEmailAttachment(File saveFile, Part part) throws Exception {

BufferedOutputStream bos = null;
InputStream is = null;
int ret = 0, count = 0;
try {
bos = new BufferedOutputStream(new FileOutputStream(saveFile));
part.writeTo(new FileOutputStream(saveFile));

} finally {
try {
if (bos != null) {
bos.close();
}
if (is != null) {
is.close();
}
} catch (IOException ioe) {
logger.error("Error while closing the stream.", ioe);
}
}
return count;
}

我遇到的问题是,当我运行这段代码时,我得到了一个 HTML 文件,但是内联图像被一个错误图像的标志所取代,该符号表示该图像没有来源。

请帮帮我。如果需要更多信息,请告诉我。

我还尝试通过更改将正文保存为 .eml 文件:

 File file = new File(folderPath + File.separator + "mail.html"); 

 File file = new File(folderPath + File.separator + "mail.eml");

但我得到了相同的结果。

最佳答案

我写了下面的代码来将电子邮件正文文本转换为 pdf,包括内联图像。在代码中,我用下载图像路径替换了图像代码(例如:cid:image001.jpg@01D17AAA.1EA2A6A0)。下载图像时,我正在为图像 key 和下载路径构建“ HashMap ”。

 HTMLWorker htmlWorker = new HTMLWorker(document);
if(bodyStr!=null)
{

//find inline images
inlineImages=downloadInLineImage(mostRecentMatch, dynamicOutputDirectory);
if(inlineImages!=null)
{

for (Map.Entry<String, String> entry : inlineImages.entrySet()) {
//System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
bodyStr=bodyStr.replaceAll("cid:"+entry.getKey() , entry.getValue());
}
}
htmlWorker.parse(new StringReader(bodyStr));

}

使用传递的项目下载内联图像。

 private HashMap<String,String> downloadInLineImage(Item item, String dynamicOutputDirectory)
throws Exception, ServiceLocalException {
//create output directory if not present

//bind the item to a new email message. if you do not bind, then the getHasAttachments() function will fail
EmailMessage mostRecentMatch = (EmailMessage)item;
String from = mostRecentMatch.getFrom().getAddress();
String user =StringUtils.substringBefore(from, "@");
AttachmentCollection collection=item.getAttachments();

HashMap<String,String> inlineFiles=new HashMap<String,String>();

if(collection.getCount()>0)
{
for (Attachment attachment : collection.getItems()) {

if(attachment.getIsInline())
{

FileAttachment currentFile = (FileAttachment) attachment;
String filePath=dynamicOutputDirectory+"/"+user+currentFile.getName();
File file=new File(filePath);
FileOutputStream fio=new FileOutputStream(file);
currentFile.load(fio);
inlineFiles.put(currentFile.getContentId(), filePath);
fio.close();
}
}
}

关于java - 在java中下载包含内联图像的电子邮件正文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507922/

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