Skip to content

Add support for Email Logs API#50

Open
mklocek wants to merge 1 commit intomainfrom
email-logs-api
Open

Add support for Email Logs API#50
mklocek wants to merge 1 commit intomainfrom
email-logs-api

Conversation

@mklocek
Copy link
Contributor

@mklocek mklocek commented Mar 12, 2026

Motivation

Add support for Email Logs API

Summary by CodeRabbit

  • New Features

    • Added Email Logs API to retrieve and filter sent email logs by status, recipient, sender, date, and other criteria.
    • Added support for tracking email events including delivery, opens, clicks, bounces, and unsubscribes.
    • Added pagination support for managing large result sets when listing logs.
  • Documentation

    • Added Email Logs example and API reference documentation.

@coderabbitai
Copy link

coderabbitai bot commented Mar 12, 2026

Warning

Rate limit exceeded

@mklocek has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 20 minutes and 1 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: edf147b9-86bf-4648-9769-7f914f1f735d

📥 Commits

Reviewing files that changed from the base of the PR and between 34a55a8 and a651aac.

📒 Files selected for processing (42)
  • README.md
  • examples/java/io/mailtrap/examples/emaillogs/EmailLogsExample.java
  • src/main/java/io/mailtrap/api/emaillogs/EmailLogs.java
  • src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java
  • src/main/java/io/mailtrap/client/api/MailtrapEmailSendingApi.java
  • src/main/java/io/mailtrap/factory/MailtrapClientFactory.java
  • src/main/java/io/mailtrap/model/request/emaillogs/EmailLogFilter.java
  • src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterCiString.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterEvents.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterExactString.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterNumber.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterOptionalString.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingDomainId.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingStream.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterStatus.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterString.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessage.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventClick.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventDelivery.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventOpen.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventReject.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSoftBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSpam.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSuspension.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventUnsubscribe.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageSummary.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsClick.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsDelivery.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsOpen.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsReject.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsSpam.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsUnsubscribe.java
  • src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java
  • src/test/java/io/mailtrap/api/emaillogs/EmailLogsImplTest.java
  • src/test/resources/api/emaillogs/getEmailLogMessageResponse.json
  • src/test/resources/api/emaillogs/listEmailLogsResponse.json
📝 Walkthrough

Walkthrough

Introduces Email Logs API support to the Mailtrap Java client library, adding request/response models, comprehensive filtering capabilities, list and retrieval operations, factory integration, example code, and unit tests for email log management.

Changes

Cohort / File(s) Summary
API Interface & Implementation
src/main/java/io/mailtrap/api/emaillogs/EmailLogs.java, src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java
New EmailLogs interface defining list() and get() operations; EmailLogsImpl provides implementation with query string building from filters, parameter encoding, and input validation for message IDs.
Request Models - Filters
src/main/java/io/mailtrap/model/request/emaillogs/EmailLogFilter.java, src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java, src/main/java/io/mailtrap/model/request/emaillogs/Filter*.java
New filter interface and 12 filter implementations (To, From, Subject, Status, Events, ClientIp, SendingIp, MandatoryText, Number, Exact, SendingDomainId, SendingStream) with operator enums and value handling; EmailLogsListFilters aggregates all filter types and date range parameters.
Response Models - Event Types
src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java, src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent*.java
Abstract base EmailLogMessageEvent with polymorphic Jackson configuration; 9 concrete event types (Delivery, Open, Click, SoftBounce, Bounce, Spam, Unsubscribe, Suspension, Reject) extending base with specific EventDetails types.
Response Models - Message & Details
src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessage.java, src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageSummary.java, src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java, src/main/java/io/mailtrap/model/response/emaillogs/EventDetails*.java
EmailLogMessage (full message details with events), EmailLogMessageSummary (summary variant), EmailLogsListResponse (paginated list response); 7 EventDetails classes for event-specific data with JSON property mappings.
Response Models - Enums
src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java
New enum representing email statuses (DELIVERED, NOT\_DELIVERED, ENQUEUED, OPTED\_OUT) with JSON serialization/deserialization via @JsonValue and @JsonCreator.
Client Integration
src/main/java/io/mailtrap/client/api/MailtrapEmailSendingApi.java, src/main/java/io/mailtrap/factory/MailtrapClientFactory.java
Added emailLogs field and fluent getter to MailtrapEmailSendingApi; updated constructor signature to accept EmailLogsImpl; wired EmailLogsImpl instantiation in factory.
Example & Documentation
README.md, examples/java/io/mailtrap/examples/emaillogs/EmailLogsExample.java
Added README entries for Email Logs under Sending API examples and API Reference; new example demonstrating client configuration, filter creation, list and get operations.
Tests & Resources
src/test/java/io/mailtrap/api/emaillogs/EmailLogsImplTest.java, src/test/resources/api/emaillogs/listEmailLogsResponse.json, src/test/resources/api/emaillogs/getEmailLogMessageResponse.json
Comprehensive unit tests covering list operations (no params, with search-after cursor, with filters) and get operations (valid ID, null/blank ID validation); JSON fixtures for list and single message responses.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • #35 — Similar pattern of adding a new API component (Suppressions) with factory wiring into MailtrapEmailSendingApi.
  • #39 — Modifies MailtrapClientFactory and related API wiring patterns.

