| Namespace | http://www.mulesoft.org/schema/mule/gmail |
|---|---|
| Schema Location | http://www.mulesoft.org/schema/mule/gmail/current/mule-gmail.xsd (View Schema) |
| Schema Version | 1.0 |
| Minimum Mule Version | 3.3 |
Gmail cloud connector. This connector covers the standard IMAP protocol plus Google's extensions for Gmail. This implementation uses OAuth2 for authentication
| Configuration | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
Configure an instance of this module
| |||||||||||
| Message Processors | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
Search and returns messages on a folder of the given username
using a search criteria provided by the user via the searchTerm parameter.
| |||||||||||
Moves the given message to the trash and deletes it from its current folder
| |||||||||||
Returns messages in the user mailbox applying optional search criterias.
| |||||||||||
To use the this module within a flow the namespace to the module must be included. The resulting flow will look similar to the following:
<mule xmlns="http://www.mulesoft.org/schema/mule/core"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:gmail="http://www.mulesoft.org/schema/mule/gmail"
xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/gmail
http://www.mulesoft.org/schema/mule/gmail/current/mule-gmail.xsd">
<!-- here goes your flows and configuration elements -->
</mule>
This module is configured using the config element. This element must be placed outside of your flows and at the root of your Mule application. You can create as many configurations as you deem necessary as long as each carries its own name.
Each message processor, message source or transformer carries a config-ref attribute that allows the invoker to specify which configuration to use.
| Attributes | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Type | Name | Default Value | Description | Java Type | MIME Type | Encoding | Optional. Give a name to this configuration so it can be later referenced. | ||||
| Mule-GmailConnector/1.0 | Optional. Application name registered on Google API console | ||||||||||
| The OAuth2 consumer key | |||||||||||
| The OAuth2 consumer secret | |||||||||||
| Optional. This policy represents which id we want to use to represent each google account. | |||||||||||
| https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email https://mail.google.com/ | Optional. The OAuth scopes you want to request | ||||||||||
| https://accounts.google.com/o/oauth2/auth | Optional. The URL defined by the Service Provider where the resource owner will be redirected to grant authorization to the connector | ||||||||||
| https://accounts.google.com/o/oauth2/token | Optional. The URL defined by the Service Provider to obtain an access token | ||||||||||
This connector uses OAuth as an authorization and authentication mechanism with automatic saving and restoring of access tokens. Every message processor in this connector has an extra attribute entitled accessTokenId which is an identification of the user authorizing the conenctor. In order to obtain an access token identification you need to first call the authroize message processor.
Authorizing the connector is a simple process of calling:
<gmail:authorize/>
The call to authorize message processor must be made from a message coming from an HTTP inbound endpoint as the authorize process will reply with a redirect to the service provider. The following is an example of how to use it in a flow with an HTTP inbound endpoint:
<flow name="authorizationAndAuthenticationFlow">
<http:inbound-endpoint host="localhost" port="8080" path="oauth-authorize"/>
<gmail:authorize/>
</flow>
If you hit that endpoint via a web-browser it will initiate the OAuth dance, redirecting the user to the service provider page and creating a callback endpoint so the service provider can redirect back once the user has been authenticated and properly authorized the connector. Once the callback gets called then the connector will automatically issue an access token identifier that you need to save as either a cookie or a database record for any subsequent calls.
The authorize message processor also supports the following attributes:
| Authorize Attributes | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Name | Default Value | Description | |||||||||
| Optional. Indicates if your application needs to access a Google API when the user is not present at the browser. Use offline to get a refresh token and use that when the user is not at the browser. Default is online | |||||||||||
| Optional. Indicates if google should remember that an app has been authorized or if each should ask authorization every time. Use force to request authorization every time or auto to only do it the first time. Default is auto | |||||||||||
| https://accounts.google.com/o/oauth2/auth | Optional. The URL defined by the Service Provider where the resource owner will be redirected to grant authorization to the connector | ||||||||||
| https://accounts.google.com/o/oauth2/token | Optional. The URL defined by the Service Provider to obtain an access token | ||||||||||
The authorize message processor is an intercepting one. If the connector is not authorized yet, it will redirect to the service provider so the user can authorize the connector. This is the reason as to why the authorize needs to be behind and http:inbound-endpoint. The service provider upon successful authentication and authorization then will call back the connector. The connector will extract information from that call, set its internal state to authorized, and then continue execution. Continuing execution means executing everything that was after the authorize whose execution got interrupted because the connector was not authorized.
<flow name="authorizationAndAuthenticationFlow">
<http:inbound-endpoint host="localhost" port="8080" path="oauth-authorize"/>
<gmail:authorize/>
<http:response-builder status="200">
<set-payload value="You have successfully authorized the connector"/>
</http:response-builder>
</flow>
In the previous example we added the http:response-build (notice that this element is available only in Mule 3.3.0 and later). If the connector is not authorized, the execution of the response builder will be delayed up to the point of the callback execution.
On the other hand if the connector has been authorized and you call authorize again then the flow execution will not stop, it will rather continue and the http:response-builder will get executed right away rather than after the callback.
The following is an example of the authorize message processor, after which it will print the access token identifier to the log:
<flow name="authorizationAndAuthenticationFlow">
<http:inbound-endpoint host="localhost" port="8080" path="oauth-authorize"/>
<gmail:authorize/>
<log level="INFO" message="The connector has been properly authorized. The access token identifier is #[flowVars['OAuthAccessTokenId']]"/>
</flow>
The OAuthAccessTokenId flow variable is a special variable available to all the message processors executing after the authorize call. The following snippet shows how you can save it as a HTTP protocol cookie:
<flow name="authorizationAndAuthenticationFlow">
<http:inbound-endpoint host="localhost" port="8080" path="oauth-authorize"/>
<gmail:authorize/>
<http:response-builder status="200">
<http:set-cookie name="accessTokenId" value="#[flowVars['OAuthAccessTokenId']]"/>
<set-payload value="You have successfully authorized the connector. You access token id is #[flowVars['OAuthAccessTokenId']]"/>
</http:response-builder>
</flow>
The access token identifier is unique per user and therefore the connector can be authorized for many users. If the user authorizes the connector twice it will have the same access token identifier both times.
If for any reason, an errors ocurrs while processing the callback, the exception strategy of the flow containing the authorize will be executed. So, if the callback sent the wrong information you can handle that situation by setting up an exception strategy as follows:
<flow name="authorizationAndAuthenticationFlow">
<http:inbound-endpoint host="localhost" port="8080" path="oauth-authorize"/>
<gmail:authorize/>
<http:response-builder status="200">
<set-payload value="You have successfully authorized the connector"/>
</http:response-builder>
<catch-exception-strategy>
<http:response-builder status="404">
<set-payload value="An error has occurred authorizing the connector"/>
</http:response-builder>
</catch-exception-strategy>
</flow>
Once this connector has been authorized further calls to the authorize message processor will be no-ops. If you wish to reset the state of the connector back to a non-authorized state you can call:
<gmail:unauthorize/>
Keep in mind that after the connector is unauthorized all future calls that attempt to access protected resources will fail until the connector is re-authorized.
As mentioned earlier once authorize gets called and before we redirect the user to the service provider we create a callback endpoint. The callback endpoint will get called automatically by the service provider once the user is authenticated and he grants authorization to the connector to access his private information.
The callback can be customized in the config element of the this connector as follows:
<gmail:config>
<gmail:oauth-callback-config domain="${fullDomain}" localPort="${http.port}" remotePort="80"/>
</gmail:config>
The oauth-callback-config element can be used to customize the endpoint that gets created for the callback. It features the following attributes:
| OAuth Callback Config Attributes | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Name | Description | ||||||||||
| Optional. Reference to a user-defined HTTP connector. | |||||||||||
| Optional. The domain portion of the callback URL. This is usually something like xxx.cloudhub.io if you are deploying to CloudHub for example. | |||||||||||
| Optional. The local port number that the endpoint will listen on. Normally 80, in the case of CloudHub you can use the environment variable ${http.port}. | |||||||||||
| Optional. This is the port number that we will tell the service provider we are listening on. It is usually the same as localPort but it is separated in case your deployment features port forwarding or a proxy. | |||||||||||
| Optional. Path under which the callback should be exposed. If not specified a random path will be generated. | |||||||||||
The example shown above is what the configuration would look like if your app would be deployed to CloudHub.
This connector has the capability of automatically saving and restoring access tokens. The connector will store in either the default user object store or a user-defined one the acquired access tokens, refresh tokens, and any other pertinent information using the access token identifier as the key.
The object store can be configured as follows
<gmail:config>
<gmail:oauth-store-config objectStore-ref="my-object-store"/>
</gmail:config>
There is only a single attribute entitled objectStore-ref in the oauth-store-config element that allows the user to specify the name of the object store that he wishes to use to save and restore access tokens.
Search and returns messages on a folder of the given username
using a search criteria provided by the user via the searchTerm parameter.
Returns messages in the user mailbox applying optional search criterias.
The messages are returned in the form of MailMessage instances
which allows the connector's user to be decoupled from the IMAP protocol internals but also allows for the
mailbox connection to be closed automatically.
INCLUDE_ERROR
| Name | Default Value | Description | Java Type | MIME Type | Encoding | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Optional. Specify which configuration to use. | |||||||||||
| The account's username | String | */* | UTF-8 | ||||||||
| Optional. Only needed is you're using basic authentication. If you're using OAuth2 then this parameter is not used | String | */* | UTF-8 | ||||||||
| The folder in which to search. If you want all of them then use ALL_MAIL | GmailFolder | */* | |||||||||
An instance of SearchTerm. If not provided, then no filtering criteria is applied |
SearchTerm | */* | |||||||||
| false | Optional. If true, all read messages will be deleted upon operation completion | Boolean | */* | ||||||||
| false | Optional. Wether or not to also download the message's attachments. Default value is false bandwidth wise. | Boolean | */* | ||||||||
| OAuth Parameters The following values are always required when using OAuth as the authentication mechanism. | |||||||||||
| Access token identifier used to retrieve an access token from the store | |||||||||||
| Return Type | Description |
|---|---|
| List<MailMessage> | a list of MailMessage representing the found messages |
| Payload Class | Description |
|---|---|
| MessagingException | if an error is found accessing the mailbox |
Moves the given message to the trash and deletes it from its current folder
INCLUDE_ERROR
| Name | Default Value | Description | Java Type | MIME Type | Encoding | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Optional. Specify which configuration to use. | |||||||||||
| #[payload] | Optional. An instance of MailMessage representing the message to be deleted. At the very
least, the googleId property must be not null |
MailMessage | */* | ||||||||
| The mailbox username | String | */* | UTF-8 | ||||||||
| Optional. Optional value only required when using basic auth. Ignore this if you're using OAuth | String | */* | UTF-8 | ||||||||
| OAuth Parameters The following values are always required when using OAuth as the authentication mechanism. | |||||||||||
| Access token identifier used to retrieve an access token from the store | |||||||||||
| Payload Class | Description |
|---|---|
| MessagingException | if the mailbox throws an exception |
| IllegalArgumentException | if the mailbox contains no email with that id |
Returns messages in the user mailbox applying optional search criterias.
The messages are returned in the form of MailMessage instances
which allows the connector's user to be decoupled from the IMAP protocol internals but also allows for the
mailbox connection to be closed automatically.
INCLUDE_ERROR
| Name | Default Value | Description | Java Type | MIME Type | Encoding | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Optional. Specify which configuration to use. | |||||||||||
| The account's username | String | */* | UTF-8 | ||||||||
| The folder in which to search. If you want all of them then use ALL_MAIL | GmailFolder | */* | |||||||||
| Optional. Only needed is you're using basic authentication. If you're using OAuth2 then this parameter is not used | String | */* | UTF-8 | ||||||||
| Optional. A date in the specified string format giving a lower bound filter to the received date. If no dateFormat is specified, then RFC3339 is assumed | String | */* | UTF-8 | ||||||||
| Optional. A date in the specified string format giving an upper bound filter to the received date. If no dateFormat is specified, then RFC3339 is assumed | String | */* | UTF-8 | ||||||||
| Optional. A date in the specified string format giving a lower bound filter to the sent date. If no dateFormat is specified, then RFC3339 is assumed | String | */* | UTF-8 | ||||||||
| Optional. A date in the specified string format giving an upper bound filter to the sent date. If no dateFormat is specified, then RFC3339 is assumed | String | */* | UTF-8 | ||||||||
| Optional. Used to look for the message with the specified number | Integer | */* | |||||||||
Optional. An instance of SearchCriteria to specify restrictions on the message's size |
SearchCriteria | */* | |||||||||
| Optional. The id of the thread for which the message should belong | String | */* | UTF-8 | ||||||||
| Optional. Used to fetch one given message by id | String | */* | UTF-8 | ||||||||
| yyyy-MM-dd\'T\'HH:mm:ss\'Z\' | Optional. The format to be used to parse the date attributes. If no dateFormat is specified, then RFC3339 is assumed | String | */* | UTF-8 | |||||||
| false | Optional. If true, all read messages will be deleted upon operation completion | Boolean | */* | ||||||||
| false | Optional. Wether or not to also download the message's attachments. Default value is false bandwidth wise. | Boolean | */* | ||||||||
| OAuth Parameters The following values are always required when using OAuth as the authentication mechanism. | |||||||||||
| Access token identifier used to retrieve an access token from the store | |||||||||||
| Name | Default Value | Description | Java Type |
|---|---|---|---|
| Optional. A list of addresses to be found in the from attribute. This is an OR operation logic. All messages with any one of these addresses will be returned | List<String> | ||
| Optional. A list of addresses to be found in the to attribute. This is an OR operation logic. All messages with any one of these addresses will be returned | List<String> | ||
Optional. A list of FlagCriteria to specify flag values that the messages should have |
List<FlagCriteria> | ||
| Optional. A list of Strings which represent the labels that the messages need to have. This is an OR operation logic. All messages with any one of these labels will be returned | List<String> | ||
| Optional. A list of Strings which represent terms that the message should have. This is an OR operation logic. All messages with any one of these terms will be returned | List<String> | ||
| Optional. A list of Strings which represent the body terms that the messages need to have. This is an OR operation logic. All messages with any one of these terms will be returned | List<String> | ||
| Optional. A list of Strings which represent the header terms that the messages need to have. This is an OR operation logic. All messages with any one of these terms will be returned | List<String> | ||
| Optional. A list of Strings which represent the subject terms that the messages need to have. This is an OR operation logic. All messages with any one of these terms will be returned | List<String> |
| Return Type | Description |
|---|---|
| List<MailMessage> | a list of MailMessage |
| Payload Class | Description |
|---|---|
| MessagingException | if an error is found accessing the mailbox |