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}}