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 <anco...@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://exam...@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("t...@example.com"))
+    .setBody(constant("This is my message text."))
+    .to("aws-ses://f...@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://f...@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://f...@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://f...@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx&secretKey=yyy");
+        
+        assertEquals("f...@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://f...@example.com?accessKey=xxx&secretKey=yyy");
+
+        assertEquals("f...@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://f...@example.com?"
+                + "amazonSESClient=#amazonSESClient");
+        
+        assertEquals("f...@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("t...@example.com");
+        to.add("t...@example.com");
+        List<String> replyAddress = new ArrayList<String>();
+        replyAddress.add("reply...@example.com");
+        replyAddress.add("reply...@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://f...@example.com?amazonSESClient=#amazonSESClient&accessKey=xxx"
+            + "&secretKey=yyy&to=#toList&subject=Subject"
+            + "&returnPath=bou...@example.com&replyToAddresses=#replyToList");
+        
+        assertEquals("f...@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("t...@example.com"));
+        
assertTrue(endpoint.getConfiguration().getTo().contains("t...@example.com"));
+        assertEquals("Subject", endpoint.getConfiguration().getSubject());
+        assertEquals("bou...@example.com", 
endpoint.getConfiguration().getReturnPath());
+        assertEquals(2, 
endpoint.getConfiguration().getReplyToAddresses().size());
+        
assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("reply...@example.com"));
+        
assertTrue(endpoint.getConfiguration().getReplyToAddresses().contains("reply...@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://f...@example.com");
+    }
+    
+    @Test(expected = IllegalArgumentException.class)
+    public void createEndpointWithoutAccessKeyConfiguration() throws Exception 
{
+        Ses2Component component = context.getComponent("aws2-ses", 
Ses2Component.class);
+        component.createEndpoint("aws2-ses://f...@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://f...@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://f...@example.com");
+        
+        assertEquals("f...@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://f...@example.com?accessKey=xxxxxx&secretKey=yyyyy&region=US_EAST_1");
+        
+        assertEquals("f...@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://f...@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("f...@example.com", sendEmailRequest.source());
+        assertEquals("bou...@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("f...@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, 
"anotherf...@example.com");
+                exchange.getIn().setHeader(Ses2Constants.TO,
+                        Arrays.asList("another...@example.com", 
"another...@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, 
"anotherbou...@example.com");
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
+                        Arrays.asList("anotherreply...@example.com", 
"anotherreply...@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.SUBJECT, 
"anotherSubject");
+            }
+        });
+        
+        assertEquals("1", 
exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("anotherf...@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("another...@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("another...@example.com"));
+        assertEquals("anotherbou...@example.com", 
sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("anotherreply...@example.com"));
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("anotherreply...@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("t...@example.com", 
"t...@example.com");
+    
+    @BindToRegistry("replyToList")
+    private List<String> replyToList = Arrays.asList("reply...@example.com", 
"reply...@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("f...@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("t...@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("t...@example.com"));
+        assertEquals("bou...@example.com", sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("reply...@example.com"));
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("reply...@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, 
"anotherf...@example.com");
+                exchange.getIn().setHeader(Ses2Constants.TO,
+                        Arrays.asList("another...@example.com", 
"another...@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.RETURN_PATH, 
"anotherbou...@example.com");
+                exchange.getIn().setHeader(Ses2Constants.REPLY_TO_ADDRESSES,
+                        Arrays.asList("anotherreply...@example.com", 
"anotherreply...@example.com"));
+                exchange.getIn().setHeader(Ses2Constants.SUBJECT, 
"anotherSubject");
+            }
+        });
+        
+        assertEquals("1", 
exchange.getIn().getHeader(Ses2Constants.MESSAGE_ID));
+
+        SendEmailRequest sendEmailRequest = sesClient.getSendEmailRequest();
+        assertEquals("anotherf...@example.com", sendEmailRequest.source());
+        assertEquals(2, getTo(sendEmailRequest).size());
+        assertTrue(getTo(sendEmailRequest).contains("another...@example.com"));
+        assertTrue(getTo(sendEmailRequest).contains("another...@example.com"));
+        assertEquals("anotherbou...@example.com", 
sendEmailRequest.returnPath());
+        assertEquals(2, sendEmailRequest.replyToAddresses().size());
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("anotherreply...@example.com"));
+        
assertTrue(sendEmailRequest.replyToAddresses().contains("anotherreply...@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://f...@example.com"
+                        + "?to=#toList"
+                        + "&subject=Subject"
+                        + "&returnPath=bou...@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", "t...@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", "t...@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("t...@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://f...@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://f...@example.com?amazonSESClient=#amazonSESClient&amp;returnPath=bou...@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",

Reply via email to