我正在设法保存包含正文,主题等的简单消息。但是,我无法保存多部分消息。我在appendMessages
之前和之后登录,但注意到第二个日志不存在。有趣的是,我没有被解雇的例外情况。我完全不知道这里出了什么问题。
这是我的Java代码:
Store store = null;
Folder folder = null;
String folderName = "sentbox";
try {
Session session = prepareSession(MailProtocols.IMAP, kid);
store = session.getStore("imap");
store.connect(myHost, user.getLogin(), user.getPassword());
folder = store.getFolder(folderName);
if (folder == null || !folder.exists()) {
folder.create(Folder.HOLDS_MESSAGES);
}
folder.open(Folder.READ_WRITE);
MimeMessage mimeMessage = new MimeMessage(session);
Address[] to = null;
if(msg.getTo() != null) { // msg is an instance of custom message class, nothing special there
int msgSize = msg.getTo().size();
to = new InternetAddress[msgSize];
for (int i = 0; i < msgSize; i++) {
to[i] = new InternetAddress(msg.getTo().get(i));
}
}
mimeMessage.setRecipients(RecipientType.TO, to);
mimeMessage.setSentDate(new Date(System.currentTimeMillis()));
mimeMessage.setSubject(msg.getSubject());
if (msg.getFiles() != null) {
MimeMultipart mp = new MimeMultipart();
MimeBodyPart newPart = new MimeBodyPart();
newPart.setText(msg.getBody());
mp.addBodyPart(newPart);
for (MultipartFile multipartFile : msg.getFiles()) {
try {
newPart = new MimeBodyPart(); // create new part to each files
newPart.addHeader("My-File-Type", multipartFile.getContentType());
File tmpFile = File.createTempFile("newAttachment", ".tmp");
multipartFile.transferTo(tmpFile);
FileDataSource fds = new FileDataSource(tmpFile);
newPart.setDataHandler(new DataHandler(fds));
newPart.setFileName(multipartFile.getOriginalFilename());
newPart.setDisposition(Part.ATTACHMENT);
mp.addBodyPart(newPart);
tmpFile.deleteOnExit();
} catch (IOException e) {
logger.debug("Can not create temp file ===========>");
e.printStackTrace();
}
}
mimeMessage.setContent(mp);
mimeMessage.saveChanges();
} else {
mimeMessage.setText(msg.getBody());
}
folder.appendMessages(new Message[] {mimeMessage});
Message[] allMessages = folder.getMessages();
UIDFolder uidFolder = (UIDFolder) folder;
long savedMsgId = uidFolder.getUID(allMessages[allMessages.length - 1]);
logger.info("savedMsgId",savedMsgId + "") //cannot get this output at all
} catch (Exception e) {
logger.error(e);
} finally {
closeMailStore(store, folder); // just simple method which closes the store
}
我正在使用Apache James 3.0.4。任何方法都欢迎
答案 0 :(得分:5)
我正在使用Apache James 3.0.4
你不是指Apach James 3.0-beta4吗?即我们还没有达到3.0发布,所以没有3.0.4。你没有使用稳定版本(2.3.2)的任何原因?只是问......: - )
我在appendMessages之前和之后记录,但注意到第二个日志不存在。
如果您从未在 folder.appendMessages(new Message [] {mimeMessage}); 之后记录代码,那么有三种可能性:
项目(1)到目前为止 最有可能。 建议:将代码的尾部更改为:
} catch (Exception e) {
logger.error(e);
} catch (Throwable t) {
logger.error(t);
} finally {
closeMailStore(store, folder); // just simple method which closes the store
}
如果这会记录一个throwable,你可以根据app jars&amp; amp;配置,OS / JVM版本或数据内容......
如果这不记录throwable,您可以调查(2)或(3)。
答案 1 :(得分:3)
我在James 2.3.2中也遇到了同样的错误。我正在使用eclipse。在库设置中的eclipse中,我添加了JDK来代替JRE。然后我的问题得到了解决。尝试相同。它可能有效,因为你的代码看起来很好,我认为代码没有问题。
答案 2 :(得分:2)
我找到了另一种方法,我正在这里,希望我可以帮助别人。
我正在推翻Mailet的service
方法。然后借助org.apache.james.mailbox.MessageManager的appendMessage
方法,我可以简单地将我的信息添加到我想要的文件夹中。这是我的JAVA代码:
public class MyMailet extends GenericMailet {
@Resource(name = "mailboxmanager")
private MailboxManager mailboxManager;
private String sentbox;
@Override
public void init() throws MessagingException {
super.init();
this.sentbox = getInitParameter("sent", "sentbox");
}
@SuppressWarnings("unchecked")
@Override
public void service(Mail mail) throws MessagingException {
// Here, I am putting my logic which has to decide which folder to put
// ...
putToFolder(mail.getMessage(), mail.getSender().toString(), sentbox);
mail.setState(Mail.GHOST);
}
private long putToFolder(MimeMessage message, String userName, String folderName) throws MessagingException {
MailboxSession session = null;
long appendedMessageId;
try {
session = mailboxManager.createSystemSession(userName, new MailetContextLog(getMailetContext()));
MessageManager mailbox = getMessageManager(session, userName, folderName);
appendedMessageId = mailbox.appendMessage(new MimeMessageInputStream(message), new Date(), session, true, null);
} catch (BadCredentialsException e) {
throw new MessagingException("Unable to authenticate to mailbox", e);
} catch (MailboxException e) {
throw new MessagingException("Unable to access mailbox.", e);
} finally {
if (session != null) {
session.close();
}
try {
mailboxManager.logout(session, true);
mailboxManager.endProcessingRequest(session);
} catch (MailboxException e) {
throw new MessagingException("Can logout from mailbox", e);
}
}
return appendedMessageId;
}
private MessageManager getMessageManager(MailboxSession session, String userName, String folderName) throws MailboxException, MessagingException {
mailboxManager.startProcessingRequest(session);
MailboxPath path = new MailboxPath(MailboxConstants.USER_NAMESPACE, userName, folderName);
if (!mailboxManager.mailboxExists(path, session)) {
mailboxManager.createMailbox(path, session);
}
MessageManager messageManager = mailboxManager.getMailbox(path, session);
if (messageManager == null) {
throw new MessagingException("Mailbox for username " + userName + " was not found on this server.");
}
return messageManager;
}
}
正如我所料,它会附加任何没有概率的多部分消息。