[[aws-ses-component]]
= AWS Simple Email Service Component
:page-source: components/camel-aws-ses/src/main/docs/aws-ses-component.adoc

*Since Camel 2.9*

// HEADER START
*Only producer is supported*
// HEADER END

The ses component supports sending emails with
https://aws.amazon.com/ses[Amazon's SES] service.

Prerequisites

You must have a valid Amazon Web Services developer account, and be
signed up to use Amazon SES. More information is available at
https://aws.amazon.com/ses[Amazon SES].

== URI Format

[source,java]
------------------------
aws-ses://from[?options]
------------------------

You can append query options to the URI in the following format,
?options=value&option2=value&...

== URI Options


// component options: START
The AWS Simple Email Service component supports 7 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *configuration* (advanced) | The AWS SES default configuration |  | SesConfiguration
| *accessKey* (producer) | Amazon AWS Access Key |  | String
| *secretKey* (producer) | Amazon AWS Secret Key |  | String
| *region* (producer) | The region in which SES client needs to work |  | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *bridgeErrorHandler* (consumer) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | boolean
|===
// component options: END




// endpoint options: START
The AWS Simple Email Service endpoint is configured using URI syntax:

----
aws-ses:from
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *from* | *Required* The sender's email address. |  | String
|===


=== Query Parameters (14 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *amazonSESClient* (producer) | To use the AmazonSimpleEmailService as the client |  | AmazonSimpleEmailService
| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | boolean
| *proxyHost* (producer) | To define a proxy host when instantiating the SES client |  | String
| *proxyPort* (producer) | To define a proxy port when instantiating the SES client |  | Integer
| *proxyProtocol* (producer) | To define a proxy protocol when instantiating the SES client | HTTPS | Protocol
| *region* (producer) | The region in which SES client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll need to use the name Regions.EU_WEST_1.name() |  | String
| *replyToAddresses* (producer) | List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header. |  | List
| *returnPath* (producer) | The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header. |  | String
| *subject* (producer) | The subject which is used if the message header 'CamelAwsSesSubject' is not present. |  | String
| *to* (producer) | List of destination email address. Can be overriden with 'CamelAwsSesTo' header. |  | List
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *accessKey* (security) | Amazon AWS Access Key |  | String
| *secretKey* (security) | Amazon AWS Secret Key |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

When using Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-aws-ses-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 19 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.aws-ses.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-ses.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.aws-ses.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
| *camel.component.aws-ses.configuration.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-ses.configuration.amazon-s-e-s-client* | To use the AmazonSimpleEmailService as the client |  | AmazonSimpleEmailService
| *camel.component.aws-ses.configuration.from* | The sender's email address. |  | String
| *camel.component.aws-ses.configuration.proxy-host* | To define a proxy host when instantiating the SES client |  | String
| *camel.component.aws-ses.configuration.proxy-port* | To define a proxy port when instantiating the SES client |  | Integer
| *camel.component.aws-ses.configuration.proxy-protocol* | To define a proxy protocol when instantiating the SES client |  | Protocol
| *camel.component.aws-ses.configuration.region* | The region in which SES client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1) You'll need to use the name Regions.EU_WEST_1.name() |  | String
| *camel.component.aws-ses.configuration.reply-to-addresses* | List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header. |  | List
| *camel.component.aws-ses.configuration.return-path* | The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header. |  | String
| *camel.component.aws-ses.configuration.secret-key* | Amazon AWS Secret Key |  | String
| *camel.component.aws-ses.configuration.subject* | The subject which is used if the message header 'CamelAwsSesSubject' is not present. |  | String
| *camel.component.aws-ses.configuration.to* | List of destination email address. Can be overriden with 'CamelAwsSesTo' header. |  | List
| *camel.component.aws-ses.enabled* | Whether to enable auto configuration of the aws-ses component. This is enabled by default. |  | Boolean
| *camel.component.aws-ses.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
| *camel.component.aws-ses.region* | The region in which SES client needs to work |  | String
| *camel.component.aws-ses.secret-key* | Amazon AWS Secret Key |  | String
|===
// spring-boot-auto-configure options: END




Required SES component options

You have to provide the amazonSESClient in the
Registry or your accessKey and secretKey to access
the https://aws.amazon.com/ses[Amazon's SES].

== Usage

=== Message headers evaluated by the SES producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsSesFrom` |`String` |The sender's email address.

|`CamelAwsSesTo` |`List<String>` |The destination(s) for this email.

|`CamelAwsSesSubject` |`String` |The subject of the message.

|`CamelAwsSesReplyToAddresses` |`List<String>` |The reply-to email address(es) for the message.

|`CamelAwsSesReturnPath` |`String` |The email address to which bounce notifications are to be forwarded.

|`CamelAwsSesHtmlEmail` |`Boolean` |The flag to show if email content is HTML.
|=======================================================================

=== Message headers set by the SES producer

[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Header |Type |Description

|`CamelAwsSesMessageId` |`String` |The Amazon SES message ID.
|=======================================================================

=== Advanced AmazonSimpleEmailService configuration

If you need more control over the `AmazonSimpleEmailService` instance
configuration you can create your own instance and refer to it from the
URI:

[source,java]
-------------------------------------------------------------
from("direct:start")
.to("aws-ses://example@example.com?amazonSESClient=#client");
-------------------------------------------------------------

The `#client` refers to a `AmazonSimpleEmailService` in the
Registry.

For example if your Camel Application is running behind a firewall:

[source,java]
----------------------------------------------------------------------------------------------------------
AWSCredentials awsCredentials = new BasicAWSCredentials("myAccessKey", "mySecretKey");
ClientConfiguration clientConfiguration = new ClientConfiguration();
clientConfiguration.setProxyHost("http://myProxyHost");
clientConfiguration.setProxyPort(8080);
AmazonSimpleEmailService client = new AmazonSimpleEmailServiceClient(awsCredentials, clientConfiguration);

registry.bind("client", client);
----------------------------------------------------------------------------------------------------------

== Automatic detection of AmazonSimpleEmailService client in registry

The component is capable of detecting the presence of an AmazonSimpleEmailService bean into the registry.
If it's the only instance of that type it will be used as client and you won't have to define it as uri parameter.
This may be really useful for smarter configuration of the endpoint.

== Producer Examples

[source,java]
--------------------------------------------------------------------------------
from("direct:start")
    .setHeader(SesConstants.SUBJECT, constant("This is my subject"))
    .setHeader(SesConstants.TO, constant(Collections.singletonList("to@example.com"))
    .setBody(constant("This is my message text."))
    .to("aws-ses://from@example.com?accessKey=xxx&secretKey=yyy");
--------------------------------------------------------------------------------

== Dependencies

Maven users will need to add the following dependency to their pom.xml.

*pom.xml*

[source,xml]
---------------------------------------
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-aws-ses</artifactId>
    <version>${camel-version}</version>
</dependency>
---------------------------------------

where `$\{camel-version\}` must be replaced by the actual version of Camel.

