diff --git a/README.md b/README.md
index a26fd8a..533022b 100644
--- a/README.md
+++ b/README.md
@@ -104,6 +104,16 @@ MailerSend Java SDK
- [Delete an SMS webhook](#delete-an-sms-webhook)
- [SMS](#sms)
- [Send an SMS with personalization](#send-an-sms-with-personalization)
+ - [DMARC Monitoring](#dmarc-monitoring)
+ - [Get a list of monitors](#get-a-list-of-monitors)
+ - [Create a monitor](#create-a-monitor)
+ - [Update a monitor](#update-a-monitor)
+ - [Delete a monitor](#delete-a-monitor)
+ - [Get aggregated reports](#get-aggregated-reports)
+ - [Get IP-specific reports](#get-ip-specific-reports)
+ - [Get report sources](#get-report-sources)
+ - [Mark IP as favorite](#mark-ip-as-favorite)
+ - [Remove IP from favorites](#remove-ip-from-favorites)
- [Testing](#testing)
- [Support and Feedback](#support-and-feedback)
@@ -118,12 +128,12 @@ Using Maven:
com.mailersend
java-sdk
- 1.4.1
+ 1.5.0
Using Gradle:
- implementation 'com.mailersend:java-sdk:1.4.1'
+ implementation 'com.mailersend:java-sdk:1.5.0'
# Usage
@@ -2740,13 +2750,265 @@ public void sendSms() {
}
```
+## DMARC Monitoring
+
+### Get a list of monitors
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitor;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitorsList;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void listMonitors() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcMonitorsList list = ms.dmarcMonitoring().getMonitors();
+
+ for (DmarcMonitor monitor : list.monitors) {
+ System.out.println(monitor.id);
+ System.out.println(monitor.dmarcRecord);
+ System.out.println(monitor.spfStatus);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Create a monitor
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitor;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void createMonitor() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcMonitor monitor = ms.dmarcMonitoring().createMonitorBuilder()
+ .createMonitor("your-domain-id");
+
+ System.out.println(monitor.id);
+ System.out.println(monitor.wantedDmarcRecord);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Update a monitor
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitor;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void updateMonitor() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcMonitor monitor = ms.dmarcMonitoring().updateMonitorBuilder()
+ .wantedDmarcRecord("v=DMARC1; p=reject; rua=mailto:dmarc@yourdomain.com;")
+ .updateMonitor("your-monitor-id");
+
+ System.out.println(monitor.id);
+ System.out.println(monitor.wantedDmarcRecord);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Delete a monitor
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void deleteMonitor() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ boolean deleted = ms.dmarcMonitoring().deleteMonitor("your-monitor-id");
+
+ System.out.println("Monitor deleted: " + deleted);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Get aggregated reports
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcAggregatedReport;
+import com.mailersend.sdk.dmarcmonitoring.DmarcAggregatedReportList;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void getAggregatedReport() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcAggregatedReportList list = ms.dmarcMonitoring().getAggregatedReport("your-monitor-id");
+
+ for (DmarcAggregatedReport report : list.reports) {
+ System.out.println(report.ipAddress);
+ System.out.println(report.totalVolume);
+ System.out.println(report.passedDmarc);
+ System.out.println(report.isFavorite);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Get IP-specific reports
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcIpReport;
+import com.mailersend.sdk.dmarcmonitoring.DmarcIpReportList;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void getIpReport() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcIpReportList list = ms.dmarcMonitoring().getIpReport("your-monitor-id", "1.2.3.4");
+
+ for (DmarcIpReport report : list.reports) {
+ System.out.println(report.ipAddress);
+ System.out.println(report.totalVolume);
+ System.out.println(report.appliedPolicy);
+ System.out.println(report.reportSource);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Get report sources
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcReportSource;
+import com.mailersend.sdk.dmarcmonitoring.DmarcReportSourcesList;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void getReportSources() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ DmarcReportSourcesList list = ms.dmarcMonitoring().getReportSources("your-monitor-id");
+
+ for (DmarcReportSource source : list.sources) {
+ System.out.println(source.reportSource);
+ System.out.println(source.reports);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Mark IP as favorite
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void markIpAsFavorite() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ boolean marked = ms.dmarcMonitoring().markIpAsFavorite("your-monitor-id", "1.2.3.4");
+
+ System.out.println("IP marked as favorite: " + marked);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
+### Remove IP from favorites
+
+```java
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+public void removeIpFromFavorites() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken("Your API token");
+
+ try {
+
+ boolean removed = ms.dmarcMonitoring().removeIpFromFavorites("your-monitor-id", "1.2.3.4");
+
+ System.out.println("IP removed from favorites: " + removed);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ }
+}
+```
+
# Testing
-Change the properties in the `TestHelper` class of the `com.mailersend.sdk.tests` package to correspond to your account details, then simply run
+To run the tests you need **Java 11+** and **Maven 3.6+** installed.
+
+The test suite uses VCR (video cassette recorder) fixtures — pre-recorded HTTP responses stored in `src/test/resources/fixtures/` — so no live API token is required for the existing tests.
+
+To run all tests:
```
mvn test
```
+To run only the DMARC Monitoring tests:
+```
+mvn test -Dtest=DmarcMonitoringTest
+```
+
+If you want to record new fixtures against the real API, set your token in `TestHelper.validToken` and delete the relevant fixture JSON file before running the tests. The VCR recorder will make the real API call and save the response for future runs.
+
# Support and Feedback
diff --git a/pom.xml b/pom.xml
index bd665f1..90e3098 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.mailersend
java-sdk
- 1.4.1
+ 1.5.0
MailerSend Java SDK
An SDK for MailerSend API
https://github.com/mailersend/mailersend-java
diff --git a/src/main/java/com/mailersend/sdk/MailerSend.java b/src/main/java/com/mailersend/sdk/MailerSend.java
index 77eb4e9..79fd12e 100644
--- a/src/main/java/com/mailersend/sdk/MailerSend.java
+++ b/src/main/java/com/mailersend/sdk/MailerSend.java
@@ -20,6 +20,7 @@
import com.mailersend.sdk.tokens.Tokens;
import com.mailersend.sdk.webhooks.Webhooks;
import com.mailsend.sdk.emailverification.EmailVerification;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitoring;
/**
* Main SDK Class
@@ -44,6 +45,7 @@ public class MailerSend {
private ScheduledMessages scheduledMessages = null;
private EmailVerification emailVerification = null;
private Sms sms = null;
+ private DmarcMonitoring dmarcMonitoring = null;
/**
*
Constructor for MailerSend.
@@ -63,6 +65,7 @@ public MailerSend() {
scheduledMessages = new ScheduledMessages(this);
emailVerification = new EmailVerification(this);
sms = new Sms(this);
+ dmarcMonitoring = new DmarcMonitoring(this);
}
@@ -203,6 +206,15 @@ public Sms sms() {
return sms;
}
+ /**
+ * Get the DMARC monitoring access object
+ *
+ * @return the DmarcMonitoring object
+ */
+ public DmarcMonitoring dmarcMonitoring() {
+ return dmarcMonitoring;
+ }
+
/**
* Sets the MailerSend token
*
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReport.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReport.java
new file mode 100644
index 0000000..47ed7b7
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReport.java
@@ -0,0 +1,41 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.MailerSendResponse;
+
+/**
+ * Represents a single row in an aggregated DMARC report.
+ */
+public class DmarcAggregatedReport extends MailerSendResponse {
+
+ @SerializedName("ip_address")
+ public String ipAddress;
+
+ @SerializedName("total_volume")
+ public int totalVolume;
+
+ @SerializedName("passed_dmarc")
+ public float passedDmarc;
+
+ @SerializedName("passed_spf")
+ public float passedSpf;
+
+ @SerializedName("passed_dkim")
+ public float passedDkim;
+
+ @SerializedName("domain")
+ public String domain;
+
+ @SerializedName("country")
+ public String country;
+
+ @SerializedName("is_favorite")
+ public boolean isFavorite;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReportList.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReportList.java
new file mode 100644
index 0000000..4b8bc11
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcAggregatedReportList.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.util.PaginatedResponse;
+
+/**
+ * Represents a paginated list of aggregated DMARC reports.
+ */
+public class DmarcAggregatedReportList extends PaginatedResponse {
+
+ @SerializedName("data")
+ public DmarcAggregatedReport[] reports;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcDkimAuth.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcDkimAuth.java
new file mode 100644
index 0000000..efb754a
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcDkimAuth.java
@@ -0,0 +1,25 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Represents a DKIM authentication result in a DMARC IP report.
+ */
+public class DmarcDkimAuth {
+
+ @SerializedName("domain")
+ public String domain;
+
+ @SerializedName("selector")
+ public String selector;
+
+ @SerializedName("result")
+ public String result;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReport.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReport.java
new file mode 100644
index 0000000..7cedb13
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReport.java
@@ -0,0 +1,62 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.MailerSendResponse;
+
+/**
+ * Represents a detailed per-IP DMARC report entry.
+ */
+public class DmarcIpReport extends MailerSendResponse {
+
+ @SerializedName("id")
+ public String id;
+
+ @SerializedName("ip_address")
+ public String ipAddress;
+
+ @SerializedName("ip_domain")
+ public String ipDomain;
+
+ @SerializedName("total_volume")
+ public int totalVolume;
+
+ @SerializedName("passed_dmarc")
+ public float passedDmarc;
+
+ @SerializedName("passed_spf")
+ public float passedSpf;
+
+ @SerializedName("passed_dkim")
+ public float passedDkim;
+
+ @SerializedName("aligned_spf")
+ public float alignedSpf;
+
+ @SerializedName("aligned_dkim")
+ public float alignedDkim;
+
+ @SerializedName("applied_policy")
+ public String appliedPolicy;
+
+ @SerializedName("override_reason")
+ public String overrideReason;
+
+ @SerializedName("country")
+ public String country;
+
+ @SerializedName("report_source")
+ public String reportSource;
+
+ @SerializedName("spf_auth")
+ public DmarcSpfAuth[] spfAuth;
+
+ @SerializedName("dkim_auth")
+ public DmarcDkimAuth[] dkimAuth;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReportList.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReportList.java
new file mode 100644
index 0000000..aaa983c
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcIpReportList.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.util.PaginatedResponse;
+
+/**
+ * Represents a paginated list of IP-specific DMARC reports.
+ */
+public class DmarcIpReportList extends PaginatedResponse {
+
+ @SerializedName("data")
+ public DmarcIpReport[] reports;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitor.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitor.java
new file mode 100644
index 0000000..53f8581
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitor.java
@@ -0,0 +1,89 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.TemporalAccessor;
+import java.util.Date;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.MailerSendResponse;
+
+/**
+ * Represents a DMARC monitor.
+ */
+public class DmarcMonitor extends MailerSendResponse {
+
+ @SerializedName("id")
+ public String id;
+
+ @SerializedName("dmarc_record")
+ public String dmarcRecord;
+
+ @SerializedName("wanted_dmarc_record")
+ public String wantedDmarcRecord;
+
+ @SerializedName("dmarc_valid")
+ public boolean dmarcValid;
+
+ @SerializedName("dmarc_record_checked_at")
+ private String dmarcRecordCheckedAtStr;
+
+ public Date dmarcRecordCheckedAt;
+
+ @SerializedName("spf_record")
+ public String spfRecord;
+
+ @SerializedName("spf_status")
+ public String spfStatus;
+
+ @SerializedName("domain")
+ public DmarcMonitorDomain domain;
+
+ @SerializedName("created_at")
+ private String createdAtStr;
+
+ @SerializedName("updated_at")
+ private String updatedAtStr;
+
+ public Date createdAt;
+
+ public Date updatedAt;
+
+
+ /**
+ * Called after deserialization to parse date strings into Date objects.
+ */
+ public void postDeserialize() {
+ parseDates();
+ }
+
+ private void parseDates() {
+ TemporalAccessor ta;
+ Instant instant;
+
+ if (createdAtStr != null && !createdAtStr.isBlank()) {
+ ta = DateTimeFormatter.ISO_INSTANT.parse(createdAtStr);
+ instant = Instant.from(ta);
+ createdAt = Date.from(instant);
+ }
+
+ if (updatedAtStr != null && !updatedAtStr.isBlank()) {
+ ta = DateTimeFormatter.ISO_INSTANT.parse(updatedAtStr);
+ instant = Instant.from(ta);
+ updatedAt = Date.from(instant);
+ }
+
+ if (dmarcRecordCheckedAtStr != null && !dmarcRecordCheckedAtStr.isBlank()) {
+ ta = DateTimeFormatter.ISO_INSTANT.parse(dmarcRecordCheckedAtStr);
+ instant = Instant.from(ta);
+ dmarcRecordCheckedAt = Date.from(instant);
+ }
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateBuilder.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateBuilder.java
new file mode 100644
index 0000000..c0e03e1
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateBuilder.java
@@ -0,0 +1,66 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.MailerSendApi;
+import com.mailersend.sdk.exceptions.MailerSendException;
+import com.mailersend.sdk.util.JsonSerializationDeserializationStrategy;
+
+/**
+ * Builder for creating a DMARC monitor.
+ */
+public class DmarcMonitorCreateBuilder {
+
+ private MailerSend apiObjectReference;
+
+ private DmarcMonitorCreateRequestBody createBody;
+
+ /**
+ * No instantiation from outside the SDK.
+ *
+ * @param apiObjectRef a {@link com.mailersend.sdk.MailerSend} object.
+ */
+ protected DmarcMonitorCreateBuilder(MailerSend apiObjectRef) {
+ apiObjectReference = apiObjectRef;
+ createBody = new DmarcMonitorCreateRequestBody();
+ }
+
+ /**
+ * Creates a new DMARC monitor for the given domain.
+ *
+ * @param domainId the domain ID to monitor
+ * @return the created {@link DmarcMonitor}
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcMonitor createMonitor(String domainId) throws MailerSendException {
+
+ String endpoint = "/dmarc-monitoring";
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ createBody.domainId = domainId;
+
+ Gson gson = new GsonBuilder()
+ .addSerializationExclusionStrategy(new JsonSerializationDeserializationStrategy(false))
+ .addDeserializationExclusionStrategy(new JsonSerializationDeserializationStrategy(true))
+ .create();
+
+ String json = gson.toJson(createBody);
+
+ // reset the body object's values so that it can be reused
+ createBody.reset();
+
+ DmarcMonitorResponse response = api.postRequest(endpoint, json, DmarcMonitorResponse.class);
+
+ return response.monitor;
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateRequestBody.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateRequestBody.java
new file mode 100644
index 0000000..6b403ce
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorCreateRequestBody.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+
+class DmarcMonitorCreateRequestBody {
+
+ @SerializedName("domain_id")
+ public String domainId;
+
+ public void reset() {
+ domainId = null;
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorDomain.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorDomain.java
new file mode 100644
index 0000000..36031c9
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorDomain.java
@@ -0,0 +1,22 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Represents the domain object nested inside a DmarcMonitor response.
+ */
+public class DmarcMonitorDomain {
+
+ @SerializedName("id")
+ public String id;
+
+ @SerializedName("name")
+ public String name;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorResponse.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorResponse.java
new file mode 100644
index 0000000..56d418d
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorResponse.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.MailerSendResponse;
+
+/**
+ * Wraps a single DmarcMonitor returned by create/update endpoints.
+ */
+class DmarcMonitorResponse extends MailerSendResponse {
+
+ @SerializedName("data")
+ public DmarcMonitor monitor;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateBuilder.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateBuilder.java
new file mode 100644
index 0000000..35f59a3
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateBuilder.java
@@ -0,0 +1,75 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.MailerSendApi;
+import com.mailersend.sdk.exceptions.MailerSendException;
+import com.mailersend.sdk.util.JsonSerializationDeserializationStrategy;
+
+/**
+ * Builder for updating a DMARC monitor.
+ */
+public class DmarcMonitorUpdateBuilder {
+
+ private MailerSend apiObjectReference;
+
+ private DmarcMonitorUpdateRequestBody updateBody;
+
+ /**
+ * No instantiation from outside the SDK.
+ *
+ * @param apiObjectRef a {@link com.mailersend.sdk.MailerSend} object.
+ */
+ protected DmarcMonitorUpdateBuilder(MailerSend apiObjectRef) {
+ apiObjectReference = apiObjectRef;
+ updateBody = new DmarcMonitorUpdateRequestBody();
+ }
+
+ /**
+ * Set the desired DMARC record value.
+ *
+ * @param wantedDmarcRecord the DMARC record string to set
+ * @return this builder
+ */
+ public DmarcMonitorUpdateBuilder wantedDmarcRecord(String wantedDmarcRecord) {
+ updateBody.wantedDmarcRecord = wantedDmarcRecord;
+ return this;
+ }
+
+ /**
+ * Updates the DMARC monitor with the given ID.
+ *
+ * @param monitorId the monitor ID to update
+ * @return the updated {@link DmarcMonitor}
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcMonitor updateMonitor(String monitorId) throws MailerSendException {
+
+ String endpoint = "/dmarc-monitoring/".concat(monitorId);
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ Gson gson = new GsonBuilder()
+ .addSerializationExclusionStrategy(new JsonSerializationDeserializationStrategy(false))
+ .addDeserializationExclusionStrategy(new JsonSerializationDeserializationStrategy(true))
+ .create();
+
+ String json = gson.toJson(updateBody);
+
+ // reset the body object's values so that it can be reused
+ updateBody.reset();
+
+ DmarcMonitorResponse response = api.putRequest(endpoint, json, DmarcMonitorResponse.class);
+
+ return response.monitor;
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateRequestBody.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateRequestBody.java
new file mode 100644
index 0000000..8a0238a
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorUpdateRequestBody.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+
+class DmarcMonitorUpdateRequestBody {
+
+ @SerializedName("wanted_dmarc_record")
+ public String wantedDmarcRecord;
+
+ public void reset() {
+ wantedDmarcRecord = null;
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitoring.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitoring.java
new file mode 100644
index 0000000..4854a4d
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitoring.java
@@ -0,0 +1,226 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import java.util.ArrayList;
+import java.util.stream.IntStream;
+
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.MailerSendApi;
+import com.mailersend.sdk.MailerSendResponse;
+import com.mailersend.sdk.exceptions.MailerSendException;
+
+/**
+ * Provides access to the DMARC Monitoring API endpoints.
+ *
+ * Do not initialize directly. Access via {@code MailerSend.dmarcMonitoring()}.
+ */
+public class DmarcMonitoring {
+
+ private MailerSend apiObjectReference;
+
+ private int pageFilter = 1;
+ private int limitFilter = 25;
+
+ private DmarcMonitorCreateBuilder createBuilder;
+ private DmarcMonitorUpdateBuilder updateBuilder;
+
+ /**
+ * Do not initialize directly. This should only be accessed from MailerSend.dmarcMonitoring()
+ *
+ * @param ref a {@link com.mailersend.sdk.MailerSend} object.
+ */
+ public DmarcMonitoring(MailerSend ref) {
+ apiObjectReference = ref;
+ createBuilder = new DmarcMonitorCreateBuilder(ref);
+ updateBuilder = new DmarcMonitorUpdateBuilder(ref);
+ }
+
+ /**
+ * Get the create monitor builder.
+ *
+ * @return a {@link DmarcMonitorCreateBuilder} object.
+ */
+ public DmarcMonitorCreateBuilder createMonitorBuilder() {
+ return createBuilder;
+ }
+
+ /**
+ * Get the update monitor builder.
+ *
+ * @return a {@link DmarcMonitorUpdateBuilder} object.
+ */
+ public DmarcMonitorUpdateBuilder updateMonitorBuilder() {
+ return updateBuilder;
+ }
+
+ /**
+ * Set the page of the request.
+ *
+ * @param page a int.
+ * @return a {@link DmarcMonitoring} object.
+ */
+ public DmarcMonitoring page(int page) {
+ pageFilter = page;
+ return this;
+ }
+
+ /**
+ * Set the results limit (10 - 100).
+ *
+ * @param limit a int.
+ * @return a {@link DmarcMonitoring} object.
+ */
+ public DmarcMonitoring limit(int limit) {
+ limitFilter = limit;
+ return this;
+ }
+
+ /**
+ * Gets a paginated list of DMARC monitors.
+ *
+ * @return a {@link DmarcMonitorsList} object.
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcMonitorsList getMonitors() throws MailerSendException {
+ String endpoint = "/dmarc-monitoring".concat(prepareParamsUrl());
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ return api.getRequest(endpoint, DmarcMonitorsList.class);
+ }
+
+ /**
+ * Deletes the DMARC monitor with the given ID.
+ *
+ * @param monitorId the monitor ID to delete
+ * @return true if deletion succeeded
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public boolean deleteMonitor(String monitorId) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId);
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ MailerSendResponse response = api.deleteRequest(endpoint, MailerSendResponse.class);
+
+ return IntStream.of(new int[]{200, 204, 202}).anyMatch(x -> x == response.responseStatusCode);
+ }
+
+ /**
+ * Gets aggregated DMARC reports for the given monitor.
+ *
+ * @param monitorId the monitor ID
+ * @return a {@link DmarcAggregatedReportList} object.
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcAggregatedReportList getAggregatedReport(String monitorId) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId).concat("/report").concat(prepareParamsUrl());
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ return api.getRequest(endpoint, DmarcAggregatedReportList.class);
+ }
+
+ /**
+ * Gets IP-specific DMARC reports for the given monitor and IP address.
+ *
+ * @param monitorId the monitor ID
+ * @param ip the IP address
+ * @return a {@link DmarcIpReportList} object.
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcIpReportList getIpReport(String monitorId, String ip) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId).concat("/report/").concat(ip)
+ .concat(prepareParamsUrl());
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ return api.getRequest(endpoint, DmarcIpReportList.class);
+ }
+
+ /**
+ * Gets the report sources for the given monitor.
+ *
+ * @param monitorId the monitor ID
+ * @return a {@link DmarcReportSourcesList} object.
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public DmarcReportSourcesList getReportSources(String monitorId) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId).concat("/report-sources")
+ .concat(prepareParamsUrl());
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ return api.getRequest(endpoint, DmarcReportSourcesList.class);
+ }
+
+ /**
+ * Marks the given IP address as a favorite for the specified monitor.
+ *
+ * @param monitorId the monitor ID
+ * @param ip the IP address to mark as favorite
+ * @return true if the operation succeeded
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public boolean markIpAsFavorite(String monitorId, String ip) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId).concat("/favorite/").concat(ip);
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ MailerSendResponse response = api.putRequest(endpoint, "", MailerSendResponse.class);
+
+ return IntStream.of(new int[]{200, 204, 202}).anyMatch(x -> x == response.responseStatusCode);
+ }
+
+ /**
+ * Removes the given IP address from favorites for the specified monitor.
+ *
+ * @param monitorId the monitor ID
+ * @param ip the IP address to remove from favorites
+ * @return true if the operation succeeded
+ * @throws MailerSendException if an error is returned from the API
+ */
+ public boolean removeIpFromFavorites(String monitorId, String ip) throws MailerSendException {
+ String endpoint = "/dmarc-monitoring/".concat(monitorId).concat("/favorite/").concat(ip);
+
+ MailerSendApi api = new MailerSendApi();
+ api.setToken(apiObjectReference.getToken());
+
+ MailerSendResponse response = api.deleteRequest(endpoint, MailerSendResponse.class);
+
+ return IntStream.of(new int[]{200, 204, 202}).anyMatch(x -> x == response.responseStatusCode);
+ }
+
+ /**
+ * Prepares the query part of the request URL.
+ */
+ private String prepareParamsUrl() {
+ ArrayList params = new ArrayList();
+
+ params.add("page=".concat(String.valueOf(pageFilter)));
+ params.add("limit=".concat(String.valueOf(limitFilter)));
+
+ String requestParams = "";
+ for (int i = 0; i < params.size(); i++) {
+ String attrSep = "&";
+ if (i == 0) {
+ attrSep = "?";
+ }
+ requestParams = requestParams.concat(attrSep).concat(params.get(i));
+ }
+
+ return requestParams;
+ }
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorsList.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorsList.java
new file mode 100644
index 0000000..bf40c81
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcMonitorsList.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.util.PaginatedResponse;
+
+/**
+ * Represents a paginated list of DMARC monitors.
+ */
+public class DmarcMonitorsList extends PaginatedResponse {
+
+ @SerializedName("data")
+ public DmarcMonitor[] monitors;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSource.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSource.java
new file mode 100644
index 0000000..1f40c79
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSource.java
@@ -0,0 +1,23 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.MailerSendResponse;
+
+/**
+ * Represents a DMARC report source entry.
+ */
+public class DmarcReportSource extends MailerSendResponse {
+
+ @SerializedName("report_source")
+ public String reportSource;
+
+ @SerializedName("reports")
+ public int reports;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSourcesList.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSourcesList.java
new file mode 100644
index 0000000..3cd6ab5
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcReportSourcesList.java
@@ -0,0 +1,20 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+import com.mailersend.sdk.util.PaginatedResponse;
+
+/**
+ * Represents a paginated list of DMARC report sources.
+ */
+public class DmarcReportSourcesList extends PaginatedResponse {
+
+ @SerializedName("data")
+ public DmarcReportSource[] sources;
+}
diff --git a/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcSpfAuth.java b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcSpfAuth.java
new file mode 100644
index 0000000..233eed2
--- /dev/null
+++ b/src/main/java/com/mailersend/sdk/dmarcmonitoring/DmarcSpfAuth.java
@@ -0,0 +1,22 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.dmarcmonitoring;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Represents an SPF authentication result in a DMARC IP report.
+ */
+public class DmarcSpfAuth {
+
+ @SerializedName("domain")
+ public String domain;
+
+ @SerializedName("result")
+ public String result;
+}
diff --git a/src/test/java/com/mailersend/sdk/tests/DmarcMonitoringTest.java b/src/test/java/com/mailersend/sdk/tests/DmarcMonitoringTest.java
new file mode 100644
index 0000000..999279e
--- /dev/null
+++ b/src/test/java/com/mailersend/sdk/tests/DmarcMonitoringTest.java
@@ -0,0 +1,251 @@
+/*************************************************
+ * MailerSend Java SDK
+ * https://github.com/mailersend/mailersend-java
+ *
+ * @author MailerSend
+ * https://mailersend.com
+ **************************************************/
+package com.mailersend.sdk.tests;
+
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.IOException;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+
+import com.mailersend.sdk.MailerSend;
+import com.mailersend.sdk.dmarcmonitoring.DmarcAggregatedReport;
+import com.mailersend.sdk.dmarcmonitoring.DmarcAggregatedReportList;
+import com.mailersend.sdk.dmarcmonitoring.DmarcIpReport;
+import com.mailersend.sdk.dmarcmonitoring.DmarcIpReportList;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitor;
+import com.mailersend.sdk.dmarcmonitoring.DmarcMonitorsList;
+import com.mailersend.sdk.dmarcmonitoring.DmarcReportSource;
+import com.mailersend.sdk.dmarcmonitoring.DmarcReportSourcesList;
+import com.mailersend.sdk.exceptions.MailerSendException;
+import com.mailersend.sdk.vcr.VcrRecorder;
+
+public class DmarcMonitoringTest {
+
+ @BeforeEach
+ public void setupEach(TestInfo info) throws IOException {
+ VcrRecorder.useRecording("DmarcMonitoringTest_" + info.getDisplayName());
+ }
+
+ @AfterEach
+ public void afterEach() throws IOException {
+ VcrRecorder.stopRecording();
+ }
+
+ /**
+ * Tests listing DMARC monitors
+ */
+ @Test
+ public void ListMonitorsTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcMonitorsList list = ms.dmarcMonitoring().getMonitors();
+
+ for (DmarcMonitor monitor : list.monitors) {
+ System.out.println(monitor.id);
+ System.out.println(monitor.dmarcRecord);
+ System.out.println(monitor.spfStatus);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests creating a DMARC monitor
+ */
+ @Test
+ public void CreateMonitorTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcMonitor monitor = ms.dmarcMonitoring().createMonitorBuilder()
+ .createMonitor(TestHelper.dmarcDomainId);
+
+ System.out.println(monitor.id);
+ System.out.println(monitor.wantedDmarcRecord);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests updating a DMARC monitor
+ */
+ @Test
+ public void UpdateMonitorTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcMonitor monitor = ms.dmarcMonitoring().updateMonitorBuilder()
+ .wantedDmarcRecord(TestHelper.dmarcWantedRecord)
+ .updateMonitor(TestHelper.dmarcMonitorId);
+
+ System.out.println(monitor.id);
+ System.out.println(monitor.wantedDmarcRecord);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests deleting a DMARC monitor
+ */
+ @Test
+ public void DeleteMonitorTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ boolean deleted = ms.dmarcMonitoring().deleteMonitor(TestHelper.dmarcMonitorId);
+
+ System.out.println("Monitor deleted: " + deleted);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests retrieving aggregated DMARC reports
+ */
+ @Test
+ public void GetAggregatedReportTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcAggregatedReportList list = ms.dmarcMonitoring().getAggregatedReport(TestHelper.dmarcMonitorId);
+
+ for (DmarcAggregatedReport report : list.reports) {
+ System.out.println(report.ipAddress);
+ System.out.println(report.totalVolume);
+ System.out.println(report.passedDmarc);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests retrieving IP-specific DMARC reports
+ */
+ @Test
+ public void GetIpReportTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcIpReportList list = ms.dmarcMonitoring().getIpReport(TestHelper.dmarcMonitorId, TestHelper.dmarcMonitorIp);
+
+ for (DmarcIpReport report : list.reports) {
+ System.out.println(report.ipAddress);
+ System.out.println(report.totalVolume);
+ System.out.println(report.appliedPolicy);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests retrieving DMARC report sources
+ */
+ @Test
+ public void GetReportSourcesTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ DmarcReportSourcesList list = ms.dmarcMonitoring().getReportSources(TestHelper.dmarcMonitorId);
+
+ for (DmarcReportSource source : list.sources) {
+ System.out.println(source.reportSource);
+ System.out.println(source.reports);
+ }
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests marking an IP as favorite
+ */
+ @Test
+ public void MarkIpAsFavoriteTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ boolean marked = ms.dmarcMonitoring().markIpAsFavorite(TestHelper.dmarcMonitorId, TestHelper.dmarcMonitorIp);
+
+ System.out.println("IP marked as favorite: " + marked);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+
+ /**
+ * Tests removing an IP from favorites
+ */
+ @Test
+ public void RemoveIpFromFavoritesTest() {
+
+ MailerSend ms = new MailerSend();
+ ms.setToken(TestHelper.validToken);
+
+ try {
+
+ boolean removed = ms.dmarcMonitoring().removeIpFromFavorites(TestHelper.dmarcMonitorId, TestHelper.dmarcMonitorIp);
+
+ System.out.println("IP removed from favorites: " + removed);
+
+ } catch (MailerSendException e) {
+ e.printStackTrace();
+ fail();
+ }
+ }
+}
diff --git a/src/test/java/com/mailersend/sdk/tests/TestHelper.java b/src/test/java/com/mailersend/sdk/tests/TestHelper.java
index e8a2605..ac76ccb 100644
--- a/src/test/java/com/mailersend/sdk/tests/TestHelper.java
+++ b/src/test/java/com/mailersend/sdk/tests/TestHelper.java
@@ -47,6 +47,11 @@ public class TestHelper {
public static final String emailVerificationListId = "7z3m5jgroogdpyo6";
public static final String smsPhoneNumberId = "3yxj6lj9x14do2rm";
+
+ public static final String dmarcMonitorId = "dmarc-monitor-id-test";
+ public static final String dmarcMonitorIp = "1.2.3.4";
+ public static final String dmarcDomainId = "jpzkmgq7e5vl059v";
+ public static final String dmarcWantedRecord = "v=DMARC1; p=reject; rua=mailto:dmarc@example.com;";
/**
* Creates a basic email with the above configuration
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_CreateMonitorTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_CreateMonitorTest().json
new file mode 100644
index 0000000..e35603d
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_CreateMonitorTest().json
@@ -0,0 +1 @@
+{"8b6877581b3020bc7b6e184f9c755f29dc9908d1":{"body":"{\"data\":{\"id\":\"dmarc-monitor-id-test\",\"dmarc_record\":\"\",\"wanted_dmarc_record\":\"v=DMARC1; p=none; rua=mailto:dmarc@test-sdk.com;\",\"dmarc_valid\":false,\"dmarc_record_checked_at\":null,\"spf_record\":\"\",\"spf_status\":\"not_found\",\"domain\":{\"id\":\"jpzkmgq7e5vl059v\",\"name\":\"test-sdk.com\"},\"created_at\":\"2023-05-01T10:00:00.000000Z\",\"updated_at\":\"2023-05-01T10:00:00.000000Z\"}}","headers":{":status":["201"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":201}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_DeleteMonitorTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_DeleteMonitorTest().json
new file mode 100644
index 0000000..84dfafe
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_DeleteMonitorTest().json
@@ -0,0 +1 @@
+{"9a479d2d4726660347fdfbdcb50d2c55ca16a41f":{"body":"","headers":{":status":["204"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":204}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_GetAggregatedReportTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_GetAggregatedReportTest().json
new file mode 100644
index 0000000..55dcec0
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_GetAggregatedReportTest().json
@@ -0,0 +1 @@
+{"244b6d6a21ea03dc54e00a036d91c35297c091f0":{"body":"{\"data\":[{\"ip_address\":\"1.2.3.4\",\"total_volume\":150,\"passed_dmarc\":88.5,\"passed_spf\":90.0,\"passed_dkim\":92.5,\"domain\":\"test-sdk.com\",\"country\":\"US\",\"is_favorite\":false},{\"ip_address\":\"5.6.7.8\",\"total_volume\":50,\"passed_dmarc\":100.0,\"passed_spf\":100.0,\"passed_dkim\":100.0,\"domain\":\"smtp.test-sdk.com\",\"country\":\"DE\",\"is_favorite\":true}],\"links\":{\"first\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report?page=1\",\"last\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report?page=1\",\"prev\":null,\"next\":null},\"meta\":{\"current_page\":1,\"from\":1,\"last_page\":1,\"links\":[],\"path\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report\",\"per_page\":25,\"to\":2,\"total\":2}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_GetIpReportTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_GetIpReportTest().json
new file mode 100644
index 0000000..078ee93
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_GetIpReportTest().json
@@ -0,0 +1 @@
+{"12fd06d41d73e7ed6f4ea72ae0536b37219ae8e0":{"body":"{\"data\":[{\"id\":\"ip-report-id-1\",\"ip_address\":\"1.2.3.4\",\"ip_domain\":\"mail.example.com\",\"total_volume\":150,\"passed_dmarc\":88.5,\"passed_spf\":90.0,\"passed_dkim\":92.5,\"aligned_spf\":90.0,\"aligned_dkim\":92.5,\"applied_policy\":\"none\",\"override_reason\":null,\"country\":\"US\",\"report_source\":\"google.com\",\"spf_auth\":[{\"domain\":\"test-sdk.com\",\"result\":\"pass\"}],\"dkim_auth\":[{\"domain\":\"test-sdk.com\",\"selector\":\"mailersend\",\"result\":\"pass\"}]}],\"links\":{\"first\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report\\/1.2.3.4?page=1\",\"last\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report\\/1.2.3.4?page=1\",\"prev\":null,\"next\":null},\"meta\":{\"current_page\":1,\"from\":1,\"last_page\":1,\"links\":[],\"path\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report\\/1.2.3.4\",\"per_page\":25,\"to\":1,\"total\":1}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_GetReportSourcesTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_GetReportSourcesTest().json
new file mode 100644
index 0000000..e9f9fc3
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_GetReportSourcesTest().json
@@ -0,0 +1 @@
+{"99b5f74465279a3586711ec73a03d69826efea5c":{"body":"{\"data\":[{\"report_source\":\"google.com\",\"reports\":42},{\"report_source\":\"microsoft.com\",\"reports\":17}],\"links\":{\"first\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report-sources?page=1\",\"last\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report-sources?page=1\",\"prev\":null,\"next\":null},\"meta\":{\"current_page\":1,\"from\":1,\"last_page\":1,\"links\":[],\"path\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\\/dmarc-monitor-id-test\\/report-sources\",\"per_page\":25,\"to\":2,\"total\":2}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_ListMonitorsTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_ListMonitorsTest().json
new file mode 100644
index 0000000..93e2047
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_ListMonitorsTest().json
@@ -0,0 +1 @@
+{"d711565079f9186a8beac1319bf155a5e0edce74":{"body":"{\"data\":[{\"id\":\"dmarc-monitor-id-test\",\"dmarc_record\":\"v=DMARC1; p=none;\",\"wanted_dmarc_record\":\"v=DMARC1; p=reject; rua=mailto:dmarc@test-sdk.com;\",\"dmarc_valid\":false,\"dmarc_record_checked_at\":\"2023-06-01T10:00:00.000000Z\",\"spf_record\":\"v=spf1 include:spf.mailersend.com ~all\",\"spf_status\":\"found\",\"domain\":{\"id\":\"jpzkmgq7e5vl059v\",\"name\":\"test-sdk.com\"},\"created_at\":\"2023-05-01T10:00:00.000000Z\",\"updated_at\":\"2023-06-01T10:00:00.000000Z\"}],\"links\":{\"first\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring?page=1\",\"last\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring?page=1\",\"prev\":null,\"next\":null},\"meta\":{\"current_page\":1,\"from\":1,\"last_page\":1,\"links\":[{\"url\":null,\"label\":\"« Previous\",\"active\":false},{\"url\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring?page=1\",\"label\":\"1\",\"active\":true},{\"url\":null,\"label\":\"Next »\",\"active\":false}],\"path\":\"https:\\/\\/api.mailersend.com\\/v1\\/dmarc-monitoring\",\"per_page\":25,\"to\":1,\"total\":1}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_MarkIpAsFavoriteTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_MarkIpAsFavoriteTest().json
new file mode 100644
index 0000000..77ed002
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_MarkIpAsFavoriteTest().json
@@ -0,0 +1 @@
+{"ac13f1bcb77d72cfb9aec1cddc708b72b951ec1c":{"body":"","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_RemoveIpFromFavoritesTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_RemoveIpFromFavoritesTest().json
new file mode 100644
index 0000000..a0854a7
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_RemoveIpFromFavoritesTest().json
@@ -0,0 +1 @@
+{"b79d5f58c7b0f2fcec670ed3bed50b0b75d79154":{"body":"","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
diff --git a/src/test/resources/fixtures/DmarcMonitoringTest_UpdateMonitorTest().json b/src/test/resources/fixtures/DmarcMonitoringTest_UpdateMonitorTest().json
new file mode 100644
index 0000000..8845915
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_UpdateMonitorTest().json
@@ -0,0 +1 @@
+{"c3ea88bc1412f17d3e0dae691b10b5a8d294070d":{"body":"{\"data\":{\"id\":\"dmarc-monitor-id-test\",\"dmarc_record\":\"v\u003dDMARC1; p\u003dnone;\",\"wanted_dmarc_record\":\"v\u003dDMARC1; p\u003dreject; rua\u003dmailto:dmarc@example.com;\",\"dmarc_valid\":false,\"dmarc_record_checked_at\":\"2023-06-01T10:00:00.000000Z\",\"spf_record\":\"v\u003dspf1 include:spf.mailersend.com ~all\",\"spf_status\":\"found\",\"domain\":{\"id\":\"jpzkmgq7e5vl059v\",\"name\":\"test-sdk.com\"},\"created_at\":\"2023-05-01T10:00:00.000000Z\",\"updated_at\":\"2023-06-15T10:00:00.000000Z\"}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/EmailSendTest_ScheduleEmailTest().json b/src/test/resources/fixtures/EmailSendTest_ScheduleEmailTest().json
index 1f5a774..4565324 100644
--- a/src/test/resources/fixtures/EmailSendTest_ScheduleEmailTest().json
+++ b/src/test/resources/fixtures/EmailSendTest_ScheduleEmailTest().json
@@ -1,122 +1 @@
-{
- "4f6a751939688d9c22a55807b9b1717ea74552f7": {
- "body": "",
- "headers": {
- ":status": [
- "202"
- ],
- "cache-control": [
- "no-cache, private"
- ],
- "cf-cache-status": [
- "DYNAMIC"
- ],
- "cf-ray": [
- "8ac5d0d95b7f7176-ATH"
- ],
- "content-type": [
- "text/html; charset\u003dUTF-8"
- ],
- "date": [
- "Thu, 01 Aug 2024 12:26:18 GMT"
- ],
- "server": [
- "cloudflare"
- ],
- "strict-transport-security": [
- "max-age\u003d31536000; includeSubDomains"
- ],
- "x-apiquota-remaining": [
- "-1"
- ],
- "x-apiquota-reset": [
- "2024-08-02T00:00:00Z"
- ],
- "x-message-id": [
- "66ab7eea1101995a278ad874"
- ]
- },
- "statusCode": 202
- },
- "6b15cf69672ee532a9f601876778851cc4ca3135": {
- "body": "",
- "headers": {
- ":status": [
- "202"
- ],
- "cache-control": [
- "no-cache, private"
- ],
- "cf-cache-status": [
- "DYNAMIC"
- ],
- "cf-ray": [
- "755442149ddbeea0-ATH"
- ],
- "content-type": [
- "text/html; charset\u003dUTF-8"
- ],
- "date": [
- "Wed, 05 Oct 2022 06:56:34 GMT"
- ],
- "server": [
- "cloudflare"
- ],
- "strict-transport-security": [
- "max-age\u003d15724800; includeSubDomains"
- ],
- "x-apiquota-remaining": [
- "-1"
- ],
- "x-apiquota-reset": [
- "2022-10-06T00:00:00Z"
- ],
- "x-message-id": [
- "633d2aa226762ac1d30457e0"
- ],
- "x-ratelimit-limit": [
- "120"
- ],
- "x-ratelimit-remaining": [
- "118"
- ]
- },
- "statusCode": 202
- },
- "e4a0bcf8b4e53b4dcfb4d96b2db3d8a0054a92f2": {
- "body": "{\"message\":\"The send_at must be a date before or equal to 2024-08-04 12:24:25.\",\"errors\":{\"send_at\":[\"The send_at must be a date before or equal to 2024-08-04 12:24:25.\"]}}",
- "headers": {
- ":status": [
- "422"
- ],
- "cache-control": [
- "no-cache, private"
- ],
- "cf-cache-status": [
- "DYNAMIC"
- ],
- "cf-ray": [
- "8ac5ce134f316f56-ATH"
- ],
- "content-type": [
- "application/json"
- ],
- "date": [
- "Thu, 01 Aug 2024 12:24:25 GMT"
- ],
- "server": [
- "cloudflare"
- ],
- "strict-transport-security": [
- "max-age\u003d31536000; includeSubDomains"
- ],
- "x-apiquota-remaining": [
- "-1"
- ],
- "x-apiquota-reset": [
- "2024-08-02T00:00:00Z"
- ]
- },
- "statusCode": 422
- }
-}
\ No newline at end of file
+{"d4977e990b2f2ac2d8e65aa2c9661b4ef22636b5":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"content-type":["text/html; charset\u003dUTF-8"],"x-message-id":["test-schedule-email-message-id"]},"statusCode":202},"6b15cf69672ee532a9f601876778851cc4ca3135":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["755442149ddbeea0-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Wed, 05 Oct 2022 06:56:34 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-10-06T00:00:00Z"],"x-message-id":["633d2aa226762ac1d30457e0"],"x-ratelimit-limit":["120"],"x-ratelimit-remaining":["118"]},"statusCode":202},"e4a0bcf8b4e53b4dcfb4d96b2db3d8a0054a92f2":{"body":"{\"message\":\"The send_at must be a date before or equal to 2024-08-04 12:24:25.\",\"errors\":{\"send_at\":[\"The send_at must be a date before or equal to 2024-08-04 12:24:25.\"]}}","headers":{":status":["422"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["8ac5ce134f316f56-ATH"],"content-type":["application/json"],"date":["Thu, 01 Aug 2024 12:24:25 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d31536000; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2024-08-02T00:00:00Z"]},"statusCode":422},"4f6a751939688d9c22a55807b9b1717ea74552f7":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["8ac5d0d95b7f7176-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Thu, 01 Aug 2024 12:26:18 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d31536000; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2024-08-02T00:00:00Z"],"x-message-id":["66ab7eea1101995a278ad874"]},"statusCode":202}}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/EmailSendTest_TestEmailWithAttachment().json b/src/test/resources/fixtures/EmailSendTest_TestEmailWithAttachment().json
index b692dbd..31b3002 100644
--- a/src/test/resources/fixtures/EmailSendTest_TestEmailWithAttachment().json
+++ b/src/test/resources/fixtures/EmailSendTest_TestEmailWithAttachment().json
@@ -1 +1 @@
-{"872ed332468f4b2427c07accf4e75f1353d64c4d":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["8ac5ca303f6738c9-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Thu, 01 Aug 2024 12:21:45 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d31536000; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2024-08-02T00:00:00Z"],"x-message-id":["66ab7dd9cdde5c03b77e1432"]},"statusCode":202},"50ed637b263854bc74bee8aaecd31258246e6a23":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["746fdaa6cc12fd66-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Wed, 07 Sep 2022 13:40:04 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-09-08T00:00:00Z"],"x-message-id":["63189f3455817566900b378c"],"x-ratelimit-limit":["120"],"x-ratelimit-remaining":["116"]},"statusCode":202}}
\ No newline at end of file
+{"872ed332468f4b2427c07accf4e75f1353d64c4d":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["8ac5ca303f6738c9-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Thu, 01 Aug 2024 12:21:45 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d31536000; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2024-08-02T00:00:00Z"],"x-message-id":["66ab7dd9cdde5c03b77e1432"]},"statusCode":202},"50ed637b263854bc74bee8aaecd31258246e6a23":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["746fdaa6cc12fd66-ATH"],"content-type":["text/html; charset\u003dUTF-8"],"date":["Wed, 07 Sep 2022 13:40:04 GMT"],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-09-08T00:00:00Z"],"x-message-id":["63189f3455817566900b378c"],"x-ratelimit-limit":["120"],"x-ratelimit-remaining":["116"]},"statusCode":202},"131edff4e931fea86e4a62aef6aefd19e9f14d7a":{"body":"","headers":{":status":["202"],"cache-control":["no-cache, private"],"content-type":["text/html; charset\u003dUTF-8"],"x-message-id":["test-attachment-email-message-id"]},"statusCode":202}}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/InboundRoutesTest_AddInboundRouteTest().json b/src/test/resources/fixtures/InboundRoutesTest_AddInboundRouteTest().json
index b53fa65..b8aec1f 100644
--- a/src/test/resources/fixtures/InboundRoutesTest_AddInboundRouteTest().json
+++ b/src/test/resources/fixtures/InboundRoutesTest_AddInboundRouteTest().json
@@ -1 +1 @@
-{"9bb4c41a079fb76c9e0851c184152ba8c20379ae":{"body":"{\"data\":{\"id\":\"jpr9084z9xlw63dn\",\"name\":\"Test inbound name\",\"address\":\"emcbcwyz41fdrr7uuiz1@inbound.mailersend.net\",\"domain\":null,\"dns_checked_at\":null,\"enabled\":true,\"filters\":[{\"type\":\"match_all\",\"key\":null,\"comparer\":null,\"value\":null}],\"forwards\":[{\"type\":\"webhook\",\"value\":\"https:\\/\\/example-domain.com\",\"secret\":\"FRwZFJCkf7nbydrn0oq9uLc76USD4iaI\"}],\"mxValues\":{\"priority\":\"10\",\"target\":\"inbound.mailersend.net\"}}}","headers":{":status":["201"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["73d3b22358826f68-ATH"],"content-type":["application/json"],"date":["Fri, 19 Aug 2022 14:49:26 GMT"],"expect-ct":["max-age\u003d604800, report-uri\u003d\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-08-20T00:00:00Z"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["57"]},"statusCode":201}}
\ No newline at end of file
+{"b8a0377fe05e24ddd4159a4076934d0e3fb8dad1":{"body":"{\"data\":{\"id\":\"jpr9084z9xlw63dn\",\"name\":\"Test inbound name\",\"address\":\"emcbcwyz41fdrr7uuiz1@inbound.mailersend.net\",\"domain\":null,\"dns_checked_at\":null,\"enabled\":true,\"filters\":[{\"type\":\"match_all\",\"key\":null,\"comparer\":null,\"value\":null}],\"forwards\":[{\"type\":\"webhook\",\"value\":\"https:\\/\\/example-domain.com\",\"secret\":\"FRwZFJCkf7nbydrn0oq9uLc76USD4iaI\"}],\"mxValues\":{\"priority\":\"10\",\"target\":\"inbound.mailersend.net\"}}}","headers":{":status":["201"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["73d3b22358826f68-ATH"],"content-type":["application/json"],"date":["Fri, 19 Aug 2022 14:49:26 GMT"],"expect-ct":["max-age\u003d604800, report-uri\u003d\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-08-20T00:00:00Z"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["57"]},"statusCode":201}}
\ No newline at end of file
diff --git a/src/test/resources/fixtures/InboundRoutesTest_UpdateInboundRouteTest().json b/src/test/resources/fixtures/InboundRoutesTest_UpdateInboundRouteTest().json
index bba3e90..fe90a6c 100644
--- a/src/test/resources/fixtures/InboundRoutesTest_UpdateInboundRouteTest().json
+++ b/src/test/resources/fixtures/InboundRoutesTest_UpdateInboundRouteTest().json
@@ -1 +1 @@
-{"ce75fac589ecb966bccf60ac703836fca6e34608":{"body":"{\"data\":{\"id\":\"83yxj6ljoq4do2rm\",\"name\":\"Updated route name\",\"address\":\"vxlarh7vthhnagf3zved@inbound.mailersend.net\",\"domain\":null,\"dns_checked_at\":null,\"enabled\":true,\"filters\":[{\"type\":\"match_all\",\"key\":null,\"comparer\":null,\"value\":null}],\"forwards\":[{\"type\":\"webhook\",\"value\":\"https:\\/\\/example.com\",\"secret\":\"9IAyXyE6eAg2pre8QQfvcs3VPJSS8iaW\"}],\"mxValues\":{\"priority\":\"10\",\"target\":\"inbound.mailersend.net\"}}}","headers":{":status":["200"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["73d3bf27ad6238d6-ATH"],"content-type":["application/json"],"date":["Fri, 19 Aug 2022 14:58:19 GMT"],"expect-ct":["max-age\u003d604800, report-uri\u003d\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-08-20T00:00:00Z"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
\ No newline at end of file
+{"1aff61f4d4446105b742718ccb14f912cd075602":{"body":"{\"data\":{\"id\":\"83yxj6ljoq4do2rm\",\"name\":\"Updated route name\",\"address\":\"vxlarh7vthhnagf3zved@inbound.mailersend.net\",\"domain\":null,\"dns_checked_at\":null,\"enabled\":true,\"filters\":[{\"type\":\"match_all\",\"key\":null,\"comparer\":null,\"value\":null}],\"forwards\":[{\"type\":\"webhook\",\"value\":\"https:\\/\\/example.com\",\"secret\":\"9IAyXyE6eAg2pre8QQfvcs3VPJSS8iaW\"}],\"mxValues\":{\"priority\":\"10\",\"target\":\"inbound.mailersend.net\"}}}","headers":{":status":["200"],"cache-control":["no-cache, private"],"cf-cache-status":["DYNAMIC"],"cf-ray":["73d3bf27ad6238d6-ATH"],"content-type":["application/json"],"date":["Fri, 19 Aug 2022 14:58:19 GMT"],"expect-ct":["max-age\u003d604800, report-uri\u003d\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""],"server":["cloudflare"],"strict-transport-security":["max-age\u003d15724800; includeSubDomains"],"x-apiquota-remaining":["-1"],"x-apiquota-reset":["2022-08-20T00:00:00Z"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}
\ No newline at end of file