Skip to content

Commit 013bf74

Browse files
authored
Merge pull request #4 from railsware/feature/send-improvements
Add the possibility to call send() directly from MailtrapClinet
2 parents 11014ad + 8758aad commit 013bf74

16 files changed

+398
-74
lines changed

README.md

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ Gradle Kotlin DSL dependency
3737
implementation("io.mailtrap:mailtrap-java:1.0-SNAPSHOT")
3838
```
3939

40-
### Minimal
40+
### Usage
4141

4242
```java
4343
import io.mailtrap.client.MailtrapClient;
@@ -51,15 +51,11 @@ import java.util.List;
5151
import java.util.Map;
5252

5353
public class MailtrapJavaSDKTest {
54-
54+
5555
public static void main(String[] args) {
56-
Address from = Address.builder()
57-
58-
.build();
56+
Address from = new Address("[email protected]", "John Doe");
5957

60-
Address to = Address.builder()
61-
62-
.build();
58+
Address to = new Address("[email protected]");
6359

6460
Attachment attachment = Attachment.builder()
6561
.filename("attachment.txt")
@@ -79,21 +75,39 @@ public class MailtrapJavaSDKTest {
7975
.attachments(List.of(attachment))
8076
.build();
8177

82-
MailtrapClient mailtrapClient = MailtrapClientFactory
83-
.createMailtrapClient(MailtrapConfig.builder()
78+
MailtrapClient mailtrapClient = MailtrapClientFactory.createMailtrapClient(
79+
new MailtrapConfig.Builder()
8480
.token("<YOUR_MAILTRAP_TOKEN>")
8581
.build());
82+
8683
try {
87-
System.out.println(mailtrapClient.getSendingApi().emails().send(mailtrapMail));
84+
System.out.println(mailtrapClient.send(mailtrapMail));
8885
} catch (Exception e) {
8986
System.out.println("Caught exception : " + e);
9087
}
9188

92-
// OR send email to the Mailtrap SANDBOX
89+
// OR send email to the Mailtrap Sandbox
9390

9491
try {
9592
int inboxId = 1000001;
96-
System.out.println(mailtrapClient.getTestingApi().emails().send(mailtrapMail, inboxId));
93+
94+
// Either instantiate a new client
95+
MailtrapClient sandboxClient = MailtrapClientFactory.createMailtrapClient(
96+
new MailtrapConfig.Builder()
97+
.sandbox(true)
98+
.inboxId(inboxId)
99+
.token("<YOUR_MAILTRAP_TOKEN>")
100+
.build());
101+
102+
System.out.println(sandboxClient.send(mailtrapMail));
103+
104+
// Or reuse already created client
105+
mailtrapClient.switchToEmailTestingApi(inboxId);
106+
107+
System.out.println(mailtrapClient.send(mailtrapMail));
108+
109+
// Or use directly Testing API to send email to Sandbox
110+
System.out.println(mailtrapClient.testingApi().emails().send(mailtrapMail, inboxId));
97111
} catch (Exception e) {
98112
System.out.println("Caught exception : " + e);
99113
}

src/main/java/io/mailtrap/api/abstractions/EmailTestingApi.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public interface EmailTestingApi {
1313
/**
1414
* Sends an email
1515
*
16-
* @param mail The email message to be sent.
16+
* @param mail The email message to be sent.
17+
* @param inboxId ID of the testing inbox, where to send an email.
1718
* @return A response indicating the result of the send operation.
1819
* <p>
1920
* @throws HttpException If there is an HTTP-related error during the send operation.

src/main/java/io/mailtrap/client/MailtrapClient.java

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,89 @@
33
import io.mailtrap.client.layers.MailtrapBulkEmailSendingApiLayer;
44
import io.mailtrap.client.layers.MailtrapEmailSendingApiLayer;
55
import io.mailtrap.client.layers.MailtrapEmailTestingApiLayer;
6+
import io.mailtrap.config.MailtrapConfig;
7+
import io.mailtrap.model.request.MailtrapMail;
8+
import io.mailtrap.model.response.SendResponse;
9+
import io.mailtrap.util.SendingContextHolder;
610
import lombok.Getter;
711
import lombok.RequiredArgsConstructor;
12+
import lombok.experimental.Accessors;
813

914
/**
1015
* Client for interacting with Mailtrap APIs.
16+
* Emails might be sent using different dedicated APIs OR based on the configuration
17+
* provided by the {@link SendingContextHolder} and {@link MailtrapConfig} and {@link #send(MailtrapMail)}
1118
*/
12-
@Getter
19+
@Accessors(fluent = true)
1320
@RequiredArgsConstructor
1421
public class MailtrapClient {
1522

1623
/**
1724
* API for Mailtrap.io Sending functionality
1825
*/
26+
@Getter
1927
private final MailtrapEmailSendingApiLayer sendingApi;
2028

2129
/**
2230
* API for Mailtrap.io Testing functionality
2331
*/
32+
@Getter
2433
private final MailtrapEmailTestingApiLayer testingApi;
2534

2635
/**
2736
* API for Mailtrap.io Bulk Sending functionality
2837
*/
38+
@Getter
2939
private final MailtrapBulkEmailSendingApiLayer bulkSendingApi;
40+
41+
/**
42+
* Utility class which holds sending context (which API to use: Email Sending API, Bulk Sending API or
43+
* Email Testing API, inbox id for Email Testing API) to make it possible to perform send directly from MailtrapClient
44+
*/
45+
private final SendingContextHolder sendingContextHolder;
46+
47+
/**
48+
* Sends an email based on the specified sending configuration.
49+
*
50+
* @param mailtrapMail the email to send
51+
* @return the response from the sending operation
52+
*/
53+
public SendResponse send(MailtrapMail mailtrapMail) {
54+
if (sendingContextHolder.isBulk()) {
55+
return bulkSendingApi.emails().send(mailtrapMail);
56+
} else if (sendingContextHolder.isSandbox()) {
57+
return testingApi.emails().send(mailtrapMail, sendingContextHolder.getInboxId());
58+
} else {
59+
return sendingApi.emails().send(mailtrapMail);
60+
}
61+
}
62+
63+
/**
64+
* Configures `send` method to use Bulk Sending API
65+
*/
66+
public void switchToBulkSendingApi() {
67+
this.sendingContextHolder.setBulk(true);
68+
this.sendingContextHolder.setInboxId(null);
69+
this.sendingContextHolder.setSandbox(false);
70+
}
71+
72+
/**
73+
* Configures `send` method to use Email Testing API
74+
*
75+
* @param inboxId the inbox ID to use for testing
76+
*/
77+
public void switchToEmailTestingApi(Integer inboxId) {
78+
this.sendingContextHolder.setInboxId(inboxId);
79+
this.sendingContextHolder.setSandbox(true);
80+
this.sendingContextHolder.setBulk(false);
81+
}
82+
83+
/**
84+
* Configures `send` method to use Email Sending API.
85+
*/
86+
public void switchToEmailSendingApi() {
87+
this.sendingContextHolder.setInboxId(null);
88+
this.sendingContextHolder.setSandbox(false);
89+
this.sendingContextHolder.setBulk(false);
90+
}
3091
}

src/main/java/io/mailtrap/config/MailtrapConfig.java

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package io.mailtrap.config;
22

3+
import io.mailtrap.exception.BaseMailtrapException;
34
import io.mailtrap.http.CustomHttpClient;
4-
import lombok.Builder;
55
import lombok.Getter;
66

77
import java.time.Duration;
8+
import java.util.Objects;
89

910
/**
1011
* Configuration class for Mailtrap SDK.
1112
*/
1213
@Getter
13-
@Builder
1414
public class MailtrapConfig {
1515

1616
/**
@@ -28,4 +28,77 @@ public class MailtrapConfig {
2828
*/
2929
private final CustomHttpClient httpClient;
3030

31+
/**
32+
* Indicates whether to use Email Testing API
33+
*/
34+
private final boolean sandbox;
35+
36+
/**
37+
* Indicates whether to use Bulk Sending API
38+
*/
39+
private final boolean bulk;
40+
41+
/**
42+
* Inbox ID. Should be used alongside with {@link #sandbox}, as Email Testing API requires inbox ID
43+
*/
44+
private final Integer inboxId;
45+
46+
private MailtrapConfig(Builder builder) {
47+
if (builder.sandbox && builder.bulk) {
48+
throw new BaseMailtrapException("Bulk mode is not applicable for Testing API");
49+
}
50+
if (builder.sandbox && Objects.isNull(builder.inboxId)) {
51+
throw new BaseMailtrapException("Testing API requires inbox ID");
52+
}
53+
54+
this.connectionTimeout = builder.connectionTimeout;
55+
this.token = builder.token;
56+
this.httpClient = builder.httpClient;
57+
this.sandbox = builder.sandbox;
58+
this.bulk = builder.bulk;
59+
this.inboxId = builder.inboxId;
60+
}
61+
62+
public static class Builder {
63+
private Duration connectionTimeout;
64+
private String token;
65+
private CustomHttpClient httpClient;
66+
private boolean sandbox;
67+
private boolean bulk;
68+
private Integer inboxId;
69+
70+
public Builder connectionTimeout(Duration connectionTimeout) {
71+
this.connectionTimeout = connectionTimeout;
72+
return this;
73+
}
74+
75+
public Builder token(String token) {
76+
this.token = token;
77+
return this;
78+
}
79+
80+
public Builder httpClient(CustomHttpClient httpClient) {
81+
this.httpClient = httpClient;
82+
return this;
83+
}
84+
85+
public Builder sandbox(boolean sandbox) {
86+
this.sandbox = sandbox;
87+
return this;
88+
}
89+
90+
public Builder bulk(boolean bulk) {
91+
this.bulk = bulk;
92+
return this;
93+
}
94+
95+
public Builder inboxId(Integer inboxId) {
96+
this.inboxId = inboxId;
97+
return this;
98+
}
99+
100+
public MailtrapConfig build() {
101+
return new MailtrapConfig(this);
102+
}
103+
}
31104
}

src/main/java/io/mailtrap/factory/MailtrapClientFactory.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
import io.mailtrap.CustomValidator;
44
import io.mailtrap.api.BulkSendingApiImpl;
5-
import io.mailtrap.api.EmailTestingApiImpl;
65
import io.mailtrap.api.EmailSendingApiImpl;
6+
import io.mailtrap.api.EmailTestingApiImpl;
77
import io.mailtrap.client.MailtrapClient;
88
import io.mailtrap.client.layers.MailtrapBulkEmailSendingApiLayer;
99
import io.mailtrap.client.layers.MailtrapEmailSendingApiLayer;
1010
import io.mailtrap.client.layers.MailtrapEmailTestingApiLayer;
1111
import io.mailtrap.config.MailtrapConfig;
12+
import io.mailtrap.util.SendingContextHolder;
1213
import jakarta.validation.Validation;
1314
import jakarta.validation.ValidatorFactory;
1415

@@ -33,7 +34,18 @@ public static MailtrapClient createMailtrapClient(MailtrapConfig config) {
3334
var testingApi = createTestingApi(config, customValidator);
3435
var bulkSendingApi = createBulkSendingApi(config, customValidator);
3536

36-
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi);
37+
var sendingContextHolder = configureSendingContext(config);
38+
39+
return new MailtrapClient(sendingApi, testingApi, bulkSendingApi, sendingContextHolder);
40+
}
41+
42+
private static SendingContextHolder configureSendingContext(MailtrapConfig config) {
43+
44+
return SendingContextHolder.builder()
45+
.sandbox(config.isSandbox())
46+
.inboxId(config.getInboxId())
47+
.bulk(config.isBulk())
48+
.build();
3749
}
3850

3951
private static MailtrapEmailSendingApiLayer createSendingApi(MailtrapConfig config, CustomValidator customValidator) {

src/main/java/io/mailtrap/http/impl/DefaultMailtrapHttpClient.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ private HttpRequest.Builder prebuildRequest(String url, RequestData requestData)
119119
.uri(URI.create(this.appendUrlParams(url, requestData.getQueryParams())))
120120
.header("Accept", "application/json")
121121
.header("Content-Type", "application/json; charset=UTF-8")
122-
.header("Authorization", "Bearer " + token);
122+
.header("Authorization", "Bearer " + token)
123+
.header("User-Agent", "mailtrap-java (https://github.com/railsware/mailtrap-java)");
123124

124125
Map<String, Object> headers = new HashMap<>(requestData.getHeaders());
125126
for (Map.Entry<String, ?> entry : headers.entrySet()) {

src/main/java/io/mailtrap/model/request/Address.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,20 @@
1010
* Represents an email address.
1111
*/
1212
@Getter
13-
@Builder
1413
public class Address extends AbstractModel {
1514

1615
private String name;
1716

1817
@Email
1918
@NotEmpty
20-
private String email;
19+
private final String email;
2120

21+
public Address(String email) {
22+
this.email = email;
23+
}
24+
25+
public Address(String email, String name) {
26+
this.email = email;
27+
this.name = name;
28+
}
2229
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package io.mailtrap.util;
2+
3+
import io.mailtrap.client.MailtrapClient;
4+
import lombok.Builder;
5+
import lombok.Getter;
6+
import lombok.Setter;
7+
8+
/**
9+
* Utility class which holds sending context (which API to use: Email Sending API, Bulk Sending API or
10+
* Email Testing API, inbox id for Email Testing API) to make it possible to perform send directly from {@link MailtrapClient}
11+
*/
12+
@Getter
13+
@Builder
14+
@Setter
15+
public class SendingContextHolder {
16+
private boolean sandbox;
17+
private Integer inboxId;
18+
private boolean bulk;
19+
}

0 commit comments

Comments
 (0)