private String getFrom(StoredMessage message) throws MessagingException { Address[] addresses = message.getMimeMessage().getFrom(); if (addresses == null || addresses.length == 0) { return null; } return String.valueOf(addresses[0]); }
public boolean isSet(Flags.Flag flag) { try { return getMimeMessage().isSet(flag); } catch (MessagingException e) { throw new IllegalStateException("Can not access flag " + flag, e); } }
@Override public long getUID(Message message) { // Check if we have a message with same object reference ... otherwise, not supported. synchronized (mailMessages) { for (StoredMessage mailMessage : mailMessages) { if (mailMessage.getMimeMessage() == message) { return mailMessage.getUid(); } } } throw new IllegalStateException("No match found for " + message); }
public void setFlags(Flags flags, boolean value) { try { getMimeMessage().setFlags(flags, value); } catch (MessagingException e) { throw new IllegalStateException("Can not set flags " + flags + " to " + value, e); } }
private String getCc(StoredMessage message) throws MessagingException { Address[] addresses = message.getMimeMessage().getRecipients(Message.RecipientType.CC); if (addresses == null || addresses.length == 0) { return null; } return String.valueOf(addresses[0]); }
public void setFlag(Flags.Flag flag, boolean value) { try { getMimeMessage().setFlag(flag, value); } catch (MessagingException e) { throw new IllegalStateException("Can not set flag " + flag + " to " + value, e); } }
public Flags getFlags() { try { return getMimeMessage().getFlags(); } catch (MessagingException e) { throw new IllegalStateException("Can not access flags", e); } }
private String getTo(StoredMessage message) throws MessagingException { Address[] addresses = message.getMimeMessage().getRecipients(Message.RecipientType.TO); if (addresses == null || addresses.length == 0) { return null; } return String.valueOf(addresses[0]); }
@Override public Message getMessageByUID(long uid) { return getMessage(uid).getMimeMessage(); }
long sumMessageSizes(List<StoredMessage> messages) throws MailException { long total = 0; for (StoredMessage msg : messages) { try { total += msg.getMimeMessage().getSize(); } catch (MessagingException e) { throw new RuntimeException(e); } } return total; } }
@Override public Message[] getMessagesByUID(long start, long end) { synchronized (mailMessages) { List<Message> messages = new ArrayList<>(); for (StoredMessage mailMessage : mailMessages) { final long uid = mailMessage.getUid(); if (uid >= start && uid <= end) { messages.add(mailMessage.getMimeMessage()); } } return messages.toArray(new Message[messages.size()]); } }
@Override public MimeMessage[] getReceivedMessages() { List<StoredMessage> msgs = managers.getImapHostManager().getAllMessages(); MimeMessage[] ret = new MimeMessage[msgs.size()]; for (int i = 0; i < msgs.size(); i++) { StoredMessage storedMessage = msgs.get(i); ret[i] = storedMessage.getMimeMessage(); } return ret; }
@Override public Message[] getMessagesByUID(long[] uids) { synchronized (mailMessages) { List<Message> messages = new ArrayList<>(uids.length); Map<Long, StoredMessage> uid2Msg = new HashMap<>(mailMessages.size()); for (StoredMessage mailMessage : mailMessages) { uid2Msg.put(mailMessage.getUid(), mailMessage); } for (long uid : uids) { final StoredMessage storedMessage = uid2Msg.get(uid); if (storedMessage != null) { messages.add(storedMessage.getMimeMessage()); } } return messages.toArray(new Message[messages.size()]); } }
@Override public MimeMessage[] getReceivedMessagesForDomain(String domain) { List<StoredMessage> msgs = managers.getImapHostManager().getAllMessages(); List<MimeMessage> ret = new ArrayList<>(); try { for (StoredMessage msg : msgs) { String tos = GreenMailUtil.getAddressList(msg.getMimeMessage().getAllRecipients()); if (tos.toLowerCase().contains(domain)) { ret.add(msg.getMimeMessage()); } } } catch (MessagingException e) { throw new RuntimeException(e); } return ret.toArray(new MimeMessage[ret.size()]); }
private void updateQuota(final Quota quota, final String pQualifiedRootPrefix) { MailFolder folder = getMailbox( ImapConstants.USER_NAMESPACE + ImapConstants.HIERARCHY_DELIMITER + pQualifiedRootPrefix + ImapConstants.HIERARCHY_DELIMITER + quota.quotaRoot); try { for (Quota.Resource r : quota.resources) { if (STORAGE.equals(r.name)) { long size = 0; for (StoredMessage m : folder.getMessages()) { size += m.getMimeMessage().getSize(); } r.usage = size; } else if (MESSAGES.equals(r.name)) { r.usage = folder.getMessageCount(); } else { throw new IllegalStateException("Quota " + r.name + " not supported"); } } } catch (MessagingException ex) { throw new IllegalStateException("Can not update/verify quota " + quota, ex); } }
@Override public long[] search(SearchTerm searchTerm) { List<StoredMessage> matchedMessages = new ArrayList<>(); synchronized (mailMessages) { for (int i = 0; i < mailMessages.size(); i++) { StoredMessage mailMessage = mailMessages.get(i); // Update message sequence number for potential sequence set search // https://tools.ietf.org/html/rfc3501#page-10 mailMessage.updateMessageNumber(i + 1); if (searchTerm.match(mailMessage.getMimeMessage())) { matchedMessages.add(mailMessage); } } } long[] matchedUids = new long[matchedMessages.size()]; for (int i = 0; i < matchedUids.length; i++) { StoredMessage storedMessage = matchedMessages.get(i); long uid = storedMessage.getUid(); matchedUids[i] = uid; } return matchedUids; }
@Override public long copyMessage(long uid, MailFolder toFolder) throws FolderException { StoredMessage originalMessage = getMessage(uid); MimeMessage newMime; try { newMime = new MimeMessage(originalMessage.getMimeMessage()); } catch (MessagingException e) { throw new FolderException("Can not copy message " + uid + " to folder " + toFolder, e); } return toFolder.appendMessage(newMime, originalMessage.getFlags(), originalMessage.getReceivedDate()); }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); String[] cmdLine = cmd.split(" "); if (cmdLine.length < 3) throw new IllegalArgumentException("range and line count required"); String msgNumStr = cmdLine[1]; List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); return; } StoredMessage msg = msgList.get(0); int numLines = Integer.parseInt(cmdLine[2]); try (BufferedReader in = new BufferedReader( new StringReader(GreenMailUtil.getWholeMessage(msg.getMimeMessage())))) { conn.println("+OK"); copyHeaders(in, conn); copyLines(in, conn, numLines); } conn.println("."); } catch (Exception e) { conn.println("-ERR " + e); } }
@Override public void execute(Pop3Connection conn, Pop3State state, String cmd) { try { MailFolder inbox = state.getFolder(); String[] cmdLine = cmd.split(" "); String msgNumStr = cmdLine[1]; List<StoredMessage> msgList = inbox.getMessages(new MsgRangeFilter(msgNumStr, false)); if (msgList.size() != 1) { conn.println("-ERR no such message"); return; } StoredMessage msg = msgList.get(0); String email = GreenMailUtil.getWholeMessage(msg.getMimeMessage()); conn.println("+OK"); conn.print(new StringReader(email)); conn.println(); conn.println("."); msg.setFlag(Flags.Flag.SEEN, true); } catch (Exception e) { conn.println("-ERR " + e); } } }
conn.println("+OK " + msgNumStr + " " + msg.getMimeMessage().getSize()); } else { List<StoredMessage> messages = inbox.getNonDeletedMessages(); conn.println("+OK"); for (StoredMessage msg : messages) { conn.println(inbox.getMsn(msg.getUid()) + " " + msg.getMimeMessage().getSize());