Skip to content

Commit 81017ab

Browse files
authored
Merge pull request #6 from aboutbits/add-reply-to
add replyTo feature
2 parents 4b3e1da + 58e0d14 commit 81017ab

7 files changed

Lines changed: 78 additions & 12 deletions

File tree

src/main/java/it/aboutbits/springboot/emailservice/lib/EmailDto.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package it.aboutbits.springboot.emailservice.lib;
22

3+
import org.springframework.lang.Nullable;
4+
35
import java.time.OffsetDateTime;
46
import java.util.List;
57
import java.util.Set;
@@ -14,6 +16,11 @@ public record EmailDto(
1416
String fromAddress,
1517
String fromName,
1618

19+
@Nullable
20+
String replyToAddress,
21+
@Nullable
22+
String replyToName,
23+
1724
List<String> recipients,
1825

1926
String textBody,

src/main/java/it/aboutbits/springboot/emailservice/lib/application/EmailParameter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import lombok.Builder;
66
import lombok.NonNull;
77
import lombok.Singular;
8+
import org.springframework.lang.Nullable;
89

910
import java.io.InputStream;
1011
import java.time.OffsetDateTime;
@@ -40,6 +41,11 @@ public record Email(
4041
@NotBlank
4142
String fromName,
4243

44+
@Nullable
45+
String replyToAddress,
46+
@Nullable
47+
String replyToName,
48+
4349
@Singular
4450
@NonNull
4551
Set<Attachment> attachments

src/main/java/it/aboutbits/springboot/emailservice/lib/application/EmailServiceMigrator.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ public EmailServiceMigrator(JdbcTemplate jdbcTemplate) {
1414
void migrate() {
1515
log.info("EmailService: running DB migrations...");
1616

17-
jdbcTemplate.execute("""
17+
jdbcTemplate.execute(
18+
//@formatter:off
19+
"""
1820
1921
create table if not exists email_service_emails
2022
(
@@ -63,7 +65,11 @@ updated_at timestamp with time zone default now() not null,
6365
create index if not exists email_service_email_attachments_email_id_index
6466
on email_service_email_attachments (email_id);
6567
66-
""");
68+
alter table email_service_emails add column if not exists reply_to_address text;
69+
alter table email_service_emails add column if not exists reply_to_name text;
70+
"""
71+
//@formatter:on
72+
);
6773

6874
log.info("EmailService: migrations done!");
6975
}

src/main/java/it/aboutbits/springboot/emailservice/lib/application/ManageEmail.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import lombok.NonNull;
1515
import lombok.extern.slf4j.Slf4j;
1616
import org.springframework.core.io.ByteArrayResource;
17+
import org.springframework.lang.Nullable;
1718
import org.springframework.mail.MailException;
1819
import org.springframework.mail.javamail.JavaMailSender;
1920
import org.springframework.mail.javamail.MimeMessageHelper;
@@ -38,7 +39,8 @@ public ManageEmail(
3839
EmailRepository emailRepository,
3940
JavaMailSender mailSender,
4041
AttachmentDataSource attachmentDataSource,
41-
final EmailMapper emailMapper) {
42+
final EmailMapper emailMapper
43+
) {
4244

4345
this.emailRepository = emailRepository;
4446
this.mailSender = mailSender;
@@ -115,6 +117,8 @@ private Email fromParameter(EmailParameter parameter) throws AttachmentException
115117
email.setRecipients(emailData.recipients());
116118
email.setFromAddress(emailData.fromAddress());
117119
email.setFromName(emailData.fromName());
120+
email.setReplyToAddress(emailData.replyToAddress());
121+
email.setReplyToName(emailData.replyToName());
118122

119123
var attachments = new HashSet<EmailAttachment>();
120124
for (var attachment : parameter.email().attachments()) {
@@ -134,26 +138,49 @@ private Email fromParameter(EmailParameter parameter) throws AttachmentException
134138
return email;
135139
}
136140

137-
private void sendMail(Email notification) throws MessagingException, IOException, AttachmentException {
141+
private void sendMail(Email email) throws MessagingException, IOException, AttachmentException {
138142
sendMail(
139-
notification.getFromAddress(),
140-
notification.getFromName(),
141-
notification.getRecipients(),
142-
notification.getSubject(),
143-
notification.getHtmlBody(),
144-
notification.getTextBody(),
145-
notification.getAttachments()
143+
email.getFromAddress(),
144+
email.getFromName(),
145+
email.getReplyToAddress(),
146+
email.getReplyToName(),
147+
email.getRecipients(),
148+
email.getSubject(),
149+
email.getHtmlBody(),
150+
email.getTextBody(),
151+
email.getAttachments()
146152
);
147153
}
148154

149-
private void sendMail(String fromAddress, String fromName, List<String> recipients, String subject, String htmlBody, String plainTextBody, Set<EmailAttachment> attachments) throws MessagingException, IOException, AttachmentException {
155+
@SuppressWarnings("checkstyle:ParameterNumber")
156+
private void sendMail(
157+
String fromAddress,
158+
String fromName,
159+
@Nullable
160+
String replyToAddress,
161+
@Nullable
162+
String replyToName,
163+
List<String> recipients,
164+
String subject,
165+
String htmlBody,
166+
String plainTextBody,
167+
Set<EmailAttachment> attachments
168+
) throws MessagingException, IOException, AttachmentException {
150169
var message = mailSender.createMimeMessage();
151170
var helper = new MimeMessageHelper(message, true, "UTF-8");
152171

153172
helper.setFrom(fromAddress, fromName);
154173
helper.setTo(recipients.toArray(String[]::new));
155174
helper.setSubject(subject);
156175

176+
if (replyToAddress != null) {
177+
if (replyToName != null) {
178+
helper.setReplyTo(replyToAddress, replyToName);
179+
} else {
180+
helper.setReplyTo(replyToAddress);
181+
}
182+
}
183+
157184
if (!htmlBody.isBlank()) {
158185
helper.setText(plainTextBody, htmlBody);
159186
} else {

src/main/java/it/aboutbits/springboot/emailservice/lib/model/Email.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.annotations.JdbcTypeCode;
2222
import org.hibernate.annotations.UpdateTimestamp;
2323
import org.hibernate.type.SqlTypes;
24+
import org.springframework.lang.Nullable;
2425

2526
import java.time.OffsetDateTime;
2627
import java.util.List;
@@ -57,6 +58,11 @@ public class Email {
5758
private String fromAddress;
5859
private String fromName;
5960

61+
@Nullable
62+
private String replyToAddress;
63+
@Nullable
64+
private String replyToName;
65+
6066
@JdbcTypeCode(SqlTypes.JSON)
6167
private List<String> recipients;
6268

src/test/java/it/aboutbits/springboot/emailservice/lib/application/ManageEmailTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ void givenRequiredParameters_schedule_shouldCreateNewNotification() throws Email
5656
assertThat(result.subject()).isEqualTo(parameter.email().subject());
5757
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
5858
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
59+
assertThat(result.replyToAddress()).isEqualTo(parameter.email().replyToAddress());
60+
assertThat(result.replyToName()).isEqualTo(parameter.email().replyToName());
5961
assertThat(result.recipients()).containsAll(parameter.email().recipients());
6062
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
6163
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
@@ -76,6 +78,8 @@ void givenRequiredParameterWithAttachedFiles_schedule_shouldCreateNewNotificatio
7678
assertThat(result.subject()).isEqualTo(parameter.email().subject());
7779
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
7880
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
81+
assertThat(result.replyToAddress()).isEqualTo(parameter.email().replyToAddress());
82+
assertThat(result.replyToName()).isEqualTo(parameter.email().replyToName());
7983
assertThat(result.recipients()).containsAll(parameter.email().recipients());
8084
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
8185
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
@@ -94,6 +98,8 @@ void givenRequiredParameters_sendOrFail_shouldCreateNewNotification() throws Ema
9498
assertThat(result.subject()).isEqualTo(parameter.email().subject());
9599
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
96100
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
101+
assertThat(result.replyToAddress()).isEqualTo(parameter.email().replyToAddress());
102+
assertThat(result.replyToName()).isEqualTo(parameter.email().replyToName());
97103
assertThat(result.recipients()).containsAll(parameter.email().recipients());
98104
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
99105
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
@@ -115,6 +121,8 @@ void givenRequiredParameterWithAttachedFiles_sendOrFail_shouldCreateNewNotificat
115121
assertThat(result.subject()).isEqualTo(parameter.email().subject());
116122
assertThat(result.fromAddress()).isEqualTo(parameter.email().fromAddress());
117123
assertThat(result.fromName()).isEqualTo(parameter.email().fromName());
124+
assertThat(result.replyToAddress()).isEqualTo(parameter.email().replyToAddress());
125+
assertThat(result.replyToName()).isEqualTo(parameter.email().replyToName());
118126
assertThat(result.recipients()).containsAll(parameter.email().recipients());
119127
assertThat(result.textBody()).isEqualTo(parameter.email().textBody());
120128
assertThat(result.htmlBody()).isEqualTo(parameter.email().htmlBody());
@@ -179,6 +187,8 @@ private static EmailParameter getValidParameterWithoutAttachment() {
179187
.recipient("person2@example.com")
180188
.fromAddress("somebody@aboutbits.it")
181189
.fromName("somebody")
190+
.replyToAddress("somebodyElse@aboutbits.it")
191+
.replyToName("somebodyElse")
182192
.build()
183193
).build();
184194
}
@@ -201,6 +211,8 @@ private static EmailParameter getValidParameterWithAttachment() {
201211
)
202212
.fromAddress("somebody@aboutbits.it")
203213
.fromName("somebody")
214+
.replyToAddress("somebodyElse@aboutbits.it")
215+
.replyToName("somebodyElse")
204216
.build()
205217
).build();
206218
}

src/test/java/it/aboutbits/springboot/emailservice/support/database/factory/EmailFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public static Email.EmailBuilder once() {
2424
.scheduledAt(OffsetDateTime.now())
2525
.fromAddress(FAKER.internet().emailAddress())
2626
.fromName(FAKER.name().fullName())
27+
.replyToAddress(FAKER.internet().emailAddress())
28+
.replyToName(FAKER.name().fullName())
2729
.recipients(List.of(FAKER.internet().emailAddress(), FAKER.internet().emailAddress()));
2830
}
2931
}

0 commit comments

Comments
 (0)