Search in sources :

Example 11 with Flags

use of jakarta.mail.Flags in project exist by eXist-db.

the class MessageListFunctions method getMessageListAsXML.

private Sequence getMessageListAsXML(Sequence[] args, Sequence contextSequence) throws XPathException {
    Message[] msgList;
    Sequence ret = Sequence.EMPTY_SEQUENCE;
    // was a msgList handle specified?
    if (args[0].isEmpty()) {
        throw (new XPathException(this, "Message List handle not specified"));
    }
    // get the MessageList
    long msgListHandle = ((IntegerValue) args[0].itemAt(0)).getLong();
    msgList = MailModule.retrieveMessageList(context, msgListHandle);
    if (msgList == null) {
        throw (new XPathException(this, "Invalid Message List handle specified"));
    }
    if (msgList.length > 0) {
        boolean includeHeaders = args[1].effectiveBooleanValue();
        context.pushDocumentContext();
        try {
            MemTreeBuilder builder = context.getDocumentBuilder();
            builder.startDocument();
            builder.startElement(new QName("messages", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
            builder.addAttribute(new QName("count", null, null), String.valueOf(msgList.length));
            try {
                for (Message message : msgList) {
                    builder.startElement(new QName("message", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                    builder.addAttribute(new QName("number", null, null), String.valueOf(message.getMessageNumber()));
                    // Sent Date
                    if (message.getSentDate() != null) {
                        builder.startElement(new QName("sent", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                        builder.characters(formatDate(message.getSentDate()));
                        builder.endElement();
                    }
                    // Received Date
                    if (message.getReceivedDate() != null) {
                        builder.startElement(new QName("received", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                        builder.characters(formatDate(message.getReceivedDate()));
                        builder.endElement();
                    }
                    // From
                    if (message.getFrom() != null) {
                        builder.startElement(new QName("from", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                        builder.characters(message.getFrom()[0].toString());
                        builder.endElement();
                    }
                    // Recipients
                    builder.startElement(new QName("recipients", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                    // To Recipients
                    Address[] toAddresses = message.getRecipients(Message.RecipientType.TO);
                    if (toAddresses != null) {
                        for (Address to : toAddresses) {
                            builder.startElement(new QName("recipient", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                            builder.addAttribute(new QName("type", null, null), "to");
                            builder.characters(to.toString());
                            builder.endElement();
                        }
                    }
                    // cc Recipients
                    Address[] ccAddresses = message.getRecipients(Message.RecipientType.CC);
                    if (ccAddresses != null) {
                        for (Address ccAddress : ccAddresses) {
                            builder.startElement(new QName("recipient", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                            builder.addAttribute(new QName("type", null, null), "cc");
                            builder.characters(ccAddress.toString());
                            builder.endElement();
                        }
                    }
                    // bcc Recipients
                    Address[] bccAddresses = message.getRecipients(Message.RecipientType.BCC);
                    if (bccAddresses != null) {
                        for (Address bccAddress : bccAddresses) {
                            builder.startElement(new QName("recipient", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                            builder.addAttribute(new QName("type", null, null), "bcc");
                            builder.characters(bccAddress.toString());
                            builder.endElement();
                        }
                    }
                    builder.endElement();
                    // Flags
                    Flags flags = message.getFlags();
                    Flags.Flag[] systemFlags = flags.getSystemFlags();
                    String[] userFlags = flags.getUserFlags();
                    if (systemFlags.length > 0 || userFlags.length > 0) {
                        builder.startElement(new QName("flags", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                        for (Flags.Flag systemFlag : systemFlags) {
                            if (systemFlag == Flags.Flag.ANSWERED) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "answered");
                                builder.endElement();
                            } else if (systemFlag == Flags.Flag.DELETED) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "deleted");
                                builder.endElement();
                            } else if (systemFlag == Flags.Flag.DRAFT) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "draft");
                                builder.endElement();
                            } else if (systemFlag == Flags.Flag.FLAGGED) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "flagged");
                                builder.endElement();
                            } else if (systemFlag == Flags.Flag.RECENT) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "recent");
                                builder.endElement();
                            } else if (systemFlag == Flags.Flag.SEEN) {
                                builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("type", null, null), "seen");
                                builder.endElement();
                            }
                        }
                        for (String userFlag : userFlags) {
                            builder.startElement(new QName("flag", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                            builder.addAttribute(new QName("type", null, null), "user");
                            builder.addAttribute(new QName("value", null, null), userFlag);
                            builder.endElement();
                        }
                        builder.endElement();
                    }
                    if (includeHeaders) {
                        Enumeration headers = message.getAllHeaders();
                        if (headers.hasMoreElements()) {
                            builder.startElement(new QName("headers", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                            while (headers.hasMoreElements()) {
                                Header header = (Header) headers.nextElement();
                                builder.startElement(new QName("header", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                                builder.addAttribute(new QName("name", null, null), header.getName());
                                builder.addAttribute(new QName("value", null, null), header.getValue());
                                builder.endElement();
                            }
                            builder.endElement();
                        }
                    }
                    // Subject
                    builder.startElement(new QName("subject", MailModule.NAMESPACE_URI, MailModule.PREFIX), null);
                    builder.characters(message.getSubject());
                    builder.endElement();
                    builder.endElement();
                }
            } catch (MessagingException me) {
                throw (new XPathException(this, "Failed to retrieve messages from list", me));
            }
            builder.endElement();
            ret = (NodeValue) builder.getDocument().getDocumentElement();
        } finally {
            context.popDocumentContext();
        }
    }
    return (ret);
}
Also used : Enumeration(java.util.Enumeration) Message(jakarta.mail.Message) Address(jakarta.mail.Address) XPathException(org.exist.xquery.XPathException) MessagingException(jakarta.mail.MessagingException) QName(org.exist.dom.QName) IntegerValue(org.exist.xquery.value.IntegerValue) Sequence(org.exist.xquery.value.Sequence) Flags(jakarta.mail.Flags) MemTreeBuilder(org.exist.dom.memtree.MemTreeBuilder) Header(jakarta.mail.Header)

Example 12 with Flags

use of jakarta.mail.Flags in project exist by eXist-db.

the class MessageListFunctions method parseFlagTerm.

private SearchTerm parseFlagTerm(Node terms) throws XPathException {
    SearchTerm st = null;
    String flag = ((Element) terms).getAttribute("flag");
    String value = ((Element) terms).getAttribute("value");
    if (StringUtils.isEmpty(value)) {
        throw (new XPathException(this, "value not specified for term with type: " + ((Element) terms).getAttribute("type")));
    }
    if (flag != null && !flag.isEmpty()) {
        Flags flags = null;
        if (flag.equalsIgnoreCase("answered")) {
            flags = new Flags(Flags.Flag.ANSWERED);
        } else if (flag.equalsIgnoreCase("deleted")) {
            flags = new Flags(Flags.Flag.DELETED);
        } else if (flag.equalsIgnoreCase("draft")) {
            flags = new Flags(Flags.Flag.DRAFT);
        } else if (flag.equalsIgnoreCase("recent")) {
            flags = new Flags(Flags.Flag.RECENT);
        } else if (flag.equalsIgnoreCase("seen")) {
            flags = new Flags(Flags.Flag.SEEN);
        } else {
            throw (new XPathException(this, "Invalid flag: " + flag + ", for term with type: " + ((Element) terms).getAttribute("type")));
        }
        st = new FlagTerm(flags, value.equalsIgnoreCase("true"));
    } else {
        throw (new XPathException(this, "flag attribute must be specified for term with type: " + ((Element) terms).getAttribute("type")));
    }
    return (st);
}
Also used : FlagTerm(jakarta.mail.search.FlagTerm) XPathException(org.exist.xquery.XPathException) Element(org.w3c.dom.Element) Flags(jakarta.mail.Flags) SearchTerm(jakarta.mail.search.SearchTerm)

Example 13 with Flags

use of jakarta.mail.Flags in project spring-integration by spring-projects.

the class AbstractMailReceiver method setMessageFlags.

private void setMessageFlags(Message[] filteredMessages) throws MessagingException {
    boolean recentFlagSupported = false;
    Flags flags = getFolder().getPermanentFlags();
    if (flags != null) {
        recentFlagSupported = flags.contains(Flags.Flag.RECENT);
    }
    for (Message message : filteredMessages) {
        if (!recentFlagSupported) {
            if (flags != null && flags.contains(Flags.Flag.USER)) {
                this.logger.debug(() -> "USER flags are supported by this mail server. Flagging message with '" + this.userFlag + "' user flag");
                Flags siFlags = new Flags();
                siFlags.add(this.userFlag);
                message.setFlags(siFlags, true);
            } else {
                this.logger.debug("USER flags are not supported by this mail server. " + "Flagging message with system flag");
                message.setFlag(Flags.Flag.FLAGGED, true);
            }
        }
        setAdditionalFlags(message);
    }
}
Also used : MimeMessage(jakarta.mail.internet.MimeMessage) Message(jakarta.mail.Message) Flags(jakarta.mail.Flags)

Example 14 with Flags

use of jakarta.mail.Flags in project spring-integration by spring-projects.

the class ImapMailReceiverTests method testImapLifecycleForRaceCondition.

// see INT-1801
@Test
public void testImapLifecycleForRaceCondition() throws Exception {
    for (int i = 0; i < 100; i++) {
        final ImapMailReceiver receiver = new ImapMailReceiver("imap://foo");
        Store store = mock(Store.class);
        Folder folder = mock(Folder.class);
        given(folder.exists()).willReturn(true);
        given(folder.isOpen()).willReturn(true);
        given(folder.search(Mockito.any())).willReturn(new Message[] {});
        given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder);
        given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
        DirectFieldAccessor df = new DirectFieldAccessor(receiver);
        df.setPropertyValue("store", store);
        receiver.setBeanFactory(mock(BeanFactory.class));
        receiver.afterPropertiesSet();
        new Thread(() -> {
            try {
                receiver.receive();
            } catch (jakarta.mail.MessagingException e) {
                if (e.getCause() instanceof NullPointerException) {
                    failed.getAndIncrement();
                }
            }
        }).start();
        new Thread(() -> {
            try {
                receiver.destroy();
            } catch (Exception ignore) {
            // ignore
            }
        }).start();
    }
    assertThat(failed.get()).isEqualTo(0);
}
Also used : MessagingException(jakarta.mail.MessagingException) URLName(jakarta.mail.URLName) Store(jakarta.mail.Store) Flags(jakarta.mail.Flags) Folder(jakarta.mail.Folder) IMAPFolder(com.sun.mail.imap.IMAPFolder) AddressException(jakarta.mail.internet.AddressException) MessagingException(jakarta.mail.MessagingException) IOException(java.io.IOException) FolderClosedException(jakarta.mail.FolderClosedException) DirectFieldAccessor(org.springframework.beans.DirectFieldAccessor) BeanFactory(org.springframework.beans.factory.BeanFactory) Test(org.junit.jupiter.api.Test) ServerSetupTest(com.icegreen.greenmail.util.ServerSetupTest)

Example 15 with Flags

use of jakarta.mail.Flags in project spring-integration by spring-projects.

the class ImapMailReceiverTests method testNoInitialIdleDelayWhenRecentNotSupported.

@SuppressWarnings("resource")
@Test
public void testNoInitialIdleDelayWhenRecentNotSupported() throws Exception {
    ImapIdleChannelAdapter adapter = this.context.getBean("simpleAdapter", ImapIdleChannelAdapter.class);
    QueueChannel channel = new QueueChannel();
    adapter.setOutputChannel(channel);
    adapter.setReconnectDelay(1);
    ImapMailReceiver receiver = new ImapMailReceiver("imap:foo");
    receiver = spy(receiver);
    receiver.setBeanFactory(mock(BeanFactory.class));
    receiver.afterPropertiesSet();
    final IMAPFolder folder = mock(IMAPFolder.class);
    given(folder.getPermanentFlags()).willReturn(new Flags(Flags.Flag.USER));
    given(folder.isOpen()).willReturn(false).willReturn(true);
    given(folder.exists()).willReturn(true);
    DirectFieldAccessor adapterAccessor = new DirectFieldAccessor(adapter);
    adapterAccessor.setPropertyValue("mailReceiver", receiver);
    Field storeField = AbstractMailReceiver.class.getDeclaredField("store");
    storeField.setAccessible(true);
    Store store = mock(Store.class);
    given(store.isConnected()).willReturn(true);
    given(store.getFolder(Mockito.any(URLName.class))).willReturn(folder);
    storeField.set(receiver, store);
    willAnswer(invocation -> folder).given(receiver).getFolder();
    MimeMessage mailMessage = mock(MimeMessage.class);
    Flags flags = mock(Flags.class);
    given(mailMessage.getFlags()).willReturn(flags);
    final Message[] messages = new Message[] { mailMessage };
    final AtomicInteger shouldFindMessagesCounter = new AtomicInteger(2);
    willAnswer(invocation -> {
        /*
			 * Return the message from first invocation of waitForMessages()
			 * and in receive(); then return false in the next call to
			 * waitForMessages() so we enter idle(); counter will be reset
			 * to 1 in the mocked idle().
			 */
        if (shouldFindMessagesCounter.decrementAndGet() >= 0) {
            return messages;
        } else {
            return new Message[0];
        }
    }).given(receiver).searchForNewMessages();
    willAnswer(invocation -> null).given(receiver).fetchMessages(messages);
    willAnswer(invocation -> {
        Thread.sleep(300);
        shouldFindMessagesCounter.set(1);
        return null;
    }).given(folder).idle(true);
    adapter.start();
    /*
		 * Idle takes 5 seconds; if all is well, we should receive the first message
		 * before then.
		 */
    assertThat(channel.receive(3000)).isNotNull();
    // We should not receive any more until the next idle elapses
    assertThat(channel.receive(100)).isNull();
    assertThat(channel.receive(6000)).isNotNull();
    adapter.stop();
}
Also used : QueueChannel(org.springframework.integration.channel.QueueChannel) MimeMessage(jakarta.mail.internet.MimeMessage) Message(jakarta.mail.Message) IMAPFolder(com.sun.mail.imap.IMAPFolder) URLName(jakarta.mail.URLName) Store(jakarta.mail.Store) Flags(jakarta.mail.Flags) Field(java.lang.reflect.Field) MimeMessage(jakarta.mail.internet.MimeMessage) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) DirectFieldAccessor(org.springframework.beans.DirectFieldAccessor) BeanFactory(org.springframework.beans.factory.BeanFactory) Test(org.junit.jupiter.api.Test) ServerSetupTest(com.icegreen.greenmail.util.ServerSetupTest)

Aggregations

Flags (jakarta.mail.Flags)24 BeanFactory (org.springframework.beans.factory.BeanFactory)19 Test (org.junit.jupiter.api.Test)17 Folder (jakarta.mail.Folder)16 Message (jakarta.mail.Message)16 Field (java.lang.reflect.Field)16 MimeMessage (jakarta.mail.internet.MimeMessage)15 IMAPFolder (com.sun.mail.imap.IMAPFolder)13 DirectFieldAccessor (org.springframework.beans.DirectFieldAccessor)12 ServerSetupTest (com.icegreen.greenmail.util.ServerSetupTest)11 Store (jakarta.mail.Store)5 URLName (jakarta.mail.URLName)5 SearchTerm (jakarta.mail.search.SearchTerm)5 MessagingException (jakarta.mail.MessagingException)3 FlagTerm (jakarta.mail.search.FlagTerm)3 NotTerm (jakarta.mail.search.NotTerm)3 Method (java.lang.reflect.Method)3 QueueChannel (org.springframework.integration.channel.QueueChannel)3 FolderClosedException (jakarta.mail.FolderClosedException)2 AddressException (jakarta.mail.internet.AddressException)2