Suggested reviewers

  • vittorius
  • piobeny

Poem

🐰 Logs now flow like email streams so bright,
With filters fine-tuned to show just right—
Status, events, and details divine,
A carrot-patch of data, all mine! 📧✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Description check ⚠️ Warning The pull request description is severely incomplete, containing only a brief motivation statement without required sections like Changes, How to test, or Images and GIFs. Complete the PR description by adding: a detailed list of Changes made, How to test instructions with checkboxes, and the Images/GIFs comparison table section.
Docstring Coverage ⚠️ Warning Docstring coverage is 10.17% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed The pull request title clearly summarizes the main change: adding support for the Email Logs API, which aligns with the extensive implementation across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch email-logs-api
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@mklocek
Copy link
Contributor Author

mklocek commented Mar 12, 2026

@coderabbitai review

@coderabbitai
Copy link

coderabbitai bot commented Mar 12, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (7)
src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingDomainId.java (1)

13-31: Consider extracting a common base class for duplicate filter logic.

FilterSendingDomainId and FilterExact (and likely other Filter* classes) share identical Operator enums and implementation logic. While the current approach provides clear type distinction for each filter field, you could reduce duplication by extracting a generic base class or using a shared enum.

This is an optional improvement—the current design is valid and provides explicit typing for each filter category.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingDomainId.java`
around lines 13 - 31, FilterSendingDomainId duplicates the Operator enum and
same operator/value logic found in FilterExact and other Filter* classes;
extract a common abstract base (e.g., AbstractEmailLogFilter) that defines the
Operator enum, private Operator operator and Object value fields, and implements
getOperatorString() and getValue(), then have FilterSendingDomainId and
FilterExact extend that base and remove their local Operator, operator, value,
getOperatorString, and getValue declarations to eliminate duplication while
preserving type-specific class names.
src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java (1)

11-12: Consider defensive initialization for the messages list.

The messages field could be null if the JSON response omits it, potentially causing NullPointerException when callers iterate over it. Other models in this PR (e.g., EmailLogMessageSummary.getCustomVariables()) provide null-safe accessors.

♻️ Optional: Add null-safe getter or initialize the field
 `@JsonProperty`("messages")
-private List<EmailLogMessageSummary> messages;
+private List<EmailLogMessageSummary> messages = new ArrayList<>();

Or add a null-safe getter:

public List<EmailLogMessageSummary> getMessages() {
    return messages == null ? Collections.emptyList() : messages;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java`
around lines 11 - 12, The messages field in EmailLogsListResponse can be null if
omitted in JSON, risking NPEs; make access null-safe by either initializing the
field to an empty list (set messages = new ArrayList<>() by default) or add a
null-safe accessor getMessages() that returns Collections.emptyList() when
messages is null; update any callers to use EmailLogsListResponse.getMessages()
if adding the getter.
src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java (1)

26-34: Consider adding an UNKNOWN fallback for forward compatibility.

If the Mailtrap API introduces a new status value in the future, fromValue() will throw an IllegalArgumentException causing deserialization to fail. Consider adding an UNKNOWN enum constant as a fallback.

♻️ Optional: Add UNKNOWN fallback
 public enum MessageStatus {
     DELIVERED("delivered"),
     NOT_DELIVERED("not_delivered"),
     ENQUEUED("enqueued"),
-    OPTED_OUT("opted_out");
+    OPTED_OUT("opted_out"),
+    UNKNOWN("unknown");

     // ... constructor and getValue() ...

     `@JsonCreator`
     public static MessageStatus fromValue(String value) {
         for (MessageStatus status : MessageStatus.values()) {
             if (status.value.equalsIgnoreCase(value)) {
                 return status;
             }
         }
-        throw new IllegalArgumentException("Unknown MessageStatus value: " + value);
+        return UNKNOWN;
     }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java` around
lines 26 - 34, The fromValue(String) deserializer in MessageStatus currently
throws IllegalArgumentException for unknown values and should be made
forward-compatible: add an UNKNOWN enum constant to MessageStatus and update the
MessageStatus.fromValue(String value) method to return MessageStatus.UNKNOWN
when no match (preserving case-insensitive comparison) instead of throwing;
ensure any existing usages that rely on exceptions are updated to handle the
UNKNOWN fallback if needed.
src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent.java (1)

23-24: Consider making createdAt field private for encapsulation.

The field is declared public but has explicit getter/setter methods defined. For consistency with standard JavaBean conventions and encapsulation, this should be private.

♻️ Suggested fix
     `@JsonProperty`("created_at")
-    public OffsetDateTime createdAt;
+    private OffsetDateTime createdAt;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent.java`
around lines 23 - 24, The createdAt field in class EmailLogMessageEvent is
declared public but already has getter/setter methods; change the field
visibility to private to follow JavaBean encapsulation conventions (update the
declaration of createdAt to private OffsetDateTime createdAt) and keep the
existing getCreatedAt() and setCreatedAt(...) methods so external access goes
through those accessors.
src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java (1)

31-39: Add null check in fromValue to prevent potential NPE.

If fromValue(null) is called, type.value.equalsIgnoreCase(value) will throw a NullPointerException. While Jackson typically won't pass null here, a defensive check improves robustness.

🛡️ Suggested fix
     `@JsonCreator`
     public static EmailLogEventType fromValue(String value) {
+        if (value == null) {
+            throw new IllegalArgumentException("EmailLogEventType value cannot be null");
+        }
         for (EmailLogEventType type : EmailLogEventType.values()) {
             if (type.value.equalsIgnoreCase(value)) {
                 return type;
             }
         }
         throw new IllegalArgumentException("Unknown EmailLogEventType value: " + value);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java`
around lines 31 - 39, The fromValue method in EmailLogEventType (annotated with
`@JsonCreator`) can NPE when called with null because
type.value.equalsIgnoreCase(value) is invoked; add a defensive null check at the
start of fromValue (e.g. if value == null) and fail fast by throwing an
IllegalArgumentException with a clear message (or handle null explicitly), then
proceed with the existing loop that uses equalsIgnoreCase; this ensures no NPE
and preserves current behavior when non-null values are provided.
src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java (1)

19-20: Consider using OffsetDateTime for date filters.

Using String for sentAfter and sentBefore puts the burden of ISO 8601 formatting on the caller. Consider using OffsetDateTime for compile-time type safety and letting the implementation format it, similar to how EmailLogMessage.sentAt uses OffsetDateTime.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java`
around lines 19 - 20, Change the sentAfter and sentBefore fields in
EmailLogsListFilters from String to java.time.OffsetDateTime (like
EmailLogMessage.sentAt) and update their getters/setters and constructors
accordingly; ensure any serialization or query-building code that consumes
EmailLogsListFilters formats these OffsetDateTime values to the expected ISO
8601 string (or lets your JSON mapper handle it) so callers pass typed datetimes
instead of raw strings.
src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java (1)

97-105: Minor: redundant String.valueOf call.

On Line 92, v is already a String from toValueList(), so the String.valueOf(v) is redundant.

♻️ Proposed simplification
         if (value != null) {
             for (final String v : toValueList(value)) {
-                params.add(enc("filters[" + field + "][value]") + "=" + enc(String.valueOf(v)));
+                params.add(enc("filters[" + field + "][value]") + "=" + enc(v));
             }
         }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java` around lines 97 -
105, The map operation in toValueList unnecessarily calls String.valueOf on
elements that are already Strings; update the stream mapping in toValueList (the
lambda variable v) to cast to String instead of calling String.valueOf (e.g.,
replace map(String::valueOf) with map(v -> (String) v)) so you avoid the
redundant conversion while keeping the singletonList branch unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java`:
- Around line 37-44: EmailLogsImpl.get currently interpolates sendingMessageId
directly into the path which can break URLs for IDs containing reserved
characters; update the method to URL-encode sendingMessageId before building the
url (e.g., use URLEncoder.encode(sendingMessageId, StandardCharsets.UTF_8) or an
equivalent encoder) and use the encoded value in the String.format call so the
final url variable is safe for httpClient.get.

In `@src/main/java/io/mailtrap/model/request/emaillogs/FilterSubject.java`:
- Around line 19-29: FilterSubject currently returns its raw value even for
valueless operators; update it so getValue() returns null when operator is
Operator.empty or Operator.not_empty to suppress the field during serialization,
and also add defensive validation in the FilterSubject constructor or
setValue(...) to throw an IllegalArgumentException if a non-null value is
provided while operator is Operator.empty or Operator.not_empty, so invalid
instances cannot be constructed; refer to the FilterSubject class, getValue(),
operator field, and the Operator.empty / Operator.not_empty enum members when
making these changes.

In `@src/main/java/io/mailtrap/model/request/emaillogs/FilterTo.java`:
- Around line 20-31: The FilterTo class currently allows any Object in the value
field which lets callers pass collections for unsupported operators; update the
validation so collections/arrays are only accepted when operator is ci_equal or
ci_not_equal. In FilterTo (check in the setter or in getValue()), detect if
value is a Collection or array and if so throw an IllegalArgumentException when
operator is null or operator.name() is not "ci_equal" or "ci_not_equal"; allow
null or single values for all operators still. Reference: FilterTo.value,
FilterTo.getValue(), and Operator (operator.name()) when implementing this
guard.

---

Nitpick comments:
In `@src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java`:
- Around line 97-105: The map operation in toValueList unnecessarily calls
String.valueOf on elements that are already Strings; update the stream mapping
in toValueList (the lambda variable v) to cast to String instead of calling
String.valueOf (e.g., replace map(String::valueOf) with map(v -> (String) v)) so
you avoid the redundant conversion while keeping the singletonList branch
unchanged.

In `@src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java`:
- Around line 19-20: Change the sentAfter and sentBefore fields in
EmailLogsListFilters from String to java.time.OffsetDateTime (like
EmailLogMessage.sentAt) and update their getters/setters and constructors
accordingly; ensure any serialization or query-building code that consumes
EmailLogsListFilters formats these OffsetDateTime values to the expected ISO
8601 string (or lets your JSON mapper handle it) so callers pass typed datetimes
instead of raw strings.

In
`@src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingDomainId.java`:
- Around line 13-31: FilterSendingDomainId duplicates the Operator enum and same
operator/value logic found in FilterExact and other Filter* classes; extract a
common abstract base (e.g., AbstractEmailLogFilter) that defines the Operator
enum, private Operator operator and Object value fields, and implements
getOperatorString() and getValue(), then have FilterSendingDomainId and
FilterExact extend that base and remove their local Operator, operator, value,
getOperatorString, and getValue declarations to eliminate duplication while
preserving type-specific class names.

In `@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java`:
- Around line 31-39: The fromValue method in EmailLogEventType (annotated with
`@JsonCreator`) can NPE when called with null because
type.value.equalsIgnoreCase(value) is invoked; add a defensive null check at the
start of fromValue (e.g. if value == null) and fail fast by throwing an
IllegalArgumentException with a clear message (or handle null explicitly), then
proceed with the existing loop that uses equalsIgnoreCase; this ensures no NPE
and preserves current behavior when non-null values are provided.

In
`@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent.java`:
- Around line 23-24: The createdAt field in class EmailLogMessageEvent is
declared public but already has getter/setter methods; change the field
visibility to private to follow JavaBean encapsulation conventions (update the
declaration of createdAt to private OffsetDateTime createdAt) and keep the
existing getCreatedAt() and setCreatedAt(...) methods so external access goes
through those accessors.

In
`@src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java`:
- Around line 11-12: The messages field in EmailLogsListResponse can be null if
omitted in JSON, risking NPEs; make access null-safe by either initializing the
field to an empty list (set messages = new ArrayList<>() by default) or add a
null-safe accessor getMessages() that returns Collections.emptyList() when
messages is null; update any callers to use EmailLogsListResponse.getMessages()
if adding the getter.

In `@src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java`:
- Around line 26-34: The fromValue(String) deserializer in MessageStatus
currently throws IllegalArgumentException for unknown values and should be made
forward-compatible: add an UNKNOWN enum constant to MessageStatus and update the
MessageStatus.fromValue(String value) method to return MessageStatus.UNKNOWN
when no match (preserving case-insensitive comparison) instead of throwing;
ensure any existing usages that rely on exceptions are updated to handle the
UNKNOWN fallback if needed.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4909d125-e413-4670-b812-fe21f5743e54

📥 Commits

Reviewing files that changed from the base of the PR and between 1136e25 and 34a55a8.

📒 Files selected for processing (45)
  • README.md
  • examples/java/io/mailtrap/examples/emaillogs/EmailLogsExample.java
  • src/main/java/io/mailtrap/api/emaillogs/EmailLogs.java
  • src/main/java/io/mailtrap/api/emaillogs/EmailLogsImpl.java
  • src/main/java/io/mailtrap/client/api/MailtrapEmailSendingApi.java
  • src/main/java/io/mailtrap/factory/MailtrapClientFactory.java
  • src/main/java/io/mailtrap/model/request/emaillogs/EmailLogFilter.java
  • src/main/java/io/mailtrap/model/request/emaillogs/EmailLogsListFilters.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterClientIp.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterEvents.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterExact.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterFrom.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterMandatoryText.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterNumber.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingDomainId.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingIp.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSendingStream.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterStatus.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterSubject.java
  • src/main/java/io/mailtrap/model/request/emaillogs/FilterTo.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogEventType.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessage.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEvent.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventClick.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventDelivery.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventOpen.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventReject.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSoftBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSpam.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventSuspension.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageEventUnsubscribe.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogMessageSummary.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EmailLogsListResponse.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsBounce.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsClick.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsDelivery.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsOpen.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsReject.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsSpam.java
  • src/main/java/io/mailtrap/model/response/emaillogs/EventDetailsUnsubscribe.java
  • src/main/java/io/mailtrap/model/response/emaillogs/MessageStatus.java
  • src/test/java/io/mailtrap/api/emaillogs/EmailLogsImplTest.java
  • src/test/resources/api/emaillogs/getEmailLogMessageResponse.json
  • src/test/resources/api/emaillogs/listEmailLogsResponse.json

@mklocek mklocek force-pushed the email-logs-api branch 2 times, most recently from 616ee9c to 428b090 Compare March 13, 2026 09:02
@mklocek mklocek marked this pull request as ready for review March 13, 2026 09:32
@mklocek
Copy link
Contributor Author

mklocek commented Mar 13, 2026

@coderabbitai review

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants