Spring XD - Mail source configuration - how to pro

2019-07-26 20:22发布

问题:

I created a mailstream with following command -------

stream create --name mailstream --definition "mail --host=imap.gmail.com --username=yyyyyyyy12@gmail.com --password=my password | file --dir=/tmp/gmailData" --deploy

Refer -http://docs.spring.io/spring-xd/docs/1.0.0.BUILD-SNAPSHOT/reference/html/#modules

But in the xd-singletone console I get -

Caused by: javax.mail.AuthenticationFailedException: failed to connect, no password specified?

How to resolve this issue.

Also --password=secret - how to keep my password invisible or secret in the XD shell

/shankha

回答1:

You need to escape "@" with "%40" for both username and password and to specify --port=993 for gmail. Also, it may be possible not to work with the default settings as GMail requires SSL for imap and this needs to be configured as well.

So, I would suggest the following (basically, creating a new source module):

  1. Go to spring-xd-1.0.0.M6\xd\modules\source and make a copy of mail folder and name this copy gmail
  2. Go to spring-xd-1.0.0.M6\xd\modules\source\gmail\config and rename both mail.properties and mail.xml to gmail.properties and gmail.xml respectively
  3. Inside gmail.xml replace everything with:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:file="http://www.springframework.org/schema/integration/file"
    xmlns:int-mail="http://www.springframework.org/schema/integration/mail"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/integration/mail http://www.springframework.org/schema/integration/mail/spring-integration-mail.xsd
        http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <channel id="output" />

    <int-mail:mail-to-string-transformer
        charset="${charset}" input-channel="transform" output-channel="output" />

    <beans:beans profile="use-polling">
        <int-mail:inbound-channel-adapter
            store-uri="${protocol}://${username:}:${password:}@${host}:${port}/${folder}"
            channel="transform" should-mark-messages-as-read="${markAsRead}"
            should-delete-messages="${delete}" java-mail-properties="javaMailProperties">
            <poller fixed-delay="${fixedDelay}" time-unit="SECONDS">
                <advice-chain>
                    <beans:bean
                        class="org.springframework.xd.dirt.module.support.ThreadContextClassLoaderSetterAdvice" />
                </advice-chain>
            </poller>
        </int-mail:inbound-channel-adapter>
    </beans:beans>

    <beans:beans profile="use-idle">
        <int-mail:imap-idle-channel-adapter
            store-uri="${protocol}://${username:}:${password:}@${host}:${port}/${folder}"
            channel="transform" auto-startup="true" mail-filter-expression="${expression}"
            should-mark-messages-as-read="${markAsRead}"
            should-delete-messages="${delete}"  java-mail-properties="javaMailProperties">
        </int-mail:imap-idle-channel-adapter>
    </beans:beans>

    <beans:beans profile="default">
        <util:properties id="javaMailProperties">
            <beans:prop key="mail.imap.socketFactory.class">javax.net.ssl.SSLSocketFactory</beans:prop>
            <beans:prop key="mail.imap.socketFactory.fallback">false</beans:prop>
            <beans:prop key="mail.store.protocol">imaps</beans:prop>
            <beans:prop key="mail.debug">false</beans:prop>
        </util:properties>
    </beans:beans>
</beans:beans>

4. In XD shell now you will use something like the following to create your stream:

stream create --name myGmailStream --definition "gmail --host=imap.gmail.com --username=yyyyyyyy12%40gmail.com --password=my_password --port=993 | file --dir=/tmp/gmailData" --deploy

Here, please note the following:

  • I added --port=993
  • the username contains "%40" instead of "@"
  • the definition of the stream starts with "gmail
  • if your password contains "@" you need to replace that with "%40" as well

What I've done above is to, basically, create a new custom module (a source) which is kind of easy (more details about this you can find in the documentation). The XD single node or the XD Shell doesn't even need to be restarted. Give it a try and let me know how it goes.



回答2:

Regarding the password that you don't want to appear as part of the stream definition, you can provide it as part of your mail module options, as described here: http://docs.spring.io/spring-xd/docs/1.0.0.BUILD-SNAPSHOT/reference/html/#_module_configuration

ie

<xd_home>/config/modules/source/mail/mail.properties:

password: yourpassword