Follow Us on Twitter

Poll a Microsoft Exchange mailbox from OSB using DavMail

by Laurens van der Starre on March 24, 2016 · 4 comments

The Oracle Service Bus has built in features to poll an IMAP of POP3 mail account. There are loads of excellent blog posts that exactly describe how to do it. However, when the mail server happens to be a Microsoft Exchange server, things become shady. Exchange’s IMAP implementation tends to be not really that compatible, and the server log will fill up with stacktraces such as:

javax.mail.MessagingException: Connect failed;
  nested exception is:
        java.net.ConnectException: Connection timed out
javax.mail.MessagingException: Connect failed;
  nested exception is:
        java.net.ConnectException: Connection timed out
        at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:161)
        at javax.mail.Service.connect(Service.java:288)
        at com.bea.wli.sb.transports.email.util.MailInbox.<init>(MailInbox.java:49)
        at com.bea.wli.sb.transports.email.EmailWorkPartitioningAgent.execute(EmailWorkPartitioningAgent.java:100)
        at com.bea.wli.sb.transports.poller.TransportTimerListener.run(TransportTimerListener.java:74)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)
Caused by: java.net.ConnectException: Connection timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)

Of course we can connect using the Exchange Web Services (EWS) using the OSB, but that is loads of work. Luckily there is DavMail. DavMail is an gateway that sits in between Exchange and your third party mail clients. Using DavMail, you can connect using simple POP3 or IMAP protocols to DavMail which in turn connects to Exchange using the EWS. DavMail is build in java, and runs happily on WebLogic Server.

So, download DavMail’s WAR distribution for SourceForge. Unpack the WAR-file and edit the properties file in WEB-INF/classes.

Set is to run in Server mode, and let it know where the EWS is:

 Server or workstation mode
davmail.server=true
# connection mode auto, EWS or WebDav
davmail.enableEws=true
# base Exchange OWA or EWS url
davmail.url=https://<<your exchange server>>/ews/Exchange.asmx

Define the locally used ports to which the OSB can connect (note that ports below 1024 require root on Linux):

# Listener ports
davmail.caldavPort=5280
davmail.imapPort=5143
davmail.ldapPort=5389
davmail.popPort=5110
davmail.smtpPort=5025

Allow connections to DavMail:

# allow remote connection to DavMail
davmail.allowRemote=true

I recommend exposing DavMail only to OSB, so let it bind to localhost:

# bind server sockets to a specific address
davmail.bindAddress=localhost

Don’t make it difficult for yourself, and make to local connections plain:

# disable SSL for specified listeners
davmail.ssl.nosecurecaldav=true
davmail.ssl.nosecureimap=true
davmail.ssl.nosecureldap=true
davmail.ssl.nosecurepop=true
davmail.ssl.nosecuresmtp=true

That should do it. Of course you can tinker with the other settings (like log file locations etc.).

If it happens to be the case that your Exchange server has self-signed SSL certificates, please make sure to add them to your trust store. You can of course hack these certificates into your cacerts keystore that is part of the JVM, or (better solution) add them to your managed server’s trust store. Please make sure the trust store is loaded by WebLogic: edit the <DOMAIN_HOME>/bin/setDomainEnv.sh and add

 -Djavax.net.ssl.trustStore=yourtuststore.jks -Djavax.net.ssl.trustStorePassword=...."

to EXTRA_JAVA_PROPERTIES.

Now pack the WAR-file using your favorite tool, and deploy it to your webLogic server as an application. You can now create an OSB proxy service that polls an Exchange server by connecting to your DavMail gateway on your local IMAP of POP3 ports.

One final note: if you happen to run into the following error while using IMAP:

javax.mail.MessageRemovedException
        at com.sun.mail.imap.IMAPMessage.checkExpunged(IMAPMessage.java:220)
        at com.sun.mail.imap.IMAPMessage.getRecipients(IMAPMessage.java:286)
        at com.bea.wli.sb.transports.email.EmailWorkPartitioningAgent.createPublishedTask(EmailWorkPartitioningAgent.java:381)
        at com.bea.wli.sb.transports.email.EmailWorkPartitioningAgent.processInboxMessages(EmailWorkPartitioningAgent.java:256)
        at com.bea.wli.sb.transports.email.EmailWorkPartitioningAgent.execute(EmailWorkPartitioningAgent.java:104)
        at com.bea.wli.sb.transports.poller.TransportTimerListener.run(TransportTimerListener.java:74)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)

then there seems to be some kind of threading issue with the Post Read Action defined in the OSB proxy. Spare yourself the trouble and switch to POP3. That’ll work.

Happy coding!

Poll a Microsoft Exchange mailbox from OSB using DavMail, 4.0 out of 5 based on 1 rating
Ratings:
VN:D [1.9.22_1171]
Rating: 4.0/5 (1 vote cast)

{ 4 comments… read them below or add one }

ananth May 6, 2016 at 6:12 am

Thanks for this great information. That’s a awesome article you posted.
I found the post very useful as well as interesting.

Reply

Office 365 Support April 29, 2018 at 8:37 am

Im impressed, I should say. Pretty rarely do I come across a blog thats each informative and entertaining, and let me let you know, youve hit the nail on the head. Your blog is significant; the problem is some thing that not sufficient men and women are talking intelligently about. Im seriously happy that I stumbled across this in my search for one thing relating to this issue.

Office 365 Support

Reply

Office 365 Migrations May 6, 2018 at 12:16 pm

I’m in complete agreement with a lot of the information in the following paragraphs. You certainly are a special article writer have real profit put your own views directly into apparent phrases. Anyone will be able to understand why.

Office 365 Migrations

Reply

Office 365 Migration Support May 12, 2018 at 8:11 pm

It is an incredible weblog in the senses and very participating too. Great job! Probably not much comes from an early blogger like me, but I can guess after having fun with your posts. Nice grammar and vocabulary is not like many blogs. You actually know very well that you are talking too much. That’s what you want me to learn more. Your blog has turned into a stepping stone for me, my fellow blogger. Thank you for the detailed journey.

Office 365 Migration Support

Reply

Leave a Comment

 

Previous post:

Next post:

About Whitehorses
Company profile
Services
Technology

Whitehorses website

Home page
Whitebooks
Jobs

Follow us
Blog post RSS
Comment RSS
Twitter