Skip to content

Commit 60cb726

Browse files
committed
feat: support multiple reply-to addresses in EmailEndpoint
1 parent 801010f commit 60cb726

2 files changed

Lines changed: 47 additions & 7 deletions

File tree

src/main/java/co/lettermint/endpoints/EmailEndpoint.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class EmailEndpoint extends Endpoint {
1515
private List<String> to;
1616
private List<String> cc;
1717
private List<String> bcc;
18-
private String replyTo;
18+
private List<String> replyTo;
1919
private String subject;
2020
private String html;
2121
private String text;
@@ -39,7 +39,7 @@ private void reset() {
3939
this.to = new ArrayList<>();
4040
this.cc = new ArrayList<>();
4141
this.bcc = new ArrayList<>();
42-
this.replyTo = null;
42+
this.replyTo = new ArrayList<>();
4343
this.subject = null;
4444
this.html = null;
4545
this.text = null;
@@ -85,10 +85,10 @@ public EmailEndpoint bcc(String... emails) {
8585
}
8686

8787
/**
88-
* Set the reply-to email address.
88+
* Set reply-to email addresses. Replaces any existing reply-to addresses.
8989
*/
90-
public EmailEndpoint replyTo(String replyTo) {
91-
this.replyTo = replyTo;
90+
public EmailEndpoint replyTo(String... emails) {
91+
this.replyTo = new ArrayList<>(Arrays.asList(emails));
9292
return this;
9393
}
9494

@@ -233,7 +233,7 @@ private Map<String, Object> buildPayload() {
233233
payload.put("bcc", bcc);
234234
}
235235

236-
if (replyTo != null) {
236+
if (!replyTo.isEmpty()) {
237237
payload.put("reply_to", replyTo);
238238
}
239239

src/test/java/co/lettermint/EmailEndpointTest.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ void testEmailWithAllOptions() throws Exception {
9797
assertTrue(body.contains("\"to\":[\"recipient1@example.com\",\"recipient2@example.com\"]"));
9898
assertTrue(body.contains("\"cc\":[\"cc@example.com\"]"));
9999
assertTrue(body.contains("\"bcc\":[\"bcc@example.com\"]"));
100-
assertTrue(body.contains("\"reply_to\":\"reply@example.com\""));
100+
assertTrue(body.contains("\"reply_to\":[\"reply@example.com\"]"));
101101
assertTrue(body.contains("\"subject\":\"Welcome!\""));
102102
assertTrue(body.contains("\"html\":\"<p>Hello <b>World</b></p>\""));
103103
assertTrue(body.contains("\"text\":\"Hello World\""));
@@ -179,6 +179,46 @@ void testSingleHeaderMethod() throws Exception {
179179
assertTrue(body.contains("\"X-Second\":\"value2\""));
180180
}
181181

182+
@Test
183+
void testReplyToSingleString() throws Exception {
184+
mockWebServer.enqueue(new MockResponse()
185+
.setBody("{\"message_id\": \"msg_123\", \"status\": \"queued\"}")
186+
.setHeader("Content-Type", "application/json"));
187+
188+
lettermint.email()
189+
.from("sender@example.com")
190+
.to("recipient@example.com")
191+
.subject("Test")
192+
.text("Test")
193+
.replyTo("reply@example.com")
194+
.send();
195+
196+
RecordedRequest request = mockWebServer.takeRequest();
197+
String body = request.getBody().readUtf8();
198+
199+
assertTrue(body.contains("\"reply_to\":[\"reply@example.com\"]"));
200+
}
201+
202+
@Test
203+
void testReplyToMultipleAddresses() throws Exception {
204+
mockWebServer.enqueue(new MockResponse()
205+
.setBody("{\"message_id\": \"msg_123\", \"status\": \"queued\"}")
206+
.setHeader("Content-Type", "application/json"));
207+
208+
lettermint.email()
209+
.from("sender@example.com")
210+
.to("recipient@example.com")
211+
.subject("Test")
212+
.text("Test")
213+
.replyTo("reply1@example.com", "reply2@example.com")
214+
.send();
215+
216+
RecordedRequest request = mockWebServer.takeRequest();
217+
String body = request.getBody().readUtf8();
218+
219+
assertTrue(body.contains("\"reply_to\":[\"reply1@example.com\",\"reply2@example.com\"]"));
220+
}
221+
182222
@Test
183223
void testSingleMetadataMethod() throws Exception {
184224
mockWebServer.enqueue(new MockResponse()

0 commit comments

Comments
 (0)