Skip to content

DmarcExternalReport

Stores a DMARC aggregate report received from an external source.

This object can be configured from the WebUI under Management › Reports › Inbox › DMARC

Type: DmarcReport · required

DMARC report content

Type: EmailAddress · required

Email address of the report sender

Type: String · required

Subject line of the report email

Type: EmailAddress[]

List of recipient email addresses

Type: UTCDateTime · required

When the report email was received

Type: UTCDateTime · required

When the report is scheduled to be deleted

Type: Id<Tenant>? · enterprise

Identifier for the tenant this report belongs to

The DmarcExternalReport object is available via the urn:stalwart:jmap capability.

This is a standard Foo/get method as defined in RFC 8620, Section 5.1.

This method requires the sysDmarcExternalReportGet permission.

Terminal window
curl -X POST https://mail.example.com/api \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"methodCalls": [
[
"x:DmarcExternalReport/get",
{
"ids": [
"id1"
]
},
"c1"
]
],
"using": [
"urn:ietf:params:jmap:core",
"urn:stalwart:jmap"
]
}'

This is a standard Foo/set method as defined in RFC 8620, Section 5.3.

Supports create, update, and destroy operations in a single call.

This operation requires the sysDmarcExternalReportCreate permission.

Terminal window
curl -X POST https://mail.example.com/api \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"methodCalls": [
[
"x:DmarcExternalReport/set",
{
"create": {
"new1": {
"expiresAt": "2026-01-01T00:00:00Z",
"from": "[email protected]",
"receivedAt": "2026-01-01T00:00:00Z",
"report": {
"dateRangeBegin": "2026-01-01T00:00:00Z",
"dateRangeEnd": "2026-01-01T00:00:00Z",
"email": "[email protected]",
"errors": {},
"extensions": {},
"orgName": "Example",
"policyAdkim": "relaxed",
"policyAspf": "relaxed",
"policyDisposition": "none",
"policyDomain": "Example",
"policyFailureReportingOptions": {},
"policySubdomainDisposition": "none",
"records": {},
"reportId": "Example"
},
"subject": "Example",
"to": {}
}
}
},
"c1"
]
],
"using": [
"urn:ietf:params:jmap:core",
"urn:stalwart:jmap"
]
}'

This operation requires the sysDmarcExternalReportUpdate permission.

Terminal window
curl -X POST https://mail.example.com/api \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"methodCalls": [
[
"x:DmarcExternalReport/set",
{
"update": {
"id1": {
"subject": "updated value"
}
}
},
"c1"
]
],
"using": [
"urn:ietf:params:jmap:core",
"urn:stalwart:jmap"
]
}'

This operation requires the sysDmarcExternalReportDestroy permission.

Terminal window
curl -X POST https://mail.example.com/api \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"methodCalls": [
[
"x:DmarcExternalReport/set",
{
"destroy": [
"id1"
]
},
"c1"
]
],
"using": [
"urn:ietf:params:jmap:core",
"urn:stalwart:jmap"
]
}'

This is a standard Foo/query method as defined in RFC 8620, Section 5.5.

This method requires the sysDmarcExternalReportQuery permission.

Terminal window
curl -X POST https://mail.example.com/api \
-H 'Authorization: Bearer $TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"methodCalls": [
[
"x:DmarcExternalReport/query",
{
"filter": {
"domain": "example"
}
},
"c1"
]
],
"using": [
"urn:ietf:params:jmap:core",
"urn:stalwart:jmap"
]
}'

The x:DmarcExternalReport/query filter argument accepts the following conditions (combinable with AnyOf / AllOf / Not per RFC 8620):

ConditionKind
domaintext
totalFailedSessionsinteger
totalSuccessfulSessionsinteger
expiresAtdate
memberTenantIdid of Tenant

stalwart-cli wraps the same JMAP calls. See the CLI reference for installation, authentication, and general usage.

Terminal window
stalwart-cli get DmarcExternalReport id1
Terminal window
stalwart-cli create DmarcExternalReport \
--field 'report={"dateRangeBegin":"2026-01-01T00:00:00Z","dateRangeEnd":"2026-01-01T00:00:00Z","email":"[email protected]","errors":{},"extensions":{},"orgName":"Example","policyAdkim":"relaxed","policyAspf":"relaxed","policyDisposition":"none","policyDomain":"Example","policyFailureReportingOptions":{},"policySubdomainDisposition":"none","records":{},"reportId":"Example"}' \
--field subject=Example \
--field 'to={}' \
--field receivedAt=2026-01-01T00:00:00Z \
--field expiresAt=2026-01-01T00:00:00Z
Terminal window
stalwart-cli query DmarcExternalReport
stalwart-cli query DmarcExternalReport --where domain=example
Terminal window
stalwart-cli update DmarcExternalReport id1 --field subject='updated value'
Terminal window
stalwart-cli delete DmarcExternalReport --ids id1

Content of a DMARC aggregate report.

Type: Float · default: 1.0

DMARC report format version

Type: String · required

Name of the organization that generated the report

Type: EmailAddress · required

Contact email address of the reporting organization

Type: String?

Additional contact information for the reporting organization

Type: String · required

Unique identifier for this report

Type: UTCDateTime · required

Start of the reporting period

Type: UTCDateTime · required

End of the reporting period

Type: String[]

Errors encountered during report generation

Type: String · required

Domain for which the DMARC policy is published

Type: String?

Version of the published DMARC policy

Type: DmarcAlignment · required

DKIM alignment mode specified in the policy

Type: DmarcAlignment · required

SPF alignment mode specified in the policy

Type: DmarcDisposition · required

Requested handling policy for failing messages

Type: DmarcDisposition · required

Requested handling policy for failing messages from subdomains

Type: Boolean · default: false

Whether the policy is in testing mode (pct < 100)

Type: FailureReportingOption[]

Conditions under which failure reports should be generated

Type: DmarcReportRecord[]

Aggregated authentication results grouped by source

Type: DmarcExtension[]

Custom vendor-specific extensions to the report

An aggregated authentication result record from a single source.

Type: IpAddr?

IP address of the sending mail server

Type: UnsignedInt · default: 0

Number of messages from this source matching this result

Type: DmarcActionDisposition · required

Action taken on the messages

Type: DmarcResult · required

DMARC result based on DKIM authentication

Type: DmarcResult · required

DMARC result based on SPF authentication

Type: DmarcPolicyOverrideReason[]

Reasons why the evaluated disposition differs from the published policy

Type: String?

Envelope recipient domain

Type: String · required

Envelope sender domain (MAIL FROM)

Type: String · required

Domain from the message From header

Type: DmarcDkimResult[]

DKIM authentication results for the messages

Type: DmarcSpfResult[]

SPF authentication results for the messages

Type: DmarcExtension[]

Custom vendor-specific extensions to this record

Reason for a DMARC policy override.

Type: DmarcPolicyOverride · required

Type of policy override applied

Type: String?

Additional explanation for the override

DKIM authentication result within a DMARC report record.

Type: DomainName · required

Domain that signed the message

Type: String · required

DKIM selector used for signing

Type: DkimAuthResult · required

DKIM verification result

Type: String?

Human-readable explanation of the result

SPF authentication result within a DMARC report record.

Type: DomainName · required

Domain checked for SPF

Type: SpfDomainScope · required

Which identity was checked

Type: SpfAuthResult · required

SPF verification result

Type: String?

Human-readable explanation of the result

A vendor-specific extension in a DMARC report.

Type: String · required

Extension identifier

Type: String · required

Extension content or value

ValueLabel
relaxedOrganizational domain match is sufficient
strictExact domain match is required
unspecifiedAlignment mode not specified
ValueLabel
noneNo specific action requested
quarantineTreat failing messages as suspicious
rejectReject failing messages
unspecifiedDisposition not specified
ValueLabel
allGenerate report if all authentication mechanisms fail
anyGenerate report if any authentication mechanism fails
dkimFailureGenerate report if DKIM authentication fails
spfFailureGenerate report if SPF authentication fails
ValueLabel
noneNo action taken
passMessage passed evaluation
quarantineMessage was quarantined
rejectMessage was rejected
unspecifiedDisposition not specified
ValueLabel
passAuthentication passed
failAuthentication failed
unspecifiedResult not specified
ValueLabel
ForwardedMessage was forwarded
SampledOutMessage was excluded by policy sampling (pct)
TrustedForwarderMessage came from a trusted forwarder
MailingListMessage came from a mailing list
LocalPolicyLocal policy override was applied
OtherOther reason for override
ValueLabel
noneNo DKIM signature present
passDKIM signature verified successfully
failDKIM signature verification failed
policyDKIM signature not accepted due to policy
neutralDKIM verification returned neutral
tempErrorTemporary error during verification
permErrorPermanent error in DKIM record or signature
ValueLabel
heloSPF check performed on HELO/EHLO identity
mailFromSPF check performed on MAIL FROM identity
unspecifiedScope not specified
ValueLabel
noneNo SPF record found
neutralSPF record returned neutral
passSPF check passed
failSPF check failed (hard fail)
softFailSPF check returned soft fail
tempErrorTemporary error during SPF check
permErrorPermanent error in SPF record