From 33ccafc41550286bb3638b3f6c8fe441de411604 Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Mon, 10 Jun 2024 14:50:25 +0530 Subject: [PATCH 1/7] [PHEE-296A] Email api --- build.gradle | 3 + .../sms/api/EmailApiResource.java | 35 ++++++++ .../sms/data/EmailRequestDTO.java | 42 ++++++++++ .../sms/service/EmailService.java | 80 +++++++++++++++++++ src/main/resources/application.yml | 12 +++ 5 files changed, 172 insertions(+) create mode 100644 src/main/java/org/fineract/messagegateway/sms/api/EmailApiResource.java create mode 100644 src/main/java/org/fineract/messagegateway/sms/data/EmailRequestDTO.java create mode 100644 src/main/java/org/fineract/messagegateway/sms/service/EmailService.java diff --git a/build.gradle b/build.gradle index cd34738d..c4f4cdff 100644 --- a/build.gradle +++ b/build.gradle @@ -54,6 +54,9 @@ ext { dependencies { implementation("org.springframework.boot:spring-boot-starter-web:2.5.5") implementation("org.springframework.boot:spring-boot-starter-actuator:$springBootVersion") + implementation ("org.springframework.boot:spring-boot-starter-validation:$springBootVersion") + implementation 'org.springframework.boot:spring-boot-starter-mail' + testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation("org.springframework.boot:spring-boot-starter-data-jpa:2.5.2") implementation("org.flywaydb:flyway-core:6.4.0") implementation('org.apache.velocity:velocity:1.7') diff --git a/src/main/java/org/fineract/messagegateway/sms/api/EmailApiResource.java b/src/main/java/org/fineract/messagegateway/sms/api/EmailApiResource.java new file mode 100644 index 00000000..a77aa687 --- /dev/null +++ b/src/main/java/org/fineract/messagegateway/sms/api/EmailApiResource.java @@ -0,0 +1,35 @@ +package org.fineract.messagegateway.sms.api; + +import org.fineract.messagegateway.sms.data.EmailRequestDTO; +import org.fineract.messagegateway.sms.service.EmailService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/emails") +public class EmailApiResource { + + @Autowired + EmailService emailService; + + @PostMapping + public ResponseEntity sendEmail( + @RequestHeader("Platform-Tenant-Id") String platformTenantId, + @RequestHeader(value = "X-CallbackUrl", required = false) String callbackUrl, + @RequestHeader(value = "X-Correlation-Id", required = false) String correlationId, + @Valid @RequestBody EmailRequestDTO emailRequest + ) { + if (platformTenantId == null || platformTenantId.isEmpty()) { + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Platform-Tenant-Id header is missing"); + } + + emailService.sendEmail(emailRequest,callbackUrl); + + return ResponseEntity.status(HttpStatus.ACCEPTED).body("Email accepted to be sent"); + } +} + diff --git a/src/main/java/org/fineract/messagegateway/sms/data/EmailRequestDTO.java b/src/main/java/org/fineract/messagegateway/sms/data/EmailRequestDTO.java new file mode 100644 index 00000000..b28ad6ef --- /dev/null +++ b/src/main/java/org/fineract/messagegateway/sms/data/EmailRequestDTO.java @@ -0,0 +1,42 @@ +package org.fineract.messagegateway.sms.data; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; +public class EmailRequestDTO { + @NotEmpty + private List< String> to; + + @NotEmpty + private String subject; + + @NotEmpty + private String body; + + // Getters and setters + + public List getTo() { + return to; + } + + public void setTo(List to) { + this.to = to; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } +} diff --git a/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java new file mode 100644 index 00000000..d4e1da2f --- /dev/null +++ b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java @@ -0,0 +1,80 @@ +package org.fineract.messagegateway.sms.service; + +import org.fineract.messagegateway.MessageGateway; +import org.fineract.messagegateway.sms.data.EmailRequestDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.client.RestTemplate; + + +@Service +public class EmailService { + + private static final Logger logger = LoggerFactory.getLogger(EmailService.class); + @Autowired + private JavaMailSender mailSender; + + @Value("${spring.mail.host}") + private String smtpHost; + + @Value("${spring.mail.port}") + private int smtpPort; + + @Value("${spring.mail.username}") + private String smtpUsername; + + @Value("${spring.mail.password}") + private String smtpPassword; + + + + + public void sendEmail(EmailRequestDTO emailRequest, String callbackUrl) { + boolean flag = false; + String error = null; + try{ + ((JavaMailSenderImpl) mailSender).setHost(smtpHost); + ((JavaMailSenderImpl) mailSender).setPort(smtpPort); + ((JavaMailSenderImpl) mailSender).setUsername(smtpUsername); + ((JavaMailSenderImpl) mailSender).setPassword(smtpPassword); + + SimpleMailMessage message = new SimpleMailMessage(); + message.setTo(emailRequest.getTo().toArray(new String[0])); + message.setSubject(emailRequest.getSubject()); + message.setText(emailRequest.getBody()); + mailSender.send(message); + flag = true; + + } catch (Exception e) { + error = e.getMessage(); + } + RestTemplate restTemplate = new RestTemplate(); + + if(flag) + { + String requestBody = "Email sent successfully to {to}"; + restTemplate.postForObject(callbackUrl, requestBody.replace("{to}", + emailRequest.getTo().toString()), String.class); + logger.info("Email sent to: " + emailRequest.getTo()); + } + else { + String requestBody = "Email could not be sent to {to} because of {error} "; + requestBody = requestBody.replace("{error}",error); + restTemplate.postForObject(callbackUrl, requestBody.replace("{to}", + emailRequest.getTo().toString()), String.class); + logger.info("Email sent to: " + emailRequest.getTo()); + + } + + + } + + + + } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d88f1798..1155dccb 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -22,6 +22,18 @@ spring: password: ${MYSQL_PASSWORD:password} driver-class-name: org.drizzle.jdbc.DrizzleDriver + mail: + host: localhost + port: 3025 + username: greenmail + password: greenmail + properties: + mail: + smtp: + auth: false + starttls: + enable: false + # Status Callback configuration for Twilio. Port will be taken from server configuration hostconfig: host: localhost From 9ab62656551af380c5a0139da446dfcea979ddf7 Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Mon, 10 Jun 2024 16:04:36 +0530 Subject: [PATCH 2/7] [PHEE-296A] Email api --- .../org/fineract/messagegateway/sms/service/EmailService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java index d4e1da2f..80045690 100644 --- a/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java +++ b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java @@ -68,7 +68,7 @@ public void sendEmail(EmailRequestDTO emailRequest, String callbackUrl) { requestBody = requestBody.replace("{error}",error); restTemplate.postForObject(callbackUrl, requestBody.replace("{to}", emailRequest.getTo().toString()), String.class); - logger.info("Email sent to: " + emailRequest.getTo()); + logger.info("Email failed to be sent because {}", error); } From e8295f29233e51595f8add7522c9490e0fcbb24b Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Mon, 10 Jun 2024 16:12:10 +0530 Subject: [PATCH 3/7] [PHEE-296A] Email api --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1155dccb..e0726a31 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,7 +23,7 @@ spring: driver-class-name: org.drizzle.jdbc.DrizzleDriver mail: - host: localhost + host: 0.0.0.0 port: 3025 username: greenmail password: greenmail From 066385fcc901d46177286c381d7810648f7242ee Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Mon, 10 Jun 2024 16:23:45 +0530 Subject: [PATCH 4/7] [PHEE-296A] Email api --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e0726a31..22e2aac7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,7 +23,7 @@ spring: driver-class-name: org.drizzle.jdbc.DrizzleDriver mail: - host: 0.0.0.0 + host: smtp.greenmail port: 3025 username: greenmail password: greenmail From e1b8aa403027530aca63518e11d14755d41457d3 Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Wed, 12 Jun 2024 10:45:13 +0530 Subject: [PATCH 5/7] [PHEE-296A] Email api --- src/main/resources/application.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 22e2aac7..d5a1fd61 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,7 +23,7 @@ spring: driver-class-name: org.drizzle.jdbc.DrizzleDriver mail: - host: smtp.greenmail + host: ${MY_POD_IP:localhost} port: 3025 username: greenmail password: greenmail @@ -103,4 +103,5 @@ zeebe: contactpoint: "zeebe-zeebe-gateway:26500" worker: timer: "PT15S" - retries: 3 \ No newline at end of file + retries: 3 + From 4e5f5076118a46b7ecc4b2eb25c63b3fe93975ee Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Tue, 18 Jun 2024 11:50:27 +0530 Subject: [PATCH 6/7] [PHEE-296A] Email api --- .../sms/service/EmailService.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java index 80045690..c1ee7c2b 100644 --- a/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java +++ b/src/main/java/org/fineract/messagegateway/sms/service/EmailService.java @@ -5,6 +5,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -12,6 +14,8 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.web.client.RestTemplate; +import java.util.Properties; + @Service public class EmailService { @@ -43,6 +47,11 @@ public void sendEmail(EmailRequestDTO emailRequest, String callbackUrl) { ((JavaMailSenderImpl) mailSender).setPort(smtpPort); ((JavaMailSenderImpl) mailSender).setUsername(smtpUsername); ((JavaMailSenderImpl) mailSender).setPassword(smtpPassword); + Properties mailProperties = ((JavaMailSenderImpl) mailSender).getJavaMailProperties(); + mailProperties.put("mail.smtp.connectiontimeout", 5000); + mailProperties.put("mail.smtp.timeout", 5000); + mailProperties.put("mail.smtp.writetimeout", 5000); + ((JavaMailSenderImpl) mailSender).setJavaMailProperties(mailProperties); SimpleMailMessage message = new SimpleMailMessage(); message.setTo(emailRequest.getTo().toArray(new String[0])); @@ -73,8 +82,14 @@ public void sendEmail(EmailRequestDTO emailRequest, String callbackUrl) { } - } + } + private ClientHttpRequestFactory createTimeoutRequestFactory() { + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(5000); + factory.setReadTimeout(5000); + return factory; + } } From dd0b1a8c56a4b6e3b84b96c2a4edf82f41a0ffee Mon Sep 17 00:00:00 2001 From: Ankita Ranjan Date: Fri, 21 Jun 2024 17:09:24 +0530 Subject: [PATCH 7/7] [PHEE-296A] Email api --- src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d5a1fd61..29bfbf6a 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -23,7 +23,7 @@ spring: driver-class-name: org.drizzle.jdbc.DrizzleDriver mail: - host: ${MY_POD_IP:localhost} + host: ${EMAIL_URL:localhost} port: 3025 username: greenmail password: greenmail