@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 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); }
if (fetch.isSetSeen() && !message.isSet(Flags.Flag.SEEN)) { folder.setFlags(FLAGS_SEEN, true, message.getUid(), folder, useUids); message.setFlags(FLAGS_SEEN, true); ensureFlagsResponse = true; response.append(MessageFlags.format(message.getFlags())); response.append(" INTERNALDATE \""); response.append(message.getAttributes().getReceivedDateAsString()); response.append('\"'); response.append(message.getAttributes().getSize()); response.append(message.getAttributes().getEnvelope()); response.append(message.getAttributes().getBodyStructure(false)); response.append(message.getAttributes().getBodyStructure(true)); response.append(message.getUid()); MimeMessage mimeMessage = message.getMimeMessage(); try { handleBodyFetch(mimeMessage, sectionSpecifier, partial, response);
@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; }
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]); }
@Override public void replaceFlags(Flags flags, long uid, FolderListener silentListener, boolean addUid) throws FolderException { int msn = getMsn(uid); StoredMessage message = mailMessages.get(msn - 1); message.setFlags(MessageFlags.ALL_FLAGS, false); message.setFlags(flags, true); Long uidNotification = null; if (addUid) { uidNotification = uid; } notifyFlagUpdate(msn, message.getFlags(), uidNotification, silentListener); }
@Override public void expunge(List<FolderListener> folderListeners, IdRange[] idRanges) { synchronized (mailMessages) { for (int i = mailMessages.size() - 1; i >= 0; i--) { StoredMessage message = mailMessages.get(i); if (message.isSet(Flags.Flag.DELETED) && (idRanges == null || IdRange.containsUid(idRanges, message.getUid()))) { expungeMessage(i + 1, folderListeners); // MSNs start counting at 1 } } } }
@Override public StoredMessage getMessage(long uid) { synchronized (mailMessages) { for (StoredMessage mailMessage : mailMessages) { if (mailMessage.getUid() == uid) { return mailMessage; } } } return null; }
@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); } } }
break; case ARRIVAL: compareResult = doCompare(m1.getReceivedDate(), m2.getReceivedDate()); break; case CC: break; case DATE: compareResult = doCompare(m1.getMimeMessage().getSentDate(), m2.getMimeMessage().getSentDate()); break; case FROM: break; case SIZE: compareResult = doCompare(m1.getMimeMessage().getSize(), m2.getMimeMessage().getSize()); break; case SUBJECT: compareResult = doCompare(m1.getMimeMessage().getSubject(), m2.getMimeMessage().getSubject()); break; case TO:
@Override public int getUnseenCount() { int count = 0; synchronized (mailMessages) { for (StoredMessage message : mailMessages) { if (!message.isSet(Flags.Flag.SEEN)) { count++; } } } return count; }
@Override public List<StoredMessage> getNonDeletedMessages() { List<StoredMessage> ret = new ArrayList<>(); synchronized (mailMessages) { for (StoredMessage mailMessage : mailMessages) { if (!mailMessage.getFlags().contains(Flags.Flag.DELETED)) { ret.add(mailMessage); } } } return ret; }
@Override public long appendMessage(MimeMessage message, Flags flags, Date receivedDate) { final long uid = nextUid.getAndIncrement(); try { message.setFlags(flags, true); message.setFlag(Flags.Flag.RECENT, true); } catch (MessagingException e) { throw new IllegalStateException("Can not set flags", e); } StoredMessage storedMessage = new StoredMessage(message, receivedDate, uid); int newMsn; synchronized (mailMessages) { mailMessages.add(storedMessage); newMsn = mailMessages.size(); } // Notify all the listeners of the new message synchronized (_mailboxListeners) { for (FolderListener _mailboxListener : _mailboxListeners) { _mailboxListener.added(newMsn); } } return uid; }
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 void setFlags(Flags flags, boolean value, long uid, FolderListener silentListener, boolean addUid) throws FolderException { int msn = getMsn(uid); StoredMessage message = mailMessages.get(msn - 1); message.setFlags(flags, value); Long uidNotification = null; if (addUid) { uidNotification = uid; } notifyFlagUpdate(msn, message.getFlags(), uidNotification, silentListener); }
@Override public void expunge(List<FolderListener> mailboxListeners, IdRange[] idRanges) { int i = 1; synchronized (mailMessages) { for (final Iterator<Map.Entry<Long, StoredMessage>> messageEntryIt = mailMessages.entrySet().iterator(); messageEntryIt.hasNext(); ) { final Map.Entry<Long, StoredMessage> messageEntry = messageEntryIt.next(); if (messageEntry.getValue().isSet(Flags.Flag.DELETED) && (idRanges == null || IdRange.containsUid(idRanges, messageEntry.getValue().getUid()))) { // Notify all the listeners of the pending delete synchronized (mailboxListeners) { messageEntryIt.remove(); for (FolderListener expungeListener : mailboxListeners) { expungeListener.expunged(i); } } } i++; } } }
@Override public void add(StoredMessage storedMessage) { mailMessages.put(storedMessage.getUid(), storedMessage); }
@Override public int getFirstUnseen() { synchronized (mailMessages) { int i = 1; for (StoredMessage message : mailMessages.values()) { if (!message.isSet(Flags.Flag.SEEN)) { return i; } i++; } } return -1; }
@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()]); } }