diff --git a/api-key-module/pom.xml b/api-key-module/pom.xml index d1b36ef..2013e10 100644 --- a/api-key-module/pom.xml +++ b/api-key-module/pom.xml @@ -53,5 +53,10 @@ 1.0.0.Final provided + + com.amazonaws + aws-java-sdk-ses + 1.11.538 + \ No newline at end of file diff --git a/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProvider.java b/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProvider.java new file mode 100644 index 0000000..0939afc --- /dev/null +++ b/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProvider.java @@ -0,0 +1,47 @@ +package com.gwidgets.providers; + +import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; +import com.amazonaws.services.simpleemail.model.Body; +import com.amazonaws.services.simpleemail.model.Content; +import com.amazonaws.services.simpleemail.model.Destination; +import com.amazonaws.services.simpleemail.model.Message; +import com.amazonaws.services.simpleemail.model.SendEmailRequest; +import java.util.Map; +import org.jboss.logging.Logger; +import org.keycloak.email.EmailSenderProvider; +import org.keycloak.models.UserModel; + +public class SESEmailSenderProvider implements EmailSenderProvider { + + private static final Logger log = Logger.getLogger("org.keycloak.events"); + + private final AmazonSimpleEmailService sesClient; + + public SESEmailSenderProvider( + AmazonSimpleEmailService sesClient) { + this.sesClient = sesClient; + } + + @Override + public void send(Map config, UserModel user, String subject, String textBody, + String htmlBody) { + + log.info("attempting to send email using aws ses for " + user.getEmail()); + + Message message = new Message().withSubject(new Content().withData(subject)) + .withBody(new Body().withHtml(new Content().withData(htmlBody)) + .withText(new Content().withData(textBody).withCharset("UTF-8"))); + + SendEmailRequest sendEmailRequest = new SendEmailRequest() + .withSource("example<" + config.get("from") + ">") + .withMessage(message).withDestination(new Destination().withToAddresses(user.getEmail())); + + sesClient.sendEmail(sendEmailRequest); + log.info("email sent to " + user.getEmail() + " successfully"); + } + + @Override + public void close() { + + } +} diff --git a/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProviderFactory.java b/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProviderFactory.java new file mode 100644 index 0000000..8010efa --- /dev/null +++ b/api-key-module/src/main/java/com/gwidgets/providers/SESEmailSenderProviderFactory.java @@ -0,0 +1,50 @@ +package com.gwidgets.providers; + +import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; +import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; +import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; +import java.util.Objects; +import org.keycloak.Config.Scope; +import org.keycloak.email.EmailSenderProvider; +import org.keycloak.email.EmailSenderProviderFactory; +import org.keycloak.models.KeycloakSession; +import org.keycloak.models.KeycloakSessionFactory; + +public class SESEmailSenderProviderFactory implements EmailSenderProviderFactory { + + private static AmazonSimpleEmailService sesClientInstance; + + @Override + public EmailSenderProvider create(KeycloakSession session) { + + //using singleton pattern to avoid creating the client each time create is called + if (sesClientInstance == null) { + String awsRegion = Objects.requireNonNull(System.getenv("AWS_REGION")); + + sesClientInstance = + AmazonSimpleEmailServiceClientBuilder + .standard().withCredentials(new EnvironmentVariableCredentialsProvider()) + .withRegion(awsRegion) + .build(); + } + + return new SESEmailSenderProvider(sesClientInstance); + } + + @Override + public void init(Scope config) { + + } + + @Override + public void postInit(KeycloakSessionFactory factory) { } + + @Override + public void close() { + } + + @Override + public String getId() { + return "default"; + } +} diff --git a/api-key-module/src/main/resources/META-INF/services/org.keycloak.email.EmailSenderProviderFactory b/api-key-module/src/main/resources/META-INF/services/org.keycloak.email.EmailSenderProviderFactory new file mode 100644 index 0000000..05e5060 --- /dev/null +++ b/api-key-module/src/main/resources/META-INF/services/org.keycloak.email.EmailSenderProviderFactory @@ -0,0 +1 @@ +com.gwidgets.providers.SESEmailSenderProviderFactory \ No newline at end of file