diff --git a/README.md b/README.md
index a26fd8a..55205b9 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)
@@ -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/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..06397a5
--- /dev/null
+++ b/src/test/resources/fixtures/DmarcMonitoringTest_UpdateMonitorTest().json
@@ -0,0 +1 @@
+{"d139b5604c4faa1f9dfc7e8626a608048b23ceb1":{"body":"{\"data\":{\"id\":\"dmarc-monitor-id-test\",\"dmarc_record\":\"v=DMARC1; p=none;\",\"wanted_dmarc_record\":\"v=DMARC1; p=reject; rua=mailto:dmarc@example.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-15T10:00:00.000000Z\"}}","headers":{":status":["200"],"content-type":["application/json"],"x-ratelimit-limit":["60"],"x-ratelimit-remaining":["59"]},"statusCode":200}}