1
votes

Anyone has a working example of reading mails from IMAP over SSL (IMAPS) from Gmail?

Some info I have gathered, but without any success:

The thing just sits there doing nothing.

Here is my flow:

<mule>
<imaps:connector
        name="imapsConnector"
        checkFrequency="5000"
        backupEnabled="true"
        mailboxFolder="INBOX"
        deleteReadMessages="false"
        doc:name="IMAP">
        <imaps:tls-client />
        <imaps:tls-trust-store />
    </imaps:connector>

    <expression-transformer
        name="returnAttachments"
        doc:name="Expression">
        <return-argument
            evaluator="attachments-list"
            expression="*.csv" />
    </expression-transformer>

    <flow
        name="GmailImapsFetch"
        doc:name="Flow1_IMAP_fetch">
        <imaps:inbound-endpoint
            user="your_username%40gmail.com"
            password="your_password"
            host="imap.googlemail.com"
            port="993"
            transformer-refs="returnAttachments"
            disableTransportTransformer="true"
            doc:name="IMAP"
            connector-ref="imapsConnector"
            responseTimeout="10000" />
        <!-- <collection-splitter doc:name="Collection Splitter" /> -->
        <logger message="#[payload]" />
        <file:outbound-endpoint
            path="/tmp/gmail-#[function:datestamp].dat"
            doc:name="File">
            <expression-transformer>
                <return-argument
                    expression="payload.inputStream"
                    evaluator="groovy" />
            </expression-transformer>
        </file:outbound-endpoint>

    </flow>
</mule>

Mule Studio (1.3.2) complains that the XML is malformed (it doesn't like the expression-transformer thingie), but it doesn't complain at runtime.

Anyone has this running?

Thanks.

--

Log:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Starting app 'mulelab'                                   +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[23-01-13 11:07:01] [DEBUG] Applying lifecycle phase: org.mule.lifecycle.phases.MuleContextStartPhase@14b03ea for registry: DefaultRegistryBroker
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: org.mule.util.queue.TransactionalQueueManager@63edf84f
[23-01-13 11:07:01] [ INFO] Starting ResourceManager
[23-01-13 11:07:01] [DEBUG] Restore retrieved 0 objects
[23-01-13 11:07:01] [DEBUG] Restore retrieved 0 objects
[23-01-13 11:07:01] [DEBUG] Restore retrieved 0 objects
[23-01-13 11:07:01] [ INFO] Started ResourceManager
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: FileConnector
. . .   
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: ImapsConnector
{
  name=imapsConnector
  lifecycle=initialise
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=false
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}

[23-01-13 11:07:01] [DEBUG] Connecting: ImapsConnector
{
  name=imapsConnector
  lifecycle=initialise
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=false
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}

[23-01-13 11:07:01] [ INFO] Connected: ImapsConnector
{
  name=imapsConnector
  lifecycle=initialise
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}

[23-01-13 11:07:01] [ INFO] Starting: ImapsConnector
{
  name=imapsConnector
  lifecycle=initialise
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}

[23-01-13 11:07:01] [ INFO] Starting connector: imapsConnector
[23-01-13 11:07:01] [DEBUG] Successfully connected to ImapsConnector
{
  name=imapsConnector
  lifecycle=initialise
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=false
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}

[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: org.mule.transport.servlet.jetty.JettyWebappServerAgent@26945b95
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: org.mule.module.management.agent.JmxAgent@320f6398
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: SedaModel{_muleSystemModel}
[23-01-13 11:07:01] [ INFO] Starting model: _muleSystemModel
[23-01-13 11:07:01] [DEBUG] lifecycle phase: start for object: Flow{GmailImapsFetch}
[23-01-13 11:07:01] [ INFO] Starting flow: GmailImapsFetch
[23-01-13 11:07:01] [ INFO] Starting service: GmailImapsFetch.stage1
[23-01-13 11:07:01] [ INFO] Registering listener: GmailImapsFetch on endpointUri: imaps://your_username%40gmail.com:****@imap.googlemail.com:993
[23-01-13 11:07:01] [ INFO] Loading default inbound transformer: org.mule.transport.email.transformers.EmailMessageToString
[23-01-13 11:07:01] [DEBUG] Setting transformer name to: EmailMessageToString#1868577756
[23-01-13 11:07:01] [ INFO] Initialising: 'null'. Object is: RetrieveMessageReceiver
[23-01-13 11:07:01] [DEBUG] Connecting: RetrieveMessageReceiver{this=22fe135d, [email protected], endpoint=imaps://your_username%40gmail.com:****@imap.googlemail.com:993}
[23-01-13 11:07:01] [ INFO] Connecting clusterizable message receiver
[23-01-13 11:07:01] [DEBUG] No Authenticator set on connector: imapsConnector; using default.
[23-01-13 11:07:01] [ INFO] Defaulting mule.email.imaps trust store to client Key Store
[23-01-13 11:07:01] [DEBUG] MuleSession local properties =============
[23-01-13 11:07:01] [DEBUG] mail.imaps.ssl: true
[23-01-13 11:07:01] [DEBUG] mail.debug: true
[23-01-13 11:07:01] [DEBUG] mail.imaps.socketFactory.class: org.mule.transport.email.ImapsSocketFactory
[23-01-13 11:07:01] [DEBUG] mail.imaps.socketFactory.fallback: false
[23-01-13 11:07:01] [DEBUG] mail.imap.host: imap.googlemail.com
[23-01-13 11:07:01] [DEBUG] mail.imap.auth: true
[23-01-13 11:07:01] [DEBUG] mail.imap.socketFactory.port: 993
[23-01-13 11:07:01] [DEBUG] mail.imap.rsetbeforequit: true
[23-01-13 11:07:01] [DEBUG] skipped 0
[23-01-13 11:07:01] [DEBUG] System global properties =============
[23-01-13 11:07:01] [DEBUG] mule.home: /home/pakmans/workspace/.mule
[23-01-13 11:07:01] [DEBUG] mule.encoding: UTF-8
[23-01-13 11:07:01] [DEBUG] skipped 57
[23-01-13 11:07:01] [DEBUG] Creating mail session: host = imap.googlemail.com, port = 993, user = [email protected], pass = ********
[23-01-13 11:07:01] [DEBUG] creating: true; mule.email.imaps
[23-01-13 11:07:01] [DEBUG] creating factory
[23-01-13 11:07:01] [ INFO] Using org.mule.api.security.provider.SunSecurityProviderInfo
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.trustStore -> null
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.trustStoreType -> jks
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.trustStorePassword -> null
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.trustManagerAlgorithm -> SunX509
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.keyStore -> .keystore
[23-01-13 11:07:01] [DEBUG] Unable to load resource from the file system: /home/pakmans/workspace/mulelab/.keystore
[23-01-13 11:07:01] [DEBUG] Unable to load resource .keystore from the classpath
[23-01-13 11:07:01] [DEBUG] Normalised keyStore path to: null
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.keyStoreType -> jks
[23-01-13 11:07:01] [DEBUG] mule.email.imaps.ssl.keyStorePassword -> null
[23-01-13 11:07:01] [DEBUG] initialising: anon true
[23-01-13 11:07:01] [ INFO] Defaulting mule.email.imaps trust store to client Key Store
[23-01-13 11:07:03] [DEBUG] Connected: imaps://your_username%40gmail.com:****@imap.googlemail.com:993
[23-01-13 11:07:03] [ INFO] Starting: 'null'. Object is: RetrieveMessageReceiver
[23-01-13 11:07:03] [ INFO] Starting clusterizable message receiver
[23-01-13 11:07:03] [DEBUG] RetrieveMessageReceiver@22fe135d scheduled ScheduledThreadPoolExecutor$ScheduledFutureTask@6fa37fac with 5000 MILLISECONDS polling frequency
[23-01-13 11:07:03] [DEBUG] lifecycle phase: start for object: DefaultInboundEndpoint{endpointUri=imaps://your_username%40gmail.com:<password>@imap.googlemail.com, connector=ImapsConnector
{
  name=imapsConnector
  lifecycle=start
  this=4bb4df9c
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[imaps]
  serviceOverrides=<none>
}
,  name='endpoint.imaps.your_username.gmail.com', mep=ONE_WAY, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=true}
[23-01-13 11:07:03] [DEBUG] lifecycle phase: start for object: org.mule.DefaultMuleContext@6a9effe0
[23-01-13 11:07:03] [ INFO] Reload interval: 3000
[23-01-13 11:07:03] [DEBUG] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'wrapper-manager' is defined
[23-01-13 11:07:03] [DEBUG] registering key/object wrapper-manager/org.mule.module.management.agent.WrapperManagerAgent@4c825cf3
[23-01-13 11:07:03] [DEBUG] applying processors
[23-01-13 11:07:03] [DEBUG] applying lifecycle to object: org.mule.module.management.agent.WrapperManagerAgent@4c825cf3
[23-01-13 11:07:03] [ INFO] This JVM hasn't been launched by the wrapper, the agent will not run.
[23-01-13 11:07:03] [DEBUG] Registering statistics with name: Mule.mulelab:type=Statistics,name=AllStatistics
[23-01-13 11:07:03] [DEBUG] Registering mule with name: Mule.mulelab:name=MuleContext
[23-01-13 11:07:03] [DEBUG] Registering configuration with name: Mule.mulelab:name=Configuration
[23-01-13 11:07:03] [DEBUG] Registering model with name: Mule.mulelab:type=Model,name="_muleSystemModel(seda)"
[23-01-13 11:07:03] [DEBUG] Registering service with name: Mule.mulelab:type=Flow,name="GmailImapsFetch"
[23-01-13 11:07:03] [DEBUG] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'endpoint.imaps.your_username.gmail.com' is defined
[23-01-13 11:07:03] [ INFO] Attempting to register service with name: Mule.mulelab:type=Endpoint,service="GmailImapsFetch",connector=imapsConnector,name="endpoint.imaps.your_username.gmail.com"
[23-01-13 11:07:03] [ INFO] Registered Endpoint Service with name: Mule.mulelab:type=Endpoint,service="GmailImapsFetch",connector=imapsConnector,name="endpoint.imaps.your_username.gmail.com"
[23-01-13 11:07:03] [DEBUG] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'connector.file.mule.default.1' is defined
[23-01-13 11:07:03] [DEBUG] Attempting to register service with name: Mule.mulelab:type=Connector,name="connector.file.mule.default.1"
[23-01-13 11:07:03] [ INFO] Registered Connector Service with name Mule.mulelab:type=Connector,name="connector.file.mule.default.1"
[23-01-13 11:07:03] [DEBUG] org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'imapsConnector.1' is defined
[23-01-13 11:07:03] [DEBUG] Attempting to register service with name: Mule.mulelab:type=Connector,name="imapsConnector.1"
[23-01-13 11:07:03] [ INFO] Registered Connector Service with name Mule.mulelab:type=Connector,name="imapsConnector.1"
[23-01-13 11:07:03] [DEBUG] Registering application statistics with name: Mule.mulelab:type=Application,name="application totals"
[23-01-13 11:07:03] [ INFO] 
**********************************************************************
* Application: mulelab                                               *
* OS encoding: UTF-8, Mule encoding: UTF-8                           *
*                                                                    *
* Agents Running:                                                    *
*   JMX Agent                                                        *
**********************************************************************
[23-01-13 11:07:03] [ INFO] 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ Started app 'mulelab'                                    +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1
If you run with the logs at DEBUG level, what do you see?David Dossot
Thanks, I was trying to see if this line in the receiver logger.debug("ignoring exception: " + e.getMessage()); was called and it's not. The only option to learn more about the issue that I can think of is to step debug in org.mule.transport.email.RetrieveMessageReceiver.poll(). I don't have a spare GMail account so I can't do it myself, sorry.David Dossot
I have debugged your suggested class, and I can see that it actually does connect and it actually retreives 7 messages (why 7? there are more than 7) but it keeps cycling those 7 messages. Those 7 messages by the way, are aleady read so it doesn't do anything. If i mark it as unread y can see that it continues the flow. Any ideas why it only read only 7 (continuosly)? Is it necessary to fetch all mail and check if it is already read localy instead of asking for only the unread mails? Any pointers would be appreciated.pakman
@pakman, did you ever get this working? I have a similar setup, and I keep getting nothing happening.Don 01001100
@Don01001100 Yes, it was a language related issue... see my comment in David's answer.pakman

1 Answers

2
votes

I'm going to risk an answer :$

According to the IMAP's connector doc, it seems your config misses an attribute that is recommended with GMail:

moveToFolder The remote folder to move mail to once it has been read. It is recommended that 'deleteReadMessages' is set to false when this is used. This is very useful when working with public email services such as GMail where marking messages for deletion doesn't work. Instead set the @moveToFolder=[GMail]/Trash.

Can you give it a try?

(Edited: [Gmail] has to be surrounded by brackets)