You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2020/02/13 14:06:22 UTC

[camel] branch master updated (9c3815b -> b8c5d3b)

This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git.


    from 9c3815b  CAMEL-14546: camel-xmlsecurity - Split up into verify and sign endpoints
     new 79fb4e6  CAMEL-14551 - Create an AWS-SES component based on SDK v2
     new 9eac80d  CAMEL-14551 - Create an AWS-SES component based on SDK v2, docs
     new 4dd3829  CAMEL-14551 - Create an AWS-SES component based on SDK v2, regen docs
     new 00db3a1  CAMEL-14551 - Create an AWS-SES component based on SDK v2, Added component to kit
     new 8e376ff  CAMEL-14551 - Create an AWS-SES component based on SDK v2, Regen docs
     new b8c5d3b  CAMEL-14551 - Create an AWS-SES component based on SDK v2, Fixed CS

The 6 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 apache-camel/pom.xml                               |   5 +
 apache-camel/src/main/descriptors/common-bin.xml   |   1 +
 bom/camel-bom/pom.xml                              |   5 +
 components/camel-aws2-ses/pom.xml                  |  91 +++++++++
 .../aws2/ses/Ses2ComponentConfigurer.java          |  33 ++++
 .../component/aws2/ses/Ses2EndpointConfigurer.java |  47 +++++
 .../services/org/apache/camel/component.properties |   7 +
 .../services/org/apache/camel/component/aws-ses    |   0
 .../services/org/apache/camel/component/aws2-ses   |   2 +
 .../org/apache/camel/configurer/aws-ses-component  |   0
 .../org/apache/camel/configurer/aws-ses-endpoint   |   0
 .../org/apache/camel/configurer/aws2-ses-component |   2 +
 .../org/apache/camel/configurer/aws2-ses-endpoint  |   2 +
 .../apache/camel/component/aws/ses/aws-ses.json    |   0
 .../apache/camel/component/aws2/ses/aws2-ses.json  |  46 +++++
 .../src/main/docs/aws2-ses-component.adoc          |  53 ++---
 .../camel/component/aws2/ses/Ses2Component.java    | 122 ++++++++++++
 .../aws2/ses/Ses2ComponentVerifierExtension.java   |  84 ++++++++
 .../component/aws2/ses/Ses2Configuration.java      | 220 +++++++++++++++++++++
 .../camel/component/aws2/ses/Ses2Constants.java    |  31 +++
 .../camel/component/aws2/ses/Ses2Endpoint.java     | 118 +++++++++++
 .../camel/component/aws2/ses/Ses2Producer.java     | 192 ++++++++++++++++++
 .../component/aws2/ses/AmazonSESClientMock.java    |  63 ++++++
 .../camel/component/aws2/ses/MockMessage.java      | 219 ++++++++++++++++++++
 .../aws2/ses/SESComponentClientRegistryTest.java   |  41 ++++
 .../aws2/ses/SesComponentConfigurationTest.java    | 190 ++++++++++++++++++
 .../component/aws2/ses/SesComponentSpringTest.java | 137 +++++++++++++
 .../camel/component/aws2/ses/SesComponentTest.java | 127 ++++++++++++
 .../ses/SesComponentVerifierExtensionTest.java     |  71 +++++++
 .../integration/SesComponentIntegrationTest.java   |  55 ++++++
 .../src/test/resources/log4j2.properties           |  28 +++
 .../aws2/ses/SESComponentSpringTest-context.xml    |  34 ++++
 components/pom.xml                                 |   1 +
 core/camel-componentdsl/pom.xml                    |   6 +
 .../component/ComponentsBuilderFactory.java        |  12 ++
 .../dsl/Aws2SesComponentBuilderFactory.java        | 159 +++++++++++++++
 .../src/generated/resources/metadata.json          |  20 ++
 docs/components/modules/ROOT/nav.adoc              |   2 +
 .../modules/ROOT/pages/aws-ses-component.adoc      |   2 +-
 ...-ses-component.adoc => aws2-ses-component.adoc} |  54 +++--
 docs/components/modules/ROOT/pages/index.adoc      |   4 +-
 parent/pom.xml                                     |   5 +
 42 files changed, 2225 insertions(+), 66 deletions(-)
 create mode 100644 components/camel-aws2-ses/pom.xml
 create mode 100644 components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2ComponentConfigurer.java
 create mode 100644 components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2EndpointConfigurer.java
 create mode 100644 components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component.properties
 copy components/{camel-aws-ses => camel-aws2-ses}/src/generated/resources/META-INF/services/org/apache/camel/component/aws-ses (100%)
 create mode 100644 components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-ses
 copy components/{camel-aws-ses => camel-aws2-ses}/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-component (100%)
 copy components/{camel-aws-ses => camel-aws2-ses}/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-endpoint (100%)
 create mode 100644 components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-component
 create mode 100644 components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-endpoint
 copy components/{camel-aws-ses => camel-aws2-ses}/src/generated/resources/org/apache/camel/component/aws/ses/aws-ses.json (100%)
 create mode 100644 components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws2/ses/aws2-ses.json
 copy docs/components/modules/ROOT/pages/aws-ses-component.adoc => components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc (80%)
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
 create mode 100644 components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentVerifierExtensionTest.java
 create mode 100644 components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
 create mode 100644 components/camel-aws2-ses/src/test/resources/log4j2.properties
 create mode 100644 components/camel-aws2-ses/src/test/resources/org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml
 create mode 100644 core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2SesComponentBuilderFactory.java
 copy docs/components/modules/ROOT/pages/{aws-ses-component.adoc => aws2-ses-component.adoc} (80%)


[camel] 01/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 79fb4e6dea55e67ef3666cbe2eaba28ad29ae097
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 10:14:30 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2
---
 components/camel-aws2-ses/pom.xml                  |  91 +++++++++
 .../aws2/ses/Ses2ComponentConfigurer.java          |  33 +++
 .../component/aws2/ses/Ses2EndpointConfigurer.java |  47 +++++
 .../services/org/apache/camel/component.properties |   7 +
 .../services/org/apache/camel/component/aws-ses    |   2 +
 .../services/org/apache/camel/component/aws2-ses   |   2 +
 .../org/apache/camel/configurer/aws-ses-component  |   2 +
 .../org/apache/camel/configurer/aws-ses-endpoint   |   2 +
 .../org/apache/camel/configurer/aws2-ses-component |   2 +
 .../org/apache/camel/configurer/aws2-ses-endpoint  |   2 +
 .../apache/camel/component/aws/ses/aws-ses.json    |  46 +++++
 .../apache/camel/component/aws2/ses/aws2-ses.json  |  46 +++++
 .../src/main/docs/aws-ses-component.adoc           | 196 ++++++++++++++++++
 .../camel/component/aws2/ses/Ses2Component.java    | 123 +++++++++++
 .../aws2/ses/Ses2ComponentVerifierExtension.java   |  85 ++++++++
 .../component/aws2/ses/Ses2Configuration.java      | 214 +++++++++++++++++++
 .../camel/component/aws2/ses/Ses2Constants.java    |  31 +++
 .../camel/component/aws2/ses/Ses2Endpoint.java     | 121 +++++++++++
 .../camel/component/aws2/ses/Ses2Producer.java     | 193 ++++++++++++++++++
 .../component/aws2/ses/AmazonSESClientMock.java    |  63 ++++++
 .../camel/component/aws2/ses/MockMessage.java      | 226 +++++++++++++++++++++
 .../aws2/ses/SESComponentClientRegistryTest.java   |  43 ++++
 .../aws2/ses/SesComponentConfigurationTest.java    | 193 ++++++++++++++++++
 .../component/aws2/ses/SesComponentSpringTest.java | 142 +++++++++++++
 .../camel/component/aws2/ses/SesComponentTest.java | 136 +++++++++++++
 .../ses/SesComponentVerifierExtensionTest.java     |  71 +++++++
 .../integration/SesComponentIntegrationTest.java   |  56 +++++
 .../src/test/resources/log4j2.properties           |  28 +++
 .../aws2/ses/SESComponentSpringTest-context.xml    |  34 ++++
 core/camel-componentdsl/pom.xml                    |   6 +
 .../component/ComponentsBuilderFactory.java        |  12 ++
 .../dsl/Aws2SesComponentBuilderFactory.java        | 159 +++++++++++++++
 .../src/generated/resources/metadata.json          |  20 ++
 33 files changed, 2434 insertions(+)

diff --git a/components/camel-aws2-ses/pom.xml b/components/camel-aws2-ses/pom.xml
new file mode 100644
index 0000000..244fd87
--- /dev/null
+++ b/components/camel-aws2-ses/pom.xml
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-aws2-ses</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: AWS2 SES</name>
+    <description>A Camel Amazon SES Web Service Component Version 2</description>
+
+    <properties>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>ses</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>software.amazon.awssdk</groupId>
+            <artifactId>apache-client</artifactId>
+            <version>${aws-java-sdk2-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>jakarta.mail</artifactId>
+            <version>${jakarta-mail-version}</version>
+        </dependency>
+
+        <!-- for testing -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-api</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2ComponentConfigurer.java b/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2ComponentConfigurer.java
new file mode 100644
index 0000000..12da437
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2ComponentConfigurer.java
@@ -0,0 +1,33 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.ses;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class Ses2ComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        Ses2Component target = (Ses2Component) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "accesskey":
+        case "accessKey": target.setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "region": target.setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "configuration": target.setConfiguration(property(camelContext, org.apache.camel.component.aws2.ses.Ses2Configuration.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2EndpointConfigurer.java b/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2EndpointConfigurer.java
new file mode 100644
index 0000000..a5961e2
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/java/org/apache/camel/component/aws2/ses/Ses2EndpointConfigurer.java
@@ -0,0 +1,47 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.aws2.ses;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class Ses2EndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer {
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        Ses2Endpoint target = (Ses2Endpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "amazonsesclient":
+        case "amazonSESClient": target.getConfiguration().setAmazonSESClient(property(camelContext, software.amazon.awssdk.services.ses.SesClient.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "proxyhost":
+        case "proxyHost": target.getConfiguration().setProxyHost(property(camelContext, java.lang.String.class, value)); return true;
+        case "proxyport":
+        case "proxyPort": target.getConfiguration().setProxyPort(property(camelContext, java.lang.Integer.class, value)); return true;
+        case "proxyprotocol":
+        case "proxyProtocol": target.getConfiguration().setProxyProtocol(property(camelContext, software.amazon.awssdk.core.Protocol.class, value)); return true;
+        case "region": target.getConfiguration().setRegion(property(camelContext, java.lang.String.class, value)); return true;
+        case "replytoaddresses":
+        case "replyToAddresses": target.getConfiguration().setReplyToAddresses(property(camelContext, java.util.List.class, value)); return true;
+        case "returnpath":
+        case "returnPath": target.getConfiguration().setReturnPath(property(camelContext, java.lang.String.class, value)); return true;
+        case "subject": target.getConfiguration().setSubject(property(camelContext, java.lang.String.class, value)); return true;
+        case "to": target.getConfiguration().setTo(property(camelContext, java.util.List.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "accesskey":
+        case "accessKey": target.getConfiguration().setAccessKey(property(camelContext, java.lang.String.class, value)); return true;
+        case "secretkey":
+        case "secretKey": target.getConfiguration().setSecretKey(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+}
+
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..a5f6be3
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=aws-ses aws2-ses
+groupId=org.apache.camel
+artifactId=camel-aws2-ses
+version=3.1.0-SNAPSHOT
+projectName=Camel :: AWS2 SES
+projectDescription=A Camel Amazon SES Web Service Component Version 2
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws-ses b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws-ses
new file mode 100644
index 0000000..d377d3d
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws-ses
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.ses.SesComponent
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-ses b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-ses
new file mode 100644
index 0000000..1fd120f
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/component/aws2-ses
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.ses.Ses2Component
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-component b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-component
new file mode 100644
index 0000000..e001d04
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.ses.SesComponentConfigurer
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-endpoint b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-endpoint
new file mode 100644
index 0000000..99b6f64
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws-ses-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws.ses.SesEndpointConfigurer
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-component b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-component
new file mode 100644
index 0000000..b9a5efb
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.ses.Ses2ComponentConfigurer
diff --git a/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-endpoint b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-endpoint
new file mode 100644
index 0000000..f1f8e72
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/META-INF/services/org/apache/camel/configurer/aws2-ses-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.aws2.ses.Ses2EndpointConfigurer
diff --git a/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws/ses/aws-ses.json b/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws/ses/aws-ses.json
new file mode 100644
index 0000000..316a4f2
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws/ses/aws-ses.json
@@ -0,0 +1,46 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "aws-ses",
+    "extendsScheme": "",
+    "syntax": "aws-ses:from",
+    "title": "AWS Simple Email Service",
+    "description": "The aws-ses component is used for sending emails with Amazon's SES service.",
+    "label": "cloud,mail",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws.ses.SesComponent",
+    "firstVersion": "2.9.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws-ses",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Access Key" },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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 r [...]
+    "region": { "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The region in which SES client needs to work" },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Secret Key" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws.ses.SesConfiguration", "deprecated": false, "secret": false, "description": "The AWS SES default configuration" }
+  },
+  "properties": {
+    "from": { "kind": "path", "displayName": "From", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "The sender's email address." },
+    "amazonSESClient": { "kind": "parameter", "displayName": "Amazon SESClient", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "com.amazonaws.services.simpleemail.AmazonSimpleEmailService", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "To use the AmazonSimpleEmailService as the client" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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  [...]
+    "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the SES client" },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the SES client" },
+    "proxyProtocol": { "kind": "parameter", "displayName": "Proxy Protocol", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "com.amazonaws.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "To define a proxy protocol when instantiating the SES client" },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "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_EAS [...]
+    "replyToAddresses": { "kind": "parameter", "displayName": "Reply To Addresses", "group": "producer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header." },
+    "returnPath": { "kind": "parameter", "displayName": "Return Path", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header." },
+    "subject": { "kind": "parameter", "displayName": "Subject", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "The subject which is used if the message header 'CamelAwsSesSubject' is not present." },
+    "to": { "kind": "parameter", "displayName": "To", "group": "producer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "List of destination email address. Can be overriden with 'CamelAwsSesTo' header." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws.ses.SesConfiguration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws2/ses/aws2-ses.json b/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws2/ses/aws2-ses.json
new file mode 100644
index 0000000..c41b77d
--- /dev/null
+++ b/components/camel-aws2-ses/src/generated/resources/org/apache/camel/component/aws2/ses/aws2-ses.json
@@ -0,0 +1,46 @@
+{
+  "component": {
+    "kind": "component",
+    "scheme": "aws2-ses",
+    "extendsScheme": "",
+    "syntax": "aws2-ses:from",
+    "title": "AWS 2 Simple Email Service",
+    "description": "The aws-ses component is used for sending emails with Amazon's SES service.",
+    "label": "cloud,mail",
+    "deprecated": false,
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws2.ses.Ses2Component",
+    "firstVersion": "3.1.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-ses",
+    "version": "3.1.0-SNAPSHOT"
+  },
+  "componentProperties": {
+    "accessKey": { "kind": "property", "displayName": "Access Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Access Key" },
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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 r [...]
+    "region": { "kind": "property", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The region in which SES client needs to work" },
+    "secretKey": { "kind": "property", "displayName": "Secret Key", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "Amazon AWS Secret Key" },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "configuration": { "kind": "property", "displayName": "Configuration", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "org.apache.camel.component.aws2.ses.Ses2Configuration", "deprecated": false, "secret": false, "description": "The AWS SES default configuration" }
+  },
+  "properties": {
+    "from": { "kind": "path", "displayName": "From", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "The sender's email address." },
+    "amazonSESClient": { "kind": "parameter", "displayName": "Amazon SESClient", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.services.ses.SesClient", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "To use the AmazonSimpleEmailService as the client" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "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  [...]
+    "proxyHost": { "kind": "parameter", "displayName": "Proxy Host", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "To define a proxy host when instantiating the SES client" },
+    "proxyPort": { "kind": "parameter", "displayName": "Proxy Port", "group": "producer", "label": "", "required": false, "type": "integer", "javaType": "java.lang.Integer", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "To define a proxy port when instantiating the SES client" },
+    "proxyProtocol": { "kind": "parameter", "displayName": "Proxy Protocol", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "software.amazon.awssdk.core.Protocol", "enum": [ "HTTP", "HTTPS" ], "deprecated": false, "secret": false, "defaultValue": "HTTPS", "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "To define a proxy protocol when instantiating the SES client" },
+    "region": { "kind": "parameter", "displayName": "Region", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "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_E [...]
+    "replyToAddresses": { "kind": "parameter", "displayName": "Reply To Addresses", "group": "producer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header." },
+    "returnPath": { "kind": "parameter", "displayName": "Return Path", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header." },
+    "subject": { "kind": "parameter", "displayName": "Subject", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "The subject which is used if the message header 'CamelAwsSesSubject' is not present." },
+    "to": { "kind": "parameter", "displayName": "To", "group": "producer", "label": "", "required": false, "type": "array", "javaType": "java.util.List<java.lang.String>", "deprecated": false, "secret": false, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "List of destination email address. Can be overriden with 'CamelAwsSesTo' header." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": "false", "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." },
+    "accessKey": { "kind": "parameter", "displayName": "Access Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "Amazon AWS Access Key" },
+    "secretKey": { "kind": "parameter", "displayName": "Secret Key", "group": "security", "label": "security", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": true, "configurationClass": "org.apache.camel.component.aws2.ses.Ses2Configuration", "configurationField": "configuration", "description": "Amazon AWS Secret Key" }
+  }
+}
diff --git a/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc b/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc
new file mode 100644
index 0000000..d89ba8f
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc
@@ -0,0 +1,196 @@
+[[aws-ses-component]]
+= AWS Simple Email Service Component
+
+*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 6 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *accessKey* (producer) | Amazon AWS Access Key |  | String
+| *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 [...]
+| *region* (producer) | The region in which SES client needs to work |  | String
+| *secretKey* (producer) | Amazon AWS Secret Key |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *configuration* (advanced) | The AWS SES default configuration |  | SesConfiguration
+|===
+// 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 [...]
+| *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. The value can be one of: HTTP, HTTPS | 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
+
+
+
+
+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.
+
+
+include::camel-spring-boot::page$aws-ses-starter.adoc[]
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
new file mode 100644
index 0000000..a2c3360
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Endpoint;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+
+import software.amazon.awssdk.services.ses.SesClient;
+
+@Component("aws2-ses")
+public class Ses2Component extends DefaultComponent {
+
+    @Metadata
+    private String accessKey;
+    @Metadata
+    private String secretKey;
+    @Metadata
+    private String region;
+    @Metadata(label = "advanced")
+    private Ses2Configuration configuration;
+
+    public Ses2Component() {
+        this(null);
+    }
+
+    public Ses2Component(CamelContext context) {
+        super(context);
+
+        registerExtension(new Ses2ComponentVerifierExtension());
+    }
+
+    @Override
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+
+        if (remaining == null || remaining.trim().length() == 0) {
+            throw new IllegalArgumentException("From must be specified.");
+        }
+        Ses2Configuration configuration = this.configuration != null ? this.configuration.copy() : new Ses2Configuration();
+        configuration.setFrom(remaining);
+        Ses2Endpoint endpoint = new Ses2Endpoint(uri, this, configuration);
+        endpoint.getConfiguration().setAccessKey(accessKey);
+        endpoint.getConfiguration().setSecretKey(secretKey);
+        endpoint.getConfiguration().setRegion(region);
+        setProperties(endpoint, parameters);
+        checkAndSetRegistryClient(configuration);
+        if (configuration.getAmazonSESClient() == null && (configuration.getAccessKey() == null || configuration.getSecretKey() == null)) {
+            throw new IllegalArgumentException("AmazonSESClient or accessKey and secretKey must be specified");
+        }
+
+        return endpoint;
+    }
+
+    public Ses2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    /**
+     * The AWS SES default configuration
+     */
+    public void setConfiguration(Ses2Configuration configuration) {
+        this.configuration = configuration;
+    }
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    /**
+     * The region in which SES client needs to work
+     */
+    public String getRegion() {
+        return region;
+    }
+
+    public void setRegion(String region) {
+        this.region = region;
+    }
+    
+    private void checkAndSetRegistryClient(Ses2Configuration configuration) {
+        Set<SesClient> clients = getCamelContext().getRegistry().findByType(SesClient.class);
+        if (clients.size() == 1) {
+            configuration.setAmazonSESClient(clients.stream().findFirst().get());
+        }
+    }
+}
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
new file mode 100644
index 0000000..e217f07
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.Map;
+
+import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExtension;
+import org.apache.camel.component.extension.verifier.ResultBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
+import org.apache.camel.component.extension.verifier.ResultErrorHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.core.exception.SdkClientException;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.ses.SesClient;
+import software.amazon.awssdk.services.ses.SesClientBuilder;
+
+public class Ses2ComponentVerifierExtension extends DefaultComponentVerifierExtension {
+
+    public Ses2ComponentVerifierExtension() {
+        this("aws2-ses");
+    }
+
+    public Ses2ComponentVerifierExtension(String scheme) {
+        super(scheme);
+    }
+
+    // *********************************
+    // Parameters validation
+    // *********************************
+
+    @Override
+    protected Result verifyParameters(Map<String, Object> parameters) {
+
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.PARAMETERS).error(ResultErrorHelper.requiresOption("accessKey", parameters))
+            .error(ResultErrorHelper.requiresOption("secretKey", parameters)).error(ResultErrorHelper.requiresOption("region", parameters));
+
+        // Validate using the catalog
+
+        super.verifyParametersAgainstCatalog(builder, parameters);
+
+        return builder.build();
+    }
+
+    // *********************************
+    // Connectivity validation
+    // *********************************
+
+    @Override
+    protected Result verifyConnectivity(Map<String, Object> parameters) {
+        ResultBuilder builder = ResultBuilder.withStatusAndScope(Result.Status.OK, Scope.CONNECTIVITY);
+
+        try {
+            Ses2Configuration configuration = setProperties(new Ses2Configuration(), parameters);
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            SesClientBuilder clientBuilder = SesClient.builder();
+            SesClient client = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred)).region(Region.of(configuration.getRegion())).build();
+            client.getSendStatistics();
+        } catch (SdkClientException e) {
+            ResultErrorBuilder errorBuilder = ResultErrorBuilder.withCodeAndDescription(VerificationError.StandardCode.AUTHENTICATION, e.getMessage())
+                .detail("aws_ses_exception_message", e.getMessage()).detail(VerificationError.ExceptionAttribute.EXCEPTION_CLASS, e.getClass().getName())
+                .detail(VerificationError.ExceptionAttribute.EXCEPTION_INSTANCE, e);
+
+            builder.error(errorBuilder.build());
+        } catch (Exception e) {
+            builder.error(ResultErrorBuilder.withException(e).build());
+        }
+        return builder.build();
+    }
+}
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
new file mode 100644
index 0000000..1143343
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
@@ -0,0 +1,214 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.Arrays;
+import java.util.List;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.services.ses.SesClient;
+
+import org.apache.camel.RuntimeCamelException;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.spi.UriParams;
+import org.apache.camel.spi.UriPath;
+
+@UriParams
+public class Ses2Configuration implements Cloneable {
+
+    @UriPath @Metadata(required = true)
+    private String from;
+    @UriParam
+    private SesClient amazonSESClient;
+    @UriParam(label = "security", secret = true)
+    private String accessKey;
+    @UriParam(label = "security", secret = true)
+    private String secretKey;
+    @UriParam
+    private String subject;
+    @UriParam
+    private List<String> to;
+    @UriParam
+    private String returnPath;
+    @UriParam
+    private List<String> replyToAddresses;
+    @UriParam(enums = "HTTP,HTTPS", defaultValue = "HTTPS")
+    private Protocol proxyProtocol = Protocol.HTTPS;
+    @UriParam
+    private String proxyHost;
+    @UriParam
+    private Integer proxyPort;
+    @UriParam
+    private String region;
+
+    public String getAccessKey() {
+        return accessKey;
+    }
+
+    /**
+     * Amazon AWS Access Key
+     */
+    public void setAccessKey(String accessKey) {
+        this.accessKey = accessKey;
+    }
+
+    public SesClient getAmazonSESClient() {
+        return amazonSESClient;
+    }
+
+    /**
+     * To use the AmazonSimpleEmailService as the client
+     */
+    public void setAmazonSESClient(SesClient amazonSESClient) {
+        this.amazonSESClient = amazonSESClient;
+    }
+
+    public String getFrom() {
+        return from;
+    }
+
+    /**
+     * The sender's email address.
+     */
+    public void setFrom(String from) {
+        this.from = from;
+    }
+
+    public List<String> getTo() {
+        return to;
+    }
+
+    /**
+     * List of destination email address. Can be overriden with 'CamelAwsSesTo' header.
+     */
+    public void setTo(List<String> to) {
+        this.to = to;
+    }
+
+    /**
+     * List of destination email address. Can be overriden with 'CamelAwsSesTo' header.
+     */
+    public void setTo(String to) {
+        this.to = Arrays.asList(to.split(","));
+    }
+
+    public String getSecretKey() {
+        return secretKey;
+    }
+
+    /**
+     * Amazon AWS Secret Key
+     */
+    public void setSecretKey(String secretKey) {
+        this.secretKey = secretKey;
+    }
+
+    public String getSubject() {
+        return subject;
+    }
+
+    /**
+     * The subject which is used if the message header 'CamelAwsSesSubject' is not present.
+     */
+    public void setSubject(String subject) {
+        this.subject = subject;
+    }
+    
+    public String getReturnPath() {
+        return returnPath;
+    }
+
+    /**
+     * The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header.
+     */
+    public void setReturnPath(String returnPath) {
+        this.returnPath = returnPath;
+    }
+    
+    public List<String> getReplyToAddresses() {
+        return replyToAddresses;
+    }
+
+    /**
+     * List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header.
+     */
+    public void setReplyToAddresses(List<String> replyToAddresses) {
+        this.replyToAddresses = replyToAddresses;
+    }
+    
+    public void setReplyToAddresses(String replyToAddresses) {
+        this.replyToAddresses = Arrays.asList(replyToAddresses.split(","));
+    }
+    
+    public Protocol getProxyProtocol() {
+        return proxyProtocol;
+    }
+
+    /**
+     * To define a proxy protocol when instantiating the SES client
+     */
+    public void setProxyProtocol(Protocol proxyProtocol) {
+        this.proxyProtocol = proxyProtocol;
+    }
+    
+    public String getProxyHost() {
+        return proxyHost;
+    }
+
+    /**
+     * To define a proxy host when instantiating the SES client
+     */
+    public void setProxyHost(String proxyHost) {
+        this.proxyHost = proxyHost;
+    }
+
+    public Integer getProxyPort() {
+        return proxyPort;
+    }
+
+    /**
+     * To define a proxy port when instantiating the SES client
+     */
+    public void setProxyPort(Integer proxyPort) {
+        this.proxyPort = proxyPort;
+    }
+    
+    public String getRegion() {
+        return 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()
+     */
+    public void setRegion(String region) {
+        this.region = region;
+    }
+    
+    // *************************************************
+    //
+    // *************************************************
+
+    public Ses2Configuration copy() {
+        try {
+            return (Ses2Configuration)super.clone();
+        } catch (CloneNotSupportedException e) {
+            throw new RuntimeCamelException(e);
+        }
+    }
+}
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
new file mode 100644
index 0000000..6240dd3
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+/**
+ * Constants used in Camel AWS SES component
+ */
+public interface Ses2Constants {
+    
+    String FROM = "CamelAwsSesFrom";
+    String MESSAGE_ID = "CamelAwsSesMessageId";
+    String REPLY_TO_ADDRESSES = "CamelAwsSesReplyToAddresses";    
+    String RETURN_PATH = "CamelAwsSesReturnPath";
+    String SUBJECT = "CamelAwsSesSubject";
+    String TO = "CamelAwsSesTo";
+    String HTML_EMAIL = "CamelAwsSesHtmlEmail";
+}
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
new file mode 100644
index 0000000..71839db
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.net.URI;
+
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.util.ObjectHelper;
+
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.http.apache.ApacheHttpClient;
+import software.amazon.awssdk.http.apache.ProxyConfiguration;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.ses.SesClient;
+import software.amazon.awssdk.services.ses.SesClientBuilder;
+
+/**
+ * The aws-ses component is used for sending emails with Amazon's SES service.
+ */
+@UriEndpoint(firstVersion = "3.1.0", scheme = "aws2-ses", title = "AWS 2 Simple Email Service", syntax = "aws2-ses:from", producerOnly = true, label = "cloud,mail")
+public class Ses2Endpoint extends DefaultEndpoint {
+
+    private SesClient sesClient;
+
+    @UriParam
+    private Ses2Configuration configuration;
+
+    public Ses2Endpoint(String uri, Component component, Ses2Configuration configuration) {
+        super(uri, component);
+        this.configuration = configuration;
+    }
+    
+    @Override
+    public void doStart() throws Exception {
+        super.doStart();
+        sesClient = configuration.getAmazonSESClient() != null
+            ? configuration.getAmazonSESClient()
+            : createSESClient();
+    }
+    
+    @Override
+    public void doStop() throws Exception {
+        if (ObjectHelper.isEmpty(configuration.getAmazonSESClient())) {
+            if (sesClient != null) {
+                sesClient.close();
+            }
+        }
+        super.doStop();
+    }
+
+    @Override
+    public Consumer createConsumer(Processor processor) throws Exception {
+        throw new UnsupportedOperationException("You cannot receive messages from this endpoint");
+    }
+
+    @Override
+    public Producer createProducer() throws Exception {
+        return new Ses2Producer(this);
+    }
+
+    public Ses2Configuration getConfiguration() {
+        return configuration;
+    }
+
+    public SesClient getSESClient() {
+        return sesClient;
+    }
+
+    private SesClient createSESClient() {
+    	SesClient client = null;
+        SesClientBuilder clientBuilder = SesClient.builder();
+        ProxyConfiguration.Builder proxyConfig = null;
+        ApacheHttpClient.Builder httpClientBuilder = null;
+        boolean isClientConfigFound = false;
+        if (ObjectHelper.isNotEmpty(configuration.getProxyHost()) && ObjectHelper.isNotEmpty(configuration.getProxyPort())) {
+            proxyConfig = ProxyConfiguration.builder();
+            URI proxyEndpoint = URI.create(configuration.getProxyProtocol() + configuration.getProxyHost() + configuration.getProxyPort());
+            proxyConfig.endpoint(proxyEndpoint);
+            httpClientBuilder = ApacheHttpClient.builder().proxyConfiguration(proxyConfig.build());
+            isClientConfigFound = true;
+        }
+        if (configuration.getAccessKey() != null && configuration.getSecretKey() != null) {
+            AwsBasicCredentials cred = AwsBasicCredentials.create(configuration.getAccessKey(), configuration.getSecretKey());
+            if (isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder).credentialsProvider(StaticCredentialsProvider.create(cred));
+            } else {
+                clientBuilder = clientBuilder.credentialsProvider(StaticCredentialsProvider.create(cred));
+            }
+        } else {
+            if (!isClientConfigFound) {
+                clientBuilder = clientBuilder.httpClientBuilder(httpClientBuilder);
+            }
+        }
+        if (ObjectHelper.isNotEmpty(configuration.getRegion())) {
+            clientBuilder = clientBuilder.region(Region.of(configuration.getRegion()));
+        }
+        client = clientBuilder.build();
+        return client;
+    }
+}
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
new file mode 100644
index 0000000..49691c0
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.support.DefaultProducer;
+import org.apache.camel.util.URISupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import software.amazon.awssdk.core.SdkBytes;
+import software.amazon.awssdk.services.ses.model.Body;
+import software.amazon.awssdk.services.ses.model.Content;
+import software.amazon.awssdk.services.ses.model.Destination;
+import software.amazon.awssdk.services.ses.model.SendEmailRequest;
+import software.amazon.awssdk.services.ses.model.SendEmailResponse;
+import software.amazon.awssdk.services.ses.model.SendRawEmailRequest;
+import software.amazon.awssdk.services.ses.model.SendRawEmailResponse;
+
+/**
+ * A Producer which sends messages to the Amazon Simple Email Service
+ * <a href="http://aws.amazon.com/ses/">AWS SES</a>
+ */
+public class Ses2Producer extends DefaultProducer {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Ses2Producer.class);
+
+    private transient String sesProducerToString;
+    
+    public Ses2Producer(Endpoint endpoint) {
+        super(endpoint);
+    }
+
+    @Override
+    public void process(Exchange exchange) throws Exception {
+        if (!(exchange.getIn().getBody() instanceof javax.mail.Message)) {
+            SendEmailRequest request = createMailRequest(exchange);
+            LOG.trace("Sending request [{}] from exchange [{}]...", request, exchange);
+            SendEmailResponse result = getEndpoint().getSESClient().sendEmail(request);
+            LOG.trace("Received result [{}]", result);
+            Message message = getMessageForResponse(exchange);
+            message.setHeader(Ses2Constants.MESSAGE_ID, result.messageId());
+        } else {
+            SendRawEmailRequest request = createRawMailRequest(exchange);
+            LOG.trace("Sending request [{}] from exchange [{}]...", request, exchange);
+            SendRawEmailResponse result = getEndpoint().getSESClient().sendRawEmail(request);
+            LOG.trace("Received result [{}]", result);
+            Message message = getMessageForResponse(exchange);
+            message.setHeader(Ses2Constants.MESSAGE_ID, result.messageId());
+        }
+    }
+
+    private SendEmailRequest createMailRequest(Exchange exchange) {
+        SendEmailRequest.Builder request = SendEmailRequest.builder();
+        request.source(determineFrom(exchange));
+        request.destination(determineTo(exchange));
+        request.returnPath(determineReturnPath(exchange));
+        request.replyToAddresses(determineReplyToAddresses(exchange));
+        request.message(createMessage(exchange));
+
+        return request.build();
+    }
+    
+    private SendRawEmailRequest createRawMailRequest(Exchange exchange) throws Exception {
+        SendRawEmailRequest.Builder request = SendRawEmailRequest.builder();
+        request.source(determineFrom(exchange));
+        request.destinations(determineRawTo(exchange));
+        request.rawMessage(createRawMessage(exchange));
+        return request.build();
+    }
+
+    private software.amazon.awssdk.services.ses.model.Message createMessage(Exchange exchange) {
+    	software.amazon.awssdk.services.ses.model.Message.Builder message = software.amazon.awssdk.services.ses.model.Message.builder();
+        Boolean isHtmlEmail = exchange.getIn().getHeader(Ses2Constants.HTML_EMAIL, false, Boolean.class);
+        String content = exchange.getIn().getBody(String.class);
+        if (isHtmlEmail) {
+            message.body(Body.builder().html(Content.builder().data(content).build()).build());
+        } else {
+            message.body(Body.builder().text(Content.builder().data(content).build()).build());
+        }
+        message.subject(Content.builder().data(determineSubject(exchange)).build());
+        return message.build();
+    }
+    
+    private software.amazon.awssdk.services.ses.model.RawMessage createRawMessage(Exchange exchange) throws Exception {
+    	software.amazon.awssdk.services.ses.model.RawMessage.Builder message = software.amazon.awssdk.services.ses.model.RawMessage.builder();
+        javax.mail.Message content = exchange.getIn().getBody(javax.mail.Message.class);
+        OutputStream byteOutput = new ByteArrayOutputStream();
+        try {
+            content.writeTo(byteOutput);
+        } catch (Exception e) {
+            LOG.error("Cannot write to byte Array");
+            throw e;
+        }
+        byte[] messageByteArray = ((ByteArrayOutputStream)byteOutput).toByteArray();
+        message.data(SdkBytes.fromByteBuffer(ByteBuffer.wrap(messageByteArray)));
+        return message.build();
+    }
+    
+    @SuppressWarnings("unchecked")
+    private Collection<String> determineReplyToAddresses(Exchange exchange) {
+        List<String> replyToAddresses = exchange.getIn().getHeader(Ses2Constants.REPLY_TO_ADDRESSES, List.class);
+        if (replyToAddresses == null) {
+            replyToAddresses = getConfiguration().getReplyToAddresses();
+        }
+        return replyToAddresses;
+    }
+    
+    private String determineReturnPath(Exchange exchange) {
+        String returnPath = exchange.getIn().getHeader(Ses2Constants.RETURN_PATH, String.class);
+        if (returnPath == null) {
+            returnPath = getConfiguration().getReturnPath();
+        }
+        return returnPath;
+    }
+
+    @SuppressWarnings("unchecked")
+    private Destination determineTo(Exchange exchange) {
+        List<String> to = exchange.getIn().getHeader(Ses2Constants.TO, List.class);
+        if (to == null) {
+            to = getConfiguration().getTo();
+        }
+        return Destination.builder().toAddresses(to).build();
+    }
+    
+    @SuppressWarnings("unchecked")
+    private List determineRawTo(Exchange exchange) {
+        List<String> to = exchange.getIn().getHeader(Ses2Constants.TO, List.class);
+        if (to == null) {
+            to = getConfiguration().getTo();
+        }
+        return to;
+    }
+
+    private String determineFrom(Exchange exchange) {
+        String from = exchange.getIn().getHeader(Ses2Constants.FROM, String.class);
+        if (from == null) {
+            from = getConfiguration().getFrom();
+        }
+        return from;
+    }
+
+    private String determineSubject(Exchange exchange) {
+        String subject = exchange.getIn().getHeader(Ses2Constants.SUBJECT, String.class);
+        if (subject == null) {
+            subject = getConfiguration().getSubject();
+        }
+        return subject;
+    }
+
+    protected Ses2Configuration getConfiguration() {
+        return getEndpoint().getConfiguration();
+    }
+
+    @Override
+    public String toString() {
+        if (sesProducerToString == null) {
+            sesProducerToString = "SesProducer[" + URISupport.sanitizeUri(getEndpoint().getEndpointUri()) + "]";
+        }
+        return sesProducerToString;
+    }
+
+    @Override
+    public Ses2Endpoint getEndpoint() {
+        return (Ses2Endpoint) super.getEndpoint();
+    }
+    
+    public static Message getMessageForResponse(final Exchange exchange) {
+        return exchange.getMessage();
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
new file mode 100644
index 0000000..5f2ebd4
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import software.amazon.awssdk.services.ses.SesClient;
+import software.amazon.awssdk.services.ses.model.SendEmailRequest;
+import software.amazon.awssdk.services.ses.model.SendEmailResponse;
+import software.amazon.awssdk.services.ses.model.SendRawEmailRequest;
+import software.amazon.awssdk.services.ses.model.SendRawEmailResponse;
+
+public class AmazonSESClientMock implements SesClient {
+    private SendEmailRequest sendEmailRequest;
+    private SendRawEmailRequest sendRawEmailRequest;
+
+    public AmazonSESClientMock() {
+    }
+
+    @Override
+    public SendEmailResponse sendEmail(SendEmailRequest sendEmailRequest) {
+        this.sendEmailRequest = sendEmailRequest;
+        return SendEmailResponse.builder().messageId("1").build();
+    }
+    
+    @Override
+    public SendRawEmailResponse sendRawEmail(SendRawEmailRequest sendRawEmailRequest) {
+        this.sendRawEmailRequest = sendRawEmailRequest;
+        return SendRawEmailResponse.builder().messageId("1").build();
+    }
+
+    public SendEmailRequest getSendEmailRequest() {
+        return sendEmailRequest;
+    }
+    
+    public SendRawEmailRequest getSendRawEmailRequest() {
+        return sendRawEmailRequest;
+    }
+
+	@Override
+	public String serviceName() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public void close() {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
new file mode 100644
index 0000000..588feed
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+import java.util.Enumeration;
+
+import javax.activation.DataHandler;
+import javax.mail.Address;
+import javax.mail.Flags;
+import javax.mail.Header;
+import javax.mail.Message;
+import javax.mail.MessagingException;
+import javax.mail.Multipart;
+
+public class MockMessage extends Message {
+
+    @Override
+    public int getSize() throws MessagingException {
+        return 0;
+    }
+
+    @Override
+    public int getLineCount() throws MessagingException {
+        return 0;
+    }
+
+    @Override
+    public String getContentType() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public boolean isMimeType(String mimeType) throws MessagingException {
+        return false;
+    }
+
+    @Override
+    public String getDisposition() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setDisposition(String disposition) throws MessagingException {
+    }
+
+    @Override
+    public String getDescription() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setDescription(String description) throws MessagingException {
+    }
+
+    @Override
+    public String getFileName() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setFileName(String filename) throws MessagingException {
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException, MessagingException {
+        return null;
+    }
+
+    @Override
+    public DataHandler getDataHandler() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public Object getContent() throws IOException, MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setDataHandler(DataHandler dh) throws MessagingException {
+    }
+
+    @Override
+    public void setContent(Object obj, String type) throws MessagingException {
+    }
+
+    @Override
+    public void setText(String text) throws MessagingException {
+    }
+    
+    @Override
+    public void setContent(Multipart mp) throws MessagingException {
+    }
+
+    @Override
+    public void writeTo(OutputStream os) throws IOException, MessagingException {
+    }
+
+    @Override
+    public String[] getHeader(String headername) throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setHeader(String headername, String headervalue)
+        throws MessagingException {
+    }
+
+    @Override
+    public void addHeader(String headername, String headervalue)
+        throws MessagingException {
+    }
+
+    @Override
+    public void removeHeader(String headername) throws MessagingException {
+    }
+
+    @Override
+    public Enumeration<Header> getAllHeaders() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public Enumeration<Header> getMatchingHeaders(String[] headernames)
+        throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public Enumeration<Header> getNonMatchingHeaders(String[] headernames)
+        throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public Address[] getFrom() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setFrom() throws MessagingException {
+    }
+
+    @Override
+    public void setFrom(Address address) throws MessagingException {
+    }
+
+    @Override
+    public void addFrom(Address[] addresses) throws MessagingException {
+    }
+
+    @Override
+    public Address[] getRecipients(RecipientType type)
+        throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setRecipients(RecipientType type, Address[] addresses)
+        throws MessagingException {
+    }
+
+    @Override
+    public void addRecipients(RecipientType type, Address[] addresses)
+        throws MessagingException {
+    }
+
+    @Override
+    public String getSubject() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setSubject(String subject) throws MessagingException {
+    }
+
+    @Override
+    public Date getSentDate() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setSentDate(Date date) throws MessagingException {
+    }
+
+    @Override
+    public Date getReceivedDate() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public Flags getFlags() throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void setFlags(Flags flag, boolean set) throws MessagingException {
+    }
+
+    @Override
+    public Message reply(boolean replyToAll) throws MessagingException {
+        return null;
+    }
+
+    @Override
+    public void saveChanges() throws MessagingException {
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
new file mode 100644
index 0000000..e6e8538
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import org.apache.camel.component.aws2.ses.Ses2Component;
+import org.apache.camel.component.aws2.ses.Ses2Endpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class SESComponentClientRegistryTest extends CamelTestSupport {
+
+    @Test
+    public void createEndpointWithMinimalSESClientConfiguration() throws Exception {
+
+        AmazonSESClientMock awsSESClient = new AmazonSESClientMock();
+        context.getRegistry().bind("awsSesClient", awsSESClient);
+        Ses2Component component = new Ses2Component(context);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws-ses://from@example.com");
+
+        assertNotNull(endpoint.getConfiguration().getAmazonSESClient());
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithMinimalSESClientMisconfiguration() throws Exception {
+
+        Ses2Component component = new Ses2Component(context);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws-ses://from@example.com");
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
new file mode 100644
index 0000000..ab7b09d
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
@@ -0,0 +1,193 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.camel.component.aws2.ses.Ses2Component;
+import org.apache.camel.component.aws2.ses.Ses2Endpoint;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.regions.Region;
+
+public class SesComponentConfigurationTest extends CamelTestSupport {
+    
+    @Test
+    public void createEndpointWithMinimalConfiguration() throws Exception {
+        AmazonSESClientMock mock = new AmazonSESClientMock();
+
+        context.getRegistry().bind("amazonSESClient", mock);
+        
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx&secretKey=yyy");
+        
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
+        assertNotNull(endpoint.getConfiguration().getAmazonSESClient());
+        assertNull(endpoint.getConfiguration().getTo());
+        assertNull(endpoint.getConfiguration().getSubject());
+        assertNull(endpoint.getConfiguration().getReturnPath());
+        assertNull(endpoint.getConfiguration().getReplyToAddresses());
+    }
+
+    @Test
+    public void createEndpointWithOnlyAccessKeyAndSecretKey() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
+
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
+        assertNull(endpoint.getConfiguration().getAmazonSESClient());
+        assertNull(endpoint.getConfiguration().getTo());
+        assertNull(endpoint.getConfiguration().getSubject());
+        assertNull(endpoint.getConfiguration().getReturnPath());
+        assertNull(endpoint.getConfiguration().getReplyToAddresses());
+    }
+    
+    @Test
+    public void createEndpointWithMinimalConfigurationAndProvidedClient() throws Exception {
+        AmazonSESClientMock mock = new AmazonSESClientMock();
+
+        context.getRegistry().bind("amazonSESClient", mock);
+        
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?"
+                + "amazonSESClient=#amazonSESClient");
+        
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertNull(endpoint.getConfiguration().getAccessKey());
+        assertNull(endpoint.getConfiguration().getSecretKey());
+        assertSame(mock, endpoint.getConfiguration().getAmazonSESClient());
+        assertNull(endpoint.getConfiguration().getTo());
+        assertNull(endpoint.getConfiguration().getSubject());
+        assertNull(endpoint.getConfiguration().getReturnPath());
+        assertNull(endpoint.getConfiguration().getReplyToAddresses());
+    }
+
+    @Test
+    public void createEndpointWithMaximalConfiguration() throws Exception {
+        AmazonSESClientMock mock = new AmazonSESClientMock();
+        List<String> to = new ArrayList<String>();
+        to.add("to1@example.com");
+        to.add("to2@example.com");
+        List<String> replyAddress = new ArrayList<String>();
+        replyAddress.add("replyTo1@example.com");
+        replyAddress.add("replyTo2@example.com");
+
+        context.getRegistry().bind("amazonSESClient", mock);
+        context.getRegistry().bind("toList", to);
+        context.getRegistry().bind("replyToList", replyAddress);
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx"
+            + "&secretKey=yyy&to=#toList&subject=Subject"
+            + "&returnPath=bounce@example.com&replyToAddresses=#replyToList");
+        
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
+        assertNotNull(endpoint.getConfiguration().getAmazonSESClient());
+        assertEquals(2, endpoint.getConfiguration().getTo().size());
+        assertTrue(endpoint.getConfiguration().getTo().contains("to1@example.com"));
+        assertTrue(endpoint.getConfiguration().getTo().contains("to2@example.com"));
+        assertEquals("Subject", endpoint.getConfiguration().getSubject());
+        assertEquals("bounce@example.com", endpoint.getConfiguration().getReturnPath());
+        assertEquals(2, endpoint.getConfiguration().getReplyToAddresses().size());
+        assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("replyTo1@example.com"));
+        assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("replyTo2@example.com"));
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSourceName() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.createEndpoint("aws2-ses:// ");
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAmazonSESClientConfiguration() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.createEndpoint("aws2-ses://from@example.com");
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAccessKeyConfiguration() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.createEndpoint("aws2-ses://from@example.com?secretKey=yyy");
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutSecretKeyConfiguration() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.createEndpoint("aws2-ses://from@example.com?accessKey=xxx");
+    }
+    
+    @Test
+    public void createEndpointWithComponentElements() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://from@example.com");
+        
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
+        assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
+    }
+    
+    @Test
+    public void createEndpointWithComponentAndEndpointElements() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.toString());
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws-ses://from@example.com?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+        
+        assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+    }
+    
+    @Test
+    public void createEndpointWithComponentEndpointElementsAndProxy() throws Exception {
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.setAccessKey("XXX");
+        component.setSecretKey("YYY");
+        component.setRegion(Region.US_WEST_1.toString());
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000&proxyProtocol=HTTP");
+        
+        assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
+        assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
+        assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
+        assertEquals(Protocol.HTTP, endpoint.getConfiguration().getProxyProtocol());
+        assertEquals("localhost", endpoint.getConfiguration().getProxyHost());
+        assertEquals(Integer.valueOf(9000), endpoint.getConfiguration().getProxyPort());
+    }
+    
+    @Test
+    public void createEndpointWithoutSecretKeyAndAccessKeyConfiguration() throws Exception {
+        AmazonSESClientMock mock = new AmazonSESClientMock();
+
+        context.getRegistry().bind("amazonSESClient", mock);
+        
+        Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
+        component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient");
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
new file mode 100644
index 0000000..545c649
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
@@ -0,0 +1,142 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.aws2.ses.Ses2Constants;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Before;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import software.amazon.awssdk.services.ses.model.SendEmailRequest;
+import software.amazon.awssdk.services.ses.model.SendRawEmailRequest;
+
+public class SesComponentSpringTest extends CamelSpringTestSupport {
+    
+    private AmazonSESClientMock sesClient;
+    
+    @Override
+    @Before
+    public void setUp() throws Exception {
+        super.setUp();
+        
+        sesClient = context.getRegistry().lookupByNameAndType("amazonSESClient", AmazonSESClientMock.class);
+    }
+
+    @Test
+    public void sendInOnlyMessageUsingUrlOptions() throws Exception {
+        Exchange exchange = template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+            }
+        });
+        
+        assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+        
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("from@example.com", sendEmailRequest.source());
+        assertEquals("bounce@example.com", sendEmailRequest.returnPath());
+        assertEquals("This is my message text.", getBody(sendEmailRequest));
+    }
+    
+    @Test
+    public void sendInOutMessageUsingUrlOptions() throws Exception {
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+            }
+        });
+        
+        assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
+    }
+    
+    @Test
+    public void sendRawMessage() throws Exception {
+        final MockMessage mess = new MockMessage();  
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody(mess);
+            }
+        });
+        
+        assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
+        
+        SendRawEmailRequest sendRawEmailRequest = sesClient.getSendRawEmailRequest();
+        assertEquals("from@example.com", sendRawEmailRequest.source());
+    }
+
+    @Test
+    public void sendMessageUsingMessageHeaders() throws Exception {
+        Exchange exchange = template.send("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+                exchange.getIn().setHeader(Ses2Constants.FROM, "anotherFrom@example.com");
+                exchange.getIn().setHeader(Ses2Constants.TO,
+                        Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, "anotherBounce@example.com");
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
+                        Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.SUBJECT, "anotherSubject");
+            }
+        });
+        
+        assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("anotherFrom@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("anotherTo1@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("anotherTo2@example.com"));
+        assertEquals("anotherBounce@example.com", sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        assertTrue(sendEmailRequest.replyToAddresses().contains("anotherReplyTo1@example.com"));
+        assertTrue(sendEmailRequest.replyToAddresses().contains("anotherReplyTo2@example.com"));
+        assertEquals("anotherSubject", getSubject(sendEmailRequest));
+        assertEquals("This is my message text.", getBody(sendEmailRequest));
+    }
+    
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext(
+                "org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml");
+    }
+
+    private String getBody(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.message().body().text().data();
+    }
+
+    private String getSubject(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.message().subject().data();
+    }
+
+    private List<String> getTo(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.destination().toAddresses();
+    }
+    
+    private List<String> getTo(SendRawEmailRequest sendEmailRequest) {
+        return sendEmailRequest.destinations();
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
new file mode 100644
index 0000000..98d2887
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.camel.BindToRegistry;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.ses.Ses2Constants;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+import software.amazon.awssdk.services.ses.model.SendEmailRequest;
+
+public class SesComponentTest extends CamelTestSupport {
+
+    @BindToRegistry("amazonSESClient")
+    private AmazonSESClientMock sesClient = new AmazonSESClientMock();
+    
+    @BindToRegistry("toList")
+    private List<String> toList = Arrays.asList("to1@example.com", "to2@example.com");
+    
+    @BindToRegistry("replyToList")
+    private List<String> replyToList = Arrays.asList("replyTo1@example.com", "replyTo2@example.com");
+
+    @Test
+    public void sendInOnlyMessageUsingUrlOptions() throws Exception {
+        Exchange exchange = template.send("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+            }
+        });
+        
+        assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+        
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("from@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("to1@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("to2@example.com"));
+        assertEquals("bounce@example.com", sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        assertTrue(sendEmailRequest.replyToAddresses().contains("replyTo1@example.com"));
+        assertTrue(sendEmailRequest.replyToAddresses().contains("replyTo2@example.com"));
+        assertEquals("Subject", getSubject(sendEmailRequest));
+        assertEquals("This is my message text.", getBody(sendEmailRequest));
+    }
+    
+    @Test
+    public void sendInOutMessageUsingUrlOptions() throws Exception {
+        Exchange exchange = template.request("direct:start", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+            }
+        });
+        
+        assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
+    }
+
+    @Test
+    public void sendMessageUsingMessageHeaders() throws Exception {
+        Exchange exchange = template.send("direct:start", new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setBody("This is my message text.");
+                exchange.getIn().setHeader(Ses2Constants.FROM, "anotherFrom@example.com");
+                exchange.getIn().setHeader(Ses2Constants.TO,
+                        Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, "anotherBounce@example.com");
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
+                        Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.SUBJECT, "anotherSubject");
+            }
+        });
+        
+        assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("anotherFrom@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("anotherTo1@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("anotherTo2@example.com"));
+        assertEquals("anotherBounce@example.com", sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        assertTrue(sendEmailRequest.replyToAddresses().contains("anotherReplyTo1@example.com"));
+        assertTrue(sendEmailRequest.replyToAddresses().contains("anotherReplyTo2@example.com"));
+        assertEquals("anotherSubject", getSubject(sendEmailRequest));
+        assertEquals("This is my message text.", getBody(sendEmailRequest));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("aws2-ses://from@example.com"
+                        + "?to=#toList"
+                        + "&subject=Subject"
+                        + "&returnPath=bounce@example.com"
+                        + "&replyToAddresses=#replyToList"
+                        + "&amazonSESClient=#amazonSESClient");
+            }
+        };
+    }
+
+    private String getBody(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.message().body().text().data();
+    }
+
+    private String getSubject(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.message().subject().data();
+    }
+
+    private List<String> getTo(SendEmailRequest sendEmailRequest) {
+        return sendEmailRequest.destination().toAddresses();
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentVerifierExtensionTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentVerifierExtensionTest.java
new file mode 100644
index 0000000..67e3447
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentVerifierExtensionTest.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Component;
+import org.apache.camel.component.extension.ComponentVerifierExtension;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SesComponentVerifierExtensionTest extends CamelTestSupport {
+
+    // *************************************************
+    // Tests (parameters)
+    // *************************************************
+    @Override
+    public boolean isUseRouteBuilder() {
+        return false;
+    }
+
+    @Test
+    public void testParameters() throws Exception {
+        Component component = context().getComponent("aws2-ses");
+
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "l");
+        parameters.put("from", "test@test.com");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.PARAMETERS, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.OK, result.getStatus());
+    }
+
+    @Test
+    public void testConnectivity() throws Exception {
+        Component component = context().getComponent("aws2-ses");
+        ComponentVerifierExtension verifier = component.getExtension(ComponentVerifierExtension.class).orElseThrow(IllegalStateException::new);
+
+        Map<String, Object> parameters = new HashMap<>();
+        parameters.put("secretKey", "l");
+        parameters.put("accessKey", "k");
+        parameters.put("region", "US_EAST_1");
+        parameters.put("from", "test@test.com");
+
+        ComponentVerifierExtension.Result result = verifier.verify(ComponentVerifierExtension.Scope.CONNECTIVITY, parameters);
+
+        Assert.assertEquals(ComponentVerifierExtension.Result.Status.ERROR, result.getStatus());
+    }
+
+}
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
new file mode 100644
index 0000000..7e8cfce
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.aws2.ses.integration;
+
+import java.util.Collections;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.aws2.ses.Ses2Constants;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Ignore;
+import org.junit.Test;
+
+@Ignore("Must be manually tested. Provide your own accessKey and secretKey!")
+public class SesComponentIntegrationTest extends CamelTestSupport {
+
+    @Test
+    public void sendUsingAccessKeyAndSecretKey() throws Exception {
+        Exchange exchange = template.send("direct:start", ExchangePattern.InOnly, new Processor() {
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(Ses2Constants.SUBJECT, "This is my subject");
+                exchange.getIn().setHeader(Ses2Constants.TO, Collections.singletonList("to@example.com"));
+                exchange.getIn().setBody("This is my message text.");
+            }
+        });
+
+        assertNotNull(exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
+            }
+        };
+    }
+}
diff --git a/components/camel-aws2-ses/src/test/resources/log4j2.properties b/components/camel-aws2-ses/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..512e81f
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-aws2-ses-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-aws2-ses/src/test/resources/org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml b/components/camel-aws2-ses/src/test/resources/org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml
new file mode 100644
index 0000000..6fc8109
--- /dev/null
+++ b/components/camel-aws2-ses/src/test/resources/org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start"/>
+            <to uri="aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&amp;returnPath=bounce@example.com"/>
+        </route>
+    </camelContext>
+
+    <bean id="amazonSESClient" class="org.apache.camel.component.aws2.ses.AmazonSESClientMock"/>
+</beans>
\ No newline at end of file
diff --git a/core/camel-componentdsl/pom.xml b/core/camel-componentdsl/pom.xml
index 928f33b..864e575 100644
--- a/core/camel-componentdsl/pom.xml
+++ b/core/camel-componentdsl/pom.xml
@@ -288,6 +288,12 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-aws2-ses</artifactId>
+			<scope>provided</scope>
+			<version>${project.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-aws2-translate</artifactId>
 			<scope>provided</scope>
 			<version>${project.version}</version>
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index bf7eab4..a79beec 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -574,6 +574,18 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.Aws2MskComponentBuilderFactory.aws2Msk();
     }
     /**
+     * AWS 2 Simple Email Service (camel-aws2-ses)
+     * The aws-ses component is used for sending emails with Amazon's SES
+     * service.
+     * 
+     * Category: cloud,mail
+     * Since: 3.1
+     * Maven coordinates: org.apache.camel:camel-aws2-ses
+     */
+    static org.apache.camel.builder.component.dsl.Aws2SesComponentBuilderFactory.Aws2SesComponentBuilder aws2Ses() {
+        return org.apache.camel.builder.component.dsl.Aws2SesComponentBuilderFactory.aws2Ses();
+    }
+    /**
      * AWS 2 Translate (camel-aws2-translate)
      * The aws2-translate component is used for managing Amazon Translate
      * 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2SesComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2SesComponentBuilderFactory.java
new file mode 100644
index 0000000..cc274a6
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/Aws2SesComponentBuilderFactory.java
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.aws2.ses.Ses2Component;
+
+/**
+ * The aws-ses component is used for sending emails with Amazon's SES service.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface Aws2SesComponentBuilderFactory {
+
+    /**
+     * AWS 2 Simple Email Service (camel-aws2-ses)
+     * The aws-ses component is used for sending emails with Amazon's SES
+     * service.
+     * 
+     * Category: cloud,mail
+     * Since: 3.1
+     * Maven coordinates: org.apache.camel:camel-aws2-ses
+     */
+    static Aws2SesComponentBuilder aws2Ses() {
+        return new Aws2SesComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the AWS 2 Simple Email Service component.
+     */
+    interface Aws2SesComponentBuilder extends ComponentBuilder<Ses2Component> {
+        /**
+         * Amazon AWS Access Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2SesComponentBuilder accessKey(java.lang.String accessKey) {
+            doSetProperty("accessKey", accessKey);
+            return this;
+        }
+        /**
+         * 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.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default Aws2SesComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The region in which SES client needs to work.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2SesComponentBuilder region(java.lang.String region) {
+            doSetProperty("region", region);
+            return this;
+        }
+        /**
+         * Amazon AWS Secret Key.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default Aws2SesComponentBuilder secretKey(java.lang.String secretKey) {
+            doSetProperty("secretKey", secretKey);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default Aws2SesComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * The AWS SES default configuration.
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.aws2.ses.Ses2Configuration</code>
+         * type.
+         * 
+         * Group: advanced
+         */
+        default Aws2SesComponentBuilder configuration(
+                org.apache.camel.component.aws2.ses.Ses2Configuration configuration) {
+            doSetProperty("configuration", configuration);
+            return this;
+        }
+    }
+
+    class Aws2SesComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<Ses2Component>
+            implements
+                Aws2SesComponentBuilder {
+        @Override
+        protected Ses2Component buildConcreteComponent() {
+            return new Ses2Component();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "accessKey": ((Ses2Component) component).setAccessKey((java.lang.String) value); return true;
+            case "lazyStartProducer": ((Ses2Component) component).setLazyStartProducer((boolean) value); return true;
+            case "region": ((Ses2Component) component).setRegion((java.lang.String) value); return true;
+            case "secretKey": ((Ses2Component) component).setSecretKey((java.lang.String) value); return true;
+            case "basicPropertyBinding": ((Ses2Component) component).setBasicPropertyBinding((boolean) value); return true;
+            case "configuration": ((Ses2Component) component).setConfiguration((org.apache.camel.component.aws2.ses.Ses2Configuration) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index 9c71d2c..4371649 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -561,6 +561,26 @@
     "artifactId": "camel-aws2-msk",
     "version": "3.1.0-SNAPSHOT"
   },
+  "Aws2SesComponentBuilderFactory": {
+    "kind": "component",
+    "scheme": "aws2-ses",
+    "extendsScheme": "",
+    "syntax": "aws2-ses:from",
+    "title": "AWS 2 Simple Email Service",
+    "description": "The aws-ses component is used for sending emails with Amazon's SES service.",
+    "label": "cloud,mail",
+    "deprecated": false,
+    "deprecationNote": "cloud,mail",
+    "async": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false,
+    "javaType": "org.apache.camel.component.aws2.ses.Ses2Component",
+    "firstVersion": "3.1.0",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-aws2-ses",
+    "version": "3.1.0-SNAPSHOT"
+  },
   "Aws2TranslateComponentBuilderFactory": {
     "kind": "component",
     "scheme": "aws2-translate",


[camel] 03/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2, regen docs

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 4dd382901906db8edb0d25049eab4d2406fbea20
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 13:56:58 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2, regen docs
---
 .../src/main/docs/aws2-ses-component.adoc          | 184 +++++++++++++++++++++
 1 file changed, 184 insertions(+)

diff --git a/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc b/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
new file mode 100644
index 0000000..a26f199
--- /dev/null
+++ b/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
@@ -0,0 +1,184 @@
+= AWS 2 Simple Email Service Component
+
+*Since Camel 2.9*
+*Since Camel 3.1*
+
+
+// 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]
+------------------------
+aws2-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 2 Simple Email Service component supports 6 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *accessKey* (producer) | Amazon AWS Access Key |  | String
+| *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 [...]
+| *region* (producer) | The region in which SES client needs to work |  | String
+| *secretKey* (producer) | Amazon AWS Secret Key |  | String
+| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *configuration* (advanced) | The AWS SES default configuration |  | Ses2Configuration
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AWS 2 Simple Email Service endpoint is configured using URI syntax:
+
+----
+aws2-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 |  | SesClient
+| *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 [...]
+| *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. The value can be one of: HTTP, HTTPS | 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
+
+
+
+
+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 SesClient configuration
+
+If you need more control over the `SesClient` instance
+configuration you can create your own instance and refer to it from the
+URI:
+
+[source,java]
+-------------------------------------------------------------
+from("direct:start")
+.to("aws2-ses://example@example.com?amazonSESClient=#client");
+-------------------------------------------------------------
+
+The `#client` refers to a `SesClient` in the
+Registry.
+
+== Automatic detection of SesClient client in registry
+
+The component is capable of detecting the presence of an SesClient 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("aws2-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-aws2-ses</artifactId>
+    <version>${camel-version}</version>
+</dependency>
+---------------------------------------
+
+where `$\{camel-version\}` must be replaced by the actual version of Camel.
+
+
+include::camel-spring-boot::page$aws-ses-starter.adoc[]


[camel] 02/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2, docs

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 9eac80d9027a01361e30171d121349322cb84883
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 13:55:38 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2, docs
---
 .../src/main/docs/aws-ses-component.adoc           | 196 ---------------------
 1 file changed, 196 deletions(-)

diff --git a/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc b/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc
deleted file mode 100644
index d89ba8f..0000000
--- a/components/camel-aws2-ses/src/main/docs/aws-ses-component.adoc
+++ /dev/null
@@ -1,196 +0,0 @@
-[[aws-ses-component]]
-= AWS Simple Email Service Component
-
-*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 6 options, which are listed below.
-
-
-
-[width="100%",cols="2,5,^1,2",options="header"]
-|===
-| Name | Description | Default | Type
-| *accessKey* (producer) | Amazon AWS Access Key |  | String
-| *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 [...]
-| *region* (producer) | The region in which SES client needs to work |  | String
-| *secretKey* (producer) | Amazon AWS Secret Key |  | String
-| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
-| *configuration* (advanced) | The AWS SES default configuration |  | SesConfiguration
-|===
-// 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 [...]
-| *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. The value can be one of: HTTP, HTTPS | 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
-
-
-
-
-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.
-
-
-include::camel-spring-boot::page$aws-ses-starter.adoc[]


[camel] 06/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2, Fixed CS

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b8c5d3bf1b63bd142259a92589067702a08e4549
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 15:00:18 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2, Fixed CS
---
 .../camel/component/aws2/ses/Ses2Component.java    |  3 +-
 .../aws2/ses/Ses2ComponentVerifierExtension.java   |  1 -
 .../component/aws2/ses/Ses2Configuration.java      | 42 +++++++++-------
 .../camel/component/aws2/ses/Ses2Constants.java    |  4 +-
 .../camel/component/aws2/ses/Ses2Endpoint.java     | 11 ++---
 .../camel/component/aws2/ses/Ses2Producer.java     | 21 ++++----
 .../component/aws2/ses/AmazonSESClientMock.java    | 26 +++++-----
 .../camel/component/aws2/ses/MockMessage.java      | 23 +++------
 .../aws2/ses/SESComponentClientRegistryTest.java   |  8 ++-
 .../aws2/ses/SesComponentConfigurationTest.java    | 57 ++++++++++------------
 .../component/aws2/ses/SesComponentSpringTest.java | 39 +++++++--------
 .../camel/component/aws2/ses/SesComponentTest.java | 31 +++++-------
 .../integration/SesComponentIntegrationTest.java   |  3 +-
 13 files changed, 121 insertions(+), 148 deletions(-)

diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
index a2c3360..e9b53bc 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Component.java
@@ -24,7 +24,6 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.annotations.Component;
 import org.apache.camel.support.DefaultComponent;
-
 import software.amazon.awssdk.services.ses.SesClient;
 
 @Component("aws2-ses")
@@ -113,7 +112,7 @@ public class Ses2Component extends DefaultComponent {
     public void setRegion(String region) {
         this.region = region;
     }
-    
+
     private void checkAndSetRegistryClient(Ses2Configuration configuration) {
         Set<SesClient> clients = getCamelContext().getRegistry().findByType(SesClient.class);
         if (clients.size() == 1) {
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
index e217f07..9990101 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2ComponentVerifierExtension.java
@@ -22,7 +22,6 @@ import org.apache.camel.component.extension.verifier.DefaultComponentVerifierExt
 import org.apache.camel.component.extension.verifier.ResultBuilder;
 import org.apache.camel.component.extension.verifier.ResultErrorBuilder;
 import org.apache.camel.component.extension.verifier.ResultErrorHelper;
-
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
 import software.amazon.awssdk.core.exception.SdkClientException;
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
index 1143343..96634a9 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Configuration.java
@@ -19,19 +19,19 @@ package org.apache.camel.component.aws2.ses;
 import java.util.Arrays;
 import java.util.List;
 
-import software.amazon.awssdk.core.Protocol;
-import software.amazon.awssdk.services.ses.SesClient;
-
 import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriParams;
 import org.apache.camel.spi.UriPath;
+import software.amazon.awssdk.core.Protocol;
+import software.amazon.awssdk.services.ses.SesClient;
 
 @UriParams
 public class Ses2Configuration implements Cloneable {
 
-    @UriPath @Metadata(required = true)
+    @UriPath
+    @Metadata(required = true)
     private String from;
     @UriParam
     private SesClient amazonSESClient;
@@ -94,14 +94,16 @@ public class Ses2Configuration implements Cloneable {
     }
 
     /**
-     * List of destination email address. Can be overriden with 'CamelAwsSesTo' header.
+     * List of destination email address. Can be overriden with 'CamelAwsSesTo'
+     * header.
      */
     public void setTo(List<String> to) {
         this.to = to;
     }
 
     /**
-     * List of destination email address. Can be overriden with 'CamelAwsSesTo' header.
+     * List of destination email address. Can be overriden with 'CamelAwsSesTo'
+     * header.
      */
     public void setTo(String to) {
         this.to = Arrays.asList(to.split(","));
@@ -123,38 +125,41 @@ public class Ses2Configuration implements Cloneable {
     }
 
     /**
-     * The subject which is used if the message header 'CamelAwsSesSubject' is not present.
+     * The subject which is used if the message header 'CamelAwsSesSubject' is
+     * not present.
      */
     public void setSubject(String subject) {
         this.subject = subject;
     }
-    
+
     public String getReturnPath() {
         return returnPath;
     }
 
     /**
-     * The email address to which bounce notifications are to be forwarded, override it using 'CamelAwsSesReturnPath' header.
+     * The email address to which bounce notifications are to be forwarded,
+     * override it using 'CamelAwsSesReturnPath' header.
      */
     public void setReturnPath(String returnPath) {
         this.returnPath = returnPath;
     }
-    
+
     public List<String> getReplyToAddresses() {
         return replyToAddresses;
     }
 
     /**
-     * List of reply-to email address(es) for the message, override it using 'CamelAwsSesReplyToAddresses' header.
+     * List of reply-to email address(es) for the message, override it using
+     * 'CamelAwsSesReplyToAddresses' header.
      */
     public void setReplyToAddresses(List<String> replyToAddresses) {
         this.replyToAddresses = replyToAddresses;
     }
-    
+
     public void setReplyToAddresses(String replyToAddresses) {
         this.replyToAddresses = Arrays.asList(replyToAddresses.split(","));
     }
-    
+
     public Protocol getProxyProtocol() {
         return proxyProtocol;
     }
@@ -165,7 +170,7 @@ public class Ses2Configuration implements Cloneable {
     public void setProxyProtocol(Protocol proxyProtocol) {
         this.proxyProtocol = proxyProtocol;
     }
-    
+
     public String getProxyHost() {
         return proxyHost;
     }
@@ -187,19 +192,20 @@ public class Ses2Configuration implements Cloneable {
     public void setProxyPort(Integer proxyPort) {
         this.proxyPort = proxyPort;
     }
-    
+
     public String getRegion() {
         return 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()
+     * 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()
      */
     public void setRegion(String region) {
         this.region = region;
     }
-    
+
     // *************************************************
     //
     // *************************************************
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
index 6240dd3..0573798 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Constants.java
@@ -20,10 +20,10 @@ package org.apache.camel.component.aws2.ses;
  * Constants used in Camel AWS SES component
  */
 public interface Ses2Constants {
-    
+
     String FROM = "CamelAwsSesFrom";
     String MESSAGE_ID = "CamelAwsSesMessageId";
-    String REPLY_TO_ADDRESSES = "CamelAwsSesReplyToAddresses";    
+    String REPLY_TO_ADDRESSES = "CamelAwsSesReplyToAddresses";
     String RETURN_PATH = "CamelAwsSesReturnPath";
     String SUBJECT = "CamelAwsSesSubject";
     String TO = "CamelAwsSesTo";
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
index 71839db..4d95fb0 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Endpoint.java
@@ -26,7 +26,6 @@ import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.support.DefaultEndpoint;
 import org.apache.camel.util.ObjectHelper;
-
 import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
 import software.amazon.awssdk.http.apache.ApacheHttpClient;
@@ -50,15 +49,13 @@ public class Ses2Endpoint extends DefaultEndpoint {
         super(uri, component);
         this.configuration = configuration;
     }
-    
+
     @Override
     public void doStart() throws Exception {
         super.doStart();
-        sesClient = configuration.getAmazonSESClient() != null
-            ? configuration.getAmazonSESClient()
-            : createSESClient();
+        sesClient = configuration.getAmazonSESClient() != null ? configuration.getAmazonSESClient() : createSESClient();
     }
-    
+
     @Override
     public void doStop() throws Exception {
         if (ObjectHelper.isEmpty(configuration.getAmazonSESClient())) {
@@ -88,7 +85,7 @@ public class Ses2Endpoint extends DefaultEndpoint {
     }
 
     private SesClient createSESClient() {
-    	SesClient client = null;
+        SesClient client = null;
         SesClientBuilder clientBuilder = SesClient.builder();
         ProxyConfiguration.Builder proxyConfig = null;
         ApacheHttpClient.Builder httpClientBuilder = null;
diff --git a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
index 49691c0..7ebba4e 100644
--- a/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
+++ b/components/camel-aws2-ses/src/main/java/org/apache/camel/component/aws2/ses/Ses2Producer.java
@@ -29,7 +29,6 @@ import org.apache.camel.support.DefaultProducer;
 import org.apache.camel.util.URISupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import software.amazon.awssdk.core.SdkBytes;
 import software.amazon.awssdk.services.ses.model.Body;
 import software.amazon.awssdk.services.ses.model.Content;
@@ -48,7 +47,7 @@ public class Ses2Producer extends DefaultProducer {
     private static final Logger LOG = LoggerFactory.getLogger(Ses2Producer.class);
 
     private transient String sesProducerToString;
-    
+
     public Ses2Producer(Endpoint endpoint) {
         super(endpoint);
     }
@@ -82,7 +81,7 @@ public class Ses2Producer extends DefaultProducer {
 
         return request.build();
     }
-    
+
     private SendRawEmailRequest createRawMailRequest(Exchange exchange) throws Exception {
         SendRawEmailRequest.Builder request = SendRawEmailRequest.builder();
         request.source(determineFrom(exchange));
@@ -92,7 +91,7 @@ public class Ses2Producer extends DefaultProducer {
     }
 
     private software.amazon.awssdk.services.ses.model.Message createMessage(Exchange exchange) {
-    	software.amazon.awssdk.services.ses.model.Message.Builder message = software.amazon.awssdk.services.ses.model.Message.builder();
+        software.amazon.awssdk.services.ses.model.Message.Builder message = software.amazon.awssdk.services.ses.model.Message.builder();
         Boolean isHtmlEmail = exchange.getIn().getHeader(Ses2Constants.HTML_EMAIL, false, Boolean.class);
         String content = exchange.getIn().getBody(String.class);
         if (isHtmlEmail) {
@@ -103,9 +102,9 @@ public class Ses2Producer extends DefaultProducer {
         message.subject(Content.builder().data(determineSubject(exchange)).build());
         return message.build();
     }
-    
+
     private software.amazon.awssdk.services.ses.model.RawMessage createRawMessage(Exchange exchange) throws Exception {
-    	software.amazon.awssdk.services.ses.model.RawMessage.Builder message = software.amazon.awssdk.services.ses.model.RawMessage.builder();
+        software.amazon.awssdk.services.ses.model.RawMessage.Builder message = software.amazon.awssdk.services.ses.model.RawMessage.builder();
         javax.mail.Message content = exchange.getIn().getBody(javax.mail.Message.class);
         OutputStream byteOutput = new ByteArrayOutputStream();
         try {
@@ -118,7 +117,7 @@ public class Ses2Producer extends DefaultProducer {
         message.data(SdkBytes.fromByteBuffer(ByteBuffer.wrap(messageByteArray)));
         return message.build();
     }
-    
+
     @SuppressWarnings("unchecked")
     private Collection<String> determineReplyToAddresses(Exchange exchange) {
         List<String> replyToAddresses = exchange.getIn().getHeader(Ses2Constants.REPLY_TO_ADDRESSES, List.class);
@@ -127,7 +126,7 @@ public class Ses2Producer extends DefaultProducer {
         }
         return replyToAddresses;
     }
-    
+
     private String determineReturnPath(Exchange exchange) {
         String returnPath = exchange.getIn().getHeader(Ses2Constants.RETURN_PATH, String.class);
         if (returnPath == null) {
@@ -144,7 +143,7 @@ public class Ses2Producer extends DefaultProducer {
         }
         return Destination.builder().toAddresses(to).build();
     }
-    
+
     @SuppressWarnings("unchecked")
     private List determineRawTo(Exchange exchange) {
         List<String> to = exchange.getIn().getHeader(Ses2Constants.TO, List.class);
@@ -184,9 +183,9 @@ public class Ses2Producer extends DefaultProducer {
 
     @Override
     public Ses2Endpoint getEndpoint() {
-        return (Ses2Endpoint) super.getEndpoint();
+        return (Ses2Endpoint)super.getEndpoint();
     }
-    
+
     public static Message getMessageForResponse(final Exchange exchange) {
         return exchange.getMessage();
     }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
index 5f2ebd4..a65487e 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/AmazonSESClientMock.java
@@ -34,7 +34,7 @@ public class AmazonSESClientMock implements SesClient {
         this.sendEmailRequest = sendEmailRequest;
         return SendEmailResponse.builder().messageId("1").build();
     }
-    
+
     @Override
     public SendRawEmailResponse sendRawEmail(SendRawEmailRequest sendRawEmailRequest) {
         this.sendRawEmailRequest = sendRawEmailRequest;
@@ -44,20 +44,20 @@ public class AmazonSESClientMock implements SesClient {
     public SendEmailRequest getSendEmailRequest() {
         return sendEmailRequest;
     }
-    
+
     public SendRawEmailRequest getSendRawEmailRequest() {
         return sendRawEmailRequest;
     }
 
-	@Override
-	public String serviceName() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void close() {
-		// TODO Auto-generated method stub
-		
-	}
+    @Override
+    public String serviceName() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void close() {
+        // TODO Auto-generated method stub
+
+    }
 }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
index 588feed..be12be6 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/MockMessage.java
@@ -105,7 +105,7 @@ public class MockMessage extends Message {
     @Override
     public void setText(String text) throws MessagingException {
     }
-    
+
     @Override
     public void setContent(Multipart mp) throws MessagingException {
     }
@@ -120,13 +120,11 @@ public class MockMessage extends Message {
     }
 
     @Override
-    public void setHeader(String headername, String headervalue)
-        throws MessagingException {
+    public void setHeader(String headername, String headervalue) throws MessagingException {
     }
 
     @Override
-    public void addHeader(String headername, String headervalue)
-        throws MessagingException {
+    public void addHeader(String headername, String headervalue) throws MessagingException {
     }
 
     @Override
@@ -139,14 +137,12 @@ public class MockMessage extends Message {
     }
 
     @Override
-    public Enumeration<Header> getMatchingHeaders(String[] headernames)
-        throws MessagingException {
+    public Enumeration<Header> getMatchingHeaders(String[] headernames) throws MessagingException {
         return null;
     }
 
     @Override
-    public Enumeration<Header> getNonMatchingHeaders(String[] headernames)
-        throws MessagingException {
+    public Enumeration<Header> getNonMatchingHeaders(String[] headernames) throws MessagingException {
         return null;
     }
 
@@ -168,19 +164,16 @@ public class MockMessage extends Message {
     }
 
     @Override
-    public Address[] getRecipients(RecipientType type)
-        throws MessagingException {
+    public Address[] getRecipients(RecipientType type) throws MessagingException {
         return null;
     }
 
     @Override
-    public void setRecipients(RecipientType type, Address[] addresses)
-        throws MessagingException {
+    public void setRecipients(RecipientType type, Address[] addresses) throws MessagingException {
     }
 
     @Override
-    public void addRecipients(RecipientType type, Address[] addresses)
-        throws MessagingException {
+    public void addRecipients(RecipientType type, Address[] addresses) throws MessagingException {
     }
 
     @Override
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
index e6e8538..d76a2ae 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SESComponentClientRegistryTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.component.aws2.ses;
 
-import org.apache.camel.component.aws2.ses.Ses2Component;
-import org.apache.camel.component.aws2.ses.Ses2Endpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
 
@@ -29,15 +27,15 @@ public class SESComponentClientRegistryTest extends CamelTestSupport {
         AmazonSESClientMock awsSESClient = new AmazonSESClientMock();
         context.getRegistry().bind("awsSesClient", awsSESClient);
         Ses2Component component = new Ses2Component(context);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws-ses://from@example.com");
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws-ses://from@example.com");
 
         assertNotNull(endpoint.getConfiguration().getAmazonSESClient());
     }
-    
+
     @Test(expected = IllegalArgumentException.class)
     public void createEndpointWithMinimalSESClientMisconfiguration() throws Exception {
 
         Ses2Component component = new Ses2Component(context);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws-ses://from@example.com");
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws-ses://from@example.com");
     }
 }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
index ab7b09d..6f578c1 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentConfigurationTest.java
@@ -19,25 +19,22 @@ package org.apache.camel.component.aws2.ses;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.component.aws2.ses.Ses2Component;
-import org.apache.camel.component.aws2.ses.Ses2Endpoint;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
-
 import software.amazon.awssdk.core.Protocol;
 import software.amazon.awssdk.regions.Region;
 
 public class SesComponentConfigurationTest extends CamelTestSupport {
-    
+
     @Test
     public void createEndpointWithMinimalConfiguration() throws Exception {
         AmazonSESClientMock mock = new AmazonSESClientMock();
 
         context.getRegistry().bind("amazonSESClient", mock);
-        
+
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx&secretKey=yyy");
-        
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx&secretKey=yyy");
+
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
         assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
@@ -51,7 +48,7 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
     @Test
     public void createEndpointWithOnlyAccessKeyAndSecretKey() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
 
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
@@ -62,17 +59,16 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
         assertNull(endpoint.getConfiguration().getReturnPath());
         assertNull(endpoint.getConfiguration().getReplyToAddresses());
     }
-    
+
     @Test
     public void createEndpointWithMinimalConfigurationAndProvidedClient() throws Exception {
         AmazonSESClientMock mock = new AmazonSESClientMock();
 
         context.getRegistry().bind("amazonSESClient", mock);
-        
+
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?"
-                + "amazonSESClient=#amazonSESClient");
-        
+        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://from@example.com?" + "amazonSESClient=#amazonSESClient");
+
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertNull(endpoint.getConfiguration().getAccessKey());
         assertNull(endpoint.getConfiguration().getSecretKey());
@@ -97,10 +93,10 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
         context.getRegistry().bind("toList", to);
         context.getRegistry().bind("replyToList", replyAddress);
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
-        Ses2Endpoint endpoint = (Ses2Endpoint) component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx"
-            + "&secretKey=yyy&to=#toList&subject=Subject"
-            + "&returnPath=bounce@example.com&replyToAddresses=#replyToList");
-        
+        Ses2Endpoint endpoint = (Ses2Endpoint)component
+            .createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx" + "&secretKey=yyy&to=#toList&subject=Subject"
+                            + "&returnPath=bounce@example.com&replyToAddresses=#replyToList");
+
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertEquals("xxx", endpoint.getConfiguration().getAccessKey());
         assertEquals("yyy", endpoint.getConfiguration().getSecretKey());
@@ -114,43 +110,43 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
         assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("replyTo1@example.com"));
         assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("replyTo2@example.com"));
     }
-    
+
     @Test(expected = IllegalArgumentException.class)
     public void createEndpointWithoutSourceName() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.createEndpoint("aws2-ses:// ");
     }
-    
+
     @Test(expected = IllegalArgumentException.class)
     public void createEndpointWithoutAmazonSESClientConfiguration() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.createEndpoint("aws2-ses://from@example.com");
     }
-    
+
     @Test(expected = IllegalArgumentException.class)
     public void createEndpointWithoutAccessKeyConfiguration() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.createEndpoint("aws2-ses://from@example.com?secretKey=yyy");
     }
-    
+
     @Test(expected = IllegalArgumentException.class)
     public void createEndpointWithoutSecretKeyConfiguration() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.createEndpoint("aws2-ses://from@example.com?accessKey=xxx");
     }
-    
+
     @Test
     public void createEndpointWithComponentElements() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.setAccessKey("XXX");
         component.setSecretKey("YYY");
         Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://from@example.com");
-        
+
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertEquals("XXX", endpoint.getConfiguration().getAccessKey());
         assertEquals("YYY", endpoint.getConfiguration().getSecretKey());
     }
-    
+
     @Test
     public void createEndpointWithComponentAndEndpointElements() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
@@ -158,21 +154,22 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
         component.setSecretKey("YYY");
         component.setRegion(Region.US_WEST_1.toString());
         Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws-ses://from@example.com?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
-        
+
         assertEquals("from@example.com", endpoint.getConfiguration().getFrom());
         assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
         assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
         assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
     }
-    
+
     @Test
     public void createEndpointWithComponentEndpointElementsAndProxy() throws Exception {
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.setAccessKey("XXX");
         component.setSecretKey("YYY");
         component.setRegion(Region.US_WEST_1.toString());
-        Ses2Endpoint endpoint = (Ses2Endpoint)component.createEndpoint("aws2-ses://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000&proxyProtocol=HTTP");
-        
+        Ses2Endpoint endpoint = (Ses2Endpoint)component
+            .createEndpoint("aws2-ses://label?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1&proxyHost=localhost&proxyPort=9000&proxyProtocol=HTTP");
+
         assertEquals("xxxxxx", endpoint.getConfiguration().getAccessKey());
         assertEquals("yyyyy", endpoint.getConfiguration().getSecretKey());
         assertEquals("US_EAST_1", endpoint.getConfiguration().getRegion());
@@ -180,13 +177,13 @@ public class SesComponentConfigurationTest extends CamelTestSupport {
         assertEquals("localhost", endpoint.getConfiguration().getProxyHost());
         assertEquals(Integer.valueOf(9000), endpoint.getConfiguration().getProxyPort());
     }
-    
+
     @Test
     public void createEndpointWithoutSecretKeyAndAccessKeyConfiguration() throws Exception {
         AmazonSESClientMock mock = new AmazonSESClientMock();
 
         context.getRegistry().bind("amazonSESClient", mock);
-        
+
         Ses2Component component = context.getComponent("aws2-ses", Ses2Component.class);
         component.createEndpoint("aws2-ses://from@example.com?amazonSESClient=#amazonSESClient");
     }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
index 545c649..4f2b461 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentSpringTest.java
@@ -21,25 +21,23 @@ import java.util.List;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
-import org.apache.camel.component.aws2.ses.Ses2Constants;
 import org.apache.camel.test.spring.CamelSpringTestSupport;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.context.support.AbstractApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
-
 import software.amazon.awssdk.services.ses.model.SendEmailRequest;
 import software.amazon.awssdk.services.ses.model.SendRawEmailRequest;
 
 public class SesComponentSpringTest extends CamelSpringTestSupport {
-    
+
     private AmazonSESClientMock sesClient;
-    
+
     @Override
     @Before
     public void setUp() throws Exception {
         super.setUp();
-        
+
         sesClient = context.getRegistry().lookupByNameAndType("amazonSESClient", AmazonSESClientMock.class);
     }
 
@@ -51,15 +49,15 @@ public class SesComponentSpringTest extends CamelSpringTestSupport {
                 exchange.getIn().setBody("This is my message text.");
             }
         });
-        
+
         assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
-        
+
         SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
         assertEquals("from@example.com", sendEmailRequest.source());
         assertEquals("bounce@example.com", sendEmailRequest.returnPath());
         assertEquals("This is my message text.", getBody(sendEmailRequest));
     }
-    
+
     @Test
     public void sendInOutMessageUsingUrlOptions() throws Exception {
         Exchange exchange = template.request("direct:start", new Processor() {
@@ -68,22 +66,22 @@ public class SesComponentSpringTest extends CamelSpringTestSupport {
                 exchange.getIn().setBody("This is my message text.");
             }
         });
-        
+
         assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
     }
-    
+
     @Test
     public void sendRawMessage() throws Exception {
-        final MockMessage mess = new MockMessage();  
+        final MockMessage mess = new MockMessage();
         Exchange exchange = template.request("direct:start", new Processor() {
             @Override
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setBody(mess);
             }
         });
-        
+
         assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
-        
+
         SendRawEmailRequest sendRawEmailRequest = sesClient.getSendRawEmailRequest();
         assertEquals("from@example.com", sendRawEmailRequest.source());
     }
@@ -94,15 +92,13 @@ public class SesComponentSpringTest extends CamelSpringTestSupport {
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setBody("This is my message text.");
                 exchange.getIn().setHeader(Ses2Constants.FROM, "anotherFrom@example.com");
-                exchange.getIn().setHeader(Ses2Constants.TO,
-                        Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.TO, Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
                 exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, "anotherBounce@example.com");
-                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
-                        Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES, Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
                 exchange.getIn().setHeader(Ses2Constants.SUBJECT, "anotherSubject");
             }
         });
-        
+
         assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
 
         SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
@@ -117,11 +113,10 @@ public class SesComponentSpringTest extends CamelSpringTestSupport {
         assertEquals("anotherSubject", getSubject(sendEmailRequest));
         assertEquals("This is my message text.", getBody(sendEmailRequest));
     }
-    
+
     @Override
     protected AbstractApplicationContext createApplicationContext() {
-        return new ClassPathXmlApplicationContext(
-                "org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml");
+        return new ClassPathXmlApplicationContext("org/apache/camel/component/aws2/ses/SESComponentSpringTest-context.xml");
     }
 
     private String getBody(SendEmailRequest sendEmailRequest) {
@@ -135,7 +130,7 @@ public class SesComponentSpringTest extends CamelSpringTestSupport {
     private List<String> getTo(SendEmailRequest sendEmailRequest) {
         return sendEmailRequest.destination().toAddresses();
     }
-    
+
     private List<String> getTo(SendRawEmailRequest sendEmailRequest) {
         return sendEmailRequest.destinations();
     }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
index 98d2887..df78663 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/SesComponentTest.java
@@ -23,20 +23,18 @@ import org.apache.camel.BindToRegistry;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.aws2.ses.Ses2Constants;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Test;
-
 import software.amazon.awssdk.services.ses.model.SendEmailRequest;
 
 public class SesComponentTest extends CamelTestSupport {
 
     @BindToRegistry("amazonSESClient")
     private AmazonSESClientMock sesClient = new AmazonSESClientMock();
-    
+
     @BindToRegistry("toList")
     private List<String> toList = Arrays.asList("to1@example.com", "to2@example.com");
-    
+
     @BindToRegistry("replyToList")
     private List<String> replyToList = Arrays.asList("replyTo1@example.com", "replyTo2@example.com");
 
@@ -48,9 +46,9 @@ public class SesComponentTest extends CamelTestSupport {
                 exchange.getIn().setBody("This is my message text.");
             }
         });
-        
+
         assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
-        
+
         SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
         assertEquals("from@example.com", sendEmailRequest.source());
         assertEquals(2, getTo(sendEmailRequest).size());
@@ -63,7 +61,7 @@ public class SesComponentTest extends CamelTestSupport {
         assertEquals("Subject", getSubject(sendEmailRequest));
         assertEquals("This is my message text.", getBody(sendEmailRequest));
     }
-    
+
     @Test
     public void sendInOutMessageUsingUrlOptions() throws Exception {
         Exchange exchange = template.request("direct:start", new Processor() {
@@ -72,7 +70,7 @@ public class SesComponentTest extends CamelTestSupport {
                 exchange.getIn().setBody("This is my message text.");
             }
         });
-        
+
         assertEquals("1", exchange.getMessage().getHeader(Ses2Constants.MESSAGE_ID));
     }
 
@@ -82,15 +80,13 @@ public class SesComponentTest extends CamelTestSupport {
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setBody("This is my message text.");
                 exchange.getIn().setHeader(Ses2Constants.FROM, "anotherFrom@example.com");
-                exchange.getIn().setHeader(Ses2Constants.TO,
-                        Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.TO, Arrays.asList("anotherTo1@example.com", "anotherTo2@example.com"));
                 exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, "anotherBounce@example.com");
-                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
-                        Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES, Arrays.asList("anotherReplyTo1@example.com", "anotherReplyTo2@example.com"));
                 exchange.getIn().setHeader(Ses2Constants.SUBJECT, "anotherSubject");
             }
         });
-        
+
         assertEquals("1", exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
 
         SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
@@ -111,13 +107,8 @@ public class SesComponentTest extends CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:start")
-                    .to("aws2-ses://from@example.com"
-                        + "?to=#toList"
-                        + "&subject=Subject"
-                        + "&returnPath=bounce@example.com"
-                        + "&replyToAddresses=#replyToList"
-                        + "&amazonSESClient=#amazonSESClient");
+                from("direct:start").to("aws2-ses://from@example.com" + "?to=#toList" + "&subject=Subject" + "&returnPath=bounce@example.com" + "&replyToAddresses=#replyToList"
+                                        + "&amazonSESClient=#amazonSESClient");
             }
         };
     }
diff --git a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
index 7e8cfce..58a0499 100644
--- a/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
+++ b/components/camel-aws2-ses/src/test/java/org/apache/camel/component/aws2/ses/integration/SesComponentIntegrationTest.java
@@ -48,8 +48,7 @@ public class SesComponentIntegrationTest extends CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("direct:start")
-                    .to("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
+                from("direct:start").to("aws2-ses://from@example.com?accessKey=xxx&secretKey=yyy");
             }
         };
     }


[camel] 04/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2, Added component to kit

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 00db3a149cf44ac7b3afc82847ec1ebeeda6d528
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 13:59:15 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2, Added component to kit
---
 apache-camel/pom.xml                             | 5 +++++
 apache-camel/src/main/descriptors/common-bin.xml | 1 +
 bom/camel-bom/pom.xml                            | 5 +++++
 components/pom.xml                               | 1 +
 parent/pom.xml                                   | 5 +++++
 5 files changed, 17 insertions(+)

diff --git a/apache-camel/pom.xml b/apache-camel/pom.xml
index dccb927..c9781d8 100644
--- a/apache-camel/pom.xml
+++ b/apache-camel/pom.xml
@@ -349,6 +349,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.camel</groupId>
+      <artifactId>camel-aws2-ses</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
       <artifactId>camel-aws2-translate</artifactId>
       <version>${project.version}</version>
     </dependency>
diff --git a/apache-camel/src/main/descriptors/common-bin.xml b/apache-camel/src/main/descriptors/common-bin.xml
index d4295b3..badb2ac 100644
--- a/apache-camel/src/main/descriptors/common-bin.xml
+++ b/apache-camel/src/main/descriptors/common-bin.xml
@@ -94,6 +94,7 @@
         <include>org.apache.camel:camel-aws2-kms</include>
         <include>org.apache.camel:camel-aws2-mq</include>
         <include>org.apache.camel:camel-aws2-msk</include>
+        <include>org.apache.camel:camel-aws2-ses</include>
         <include>org.apache.camel:camel-aws2-translate</include>
         <include>org.apache.camel:camel-azure</include>
         <include>org.apache.camel:camel-barcode</include>
diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index 5b46e55..df6f9e6 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -263,6 +263,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-aws2-ses</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-aws2-translate</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/components/pom.xml b/components/pom.xml
index df29b4f..473a8b3 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -132,6 +132,7 @@
         <module>camel-aws2-kms</module>
         <module>camel-aws2-msk</module>
         <module>camel-aws2-mq</module>
+        <module>camel-aws2-ses</module>
         <module>camel-aws2-translate</module>
         <module>camel-aws-xray</module>
         <module>camel-azure</module>
diff --git a/parent/pom.xml b/parent/pom.xml
index 2b61d8a..344e9d1 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1070,6 +1070,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-aws2-ses</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-aws2-translate</artifactId>
         <version>${project.version}</version>
       </dependency>


[camel] 05/06: CAMEL-14551 - Create an AWS-SES component based on SDK v2, Regen docs

Posted by ac...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 8e376ffaed244925442be3e5f01a6c93311fca43
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Feb 13 14:50:52 2020 +0100

    CAMEL-14551 - Create an AWS-SES component based on SDK v2, Regen docs
---
 components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc    | 6 ++++--
 docs/components/modules/ROOT/nav.adoc                              | 2 ++
 docs/components/modules/ROOT/pages/aws-ses-component.adoc          | 2 +-
 .../components/modules/ROOT/pages}/aws2-ses-component.adoc         | 7 +++++--
 docs/components/modules/ROOT/pages/index.adoc                      | 4 +++-
 5 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc b/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
index a26f199..a4cb0c3 100644
--- a/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
+++ b/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
@@ -1,6 +1,8 @@
+[[aws2-ses-component]]
 = AWS 2 Simple Email Service Component
 
-*Since Camel 2.9*
+*Since Camel 3.1*
+
 *Since Camel 3.1*
 
 
@@ -181,4 +183,4 @@ Maven users will need to add the following dependency to their pom.xml.
 where `$\{camel-version\}` must be replaced by the actual version of Camel.
 
 
-include::camel-spring-boot::page$aws-ses-starter.adoc[]
+include::camel-spring-boot::page$aws-ses-starter.adoc[]
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index c9032e5..9ef6a92 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -53,6 +53,8 @@
 * xref:aws2-kms-component.adoc[AWS 2 KMS Component]
 * xref:aws2-mq-component.adoc[AWS 2 MQ Component]
 * xref:aws2-msk-component.adoc[AWS 2 MSK Component]
+* xref:aws-ses-component.adoc[AWS Simple Email Service Component]
+* xref:aws2-ses-component.adoc[AWS 2 Simple Email Service Component]
 * xref:aws2-translate-component.adoc[AWS 2 Translate Component]
 * xref:azure-blob-component.adoc[Azure Storage Blob Service Component]
 * xref:azure-queue-component.adoc[Azure Storage Queue Service Component]
diff --git a/docs/components/modules/ROOT/pages/aws-ses-component.adoc b/docs/components/modules/ROOT/pages/aws-ses-component.adoc
index be43d81..51db80f 100644
--- a/docs/components/modules/ROOT/pages/aws-ses-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws-ses-component.adoc
@@ -1,6 +1,6 @@
 [[aws-ses-component]]
 = AWS Simple Email Service Component
-:page-source: components/camel-aws-ses/src/main/docs/aws-ses-component.adoc
+:page-source: components/camel-aws2-ses/bin/src/main/docs/aws-ses-component.adoc
 
 *Since Camel 2.9*
 
diff --git a/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc b/docs/components/modules/ROOT/pages/aws2-ses-component.adoc
similarity index 97%
copy from components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
copy to docs/components/modules/ROOT/pages/aws2-ses-component.adoc
index a26f199..7860a43 100644
--- a/components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
+++ b/docs/components/modules/ROOT/pages/aws2-ses-component.adoc
@@ -1,6 +1,9 @@
+[[aws2-ses-component]]
 = AWS 2 Simple Email Service Component
+:page-source: components/camel-aws2-ses/src/main/docs/aws2-ses-component.adoc
+
+*Since Camel 3.1*
 
-*Since Camel 2.9*
 *Since Camel 3.1*
 
 
@@ -181,4 +184,4 @@ Maven users will need to add the following dependency to their pom.xml.
 where `$\{camel-version\}` must be replaced by the actual version of Camel.
 
 
-include::camel-spring-boot::page$aws-ses-starter.adoc[]
+include::camel-spring-boot::page$aws-ses-starter.adoc[]
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/pages/index.adoc b/docs/components/modules/ROOT/pages/index.adoc
index 42c0e63..1c27d54 100644
--- a/docs/components/modules/ROOT/pages/index.adoc
+++ b/docs/components/modules/ROOT/pages/index.adoc
@@ -6,7 +6,7 @@ The following Apache Camel artifacts are provided:
 == Components
 
 // components: START
-Number of Components: 325 in 259 JAR artifacts (1 deprecated)
+Number of Components: 326 in 260 JAR artifacts (1 deprecated)
 
 [width="100%",cols="4,1,5",options="header"]
 |===
@@ -66,6 +66,8 @@ Number of Components: 325 in 259 JAR artifacts (1 deprecated)
 
 | xref:aws2-msk-component.adoc[AWS 2 MSK] (camel-aws2-msk) | 3.1 | The aws2-msk is used for managing Amazon MSK
 
+| xref:aws2-ses-component.adoc[AWS 2 Simple Email Service] (camel-aws2-ses) | 3.1 | The aws-ses component is used for sending emails with Amazon's SES service.
+
 | xref:aws2-translate-component.adoc[AWS 2 Translate] (camel-aws2-translate) | 3.1 | The aws2-translate component is used for managing Amazon Translate
 
 | xref:aws-cw-component.adoc[AWS CloudWatch] (camel-aws-cw) | 2.11 | The aws-cw component is used for sending metrics to an Amazon CloudWatch.