<?xml version="1.0" encoding="utf-8"?>
<!-- name="GENERATOR" content="github.com/mmarkdown/mmark Mmark Markdown Processor - mmark.miek.nl" -->
<rfc version="3" ipr="trust200902" docName="draft-brotman-dkim-fbl-06" submissionType="IETF" category="std" xml:lang="en" xmlns:xi="http://www.w3.org/2001/XInclude" indexInclude="true" consensus="true">

<front>
<title abbrev="DKIM-FBL">Email Feedback Reports for DKIM Signers</title><seriesInfo value="draft-brotman-dkim-fbl-06" stream="IETF" status="standard" name="RFC"></seriesInfo>
<author initials="A." surname="Brotman" fullname="Alex Brotman"><organization>Comcast, Inc</organization><address><postal><street></street>
</postal><email>alex_brotman@comcast.com</email>
</address></author><date year="2026" month="January" day="6"></date>
<area>Applications</area>
<workgroup></workgroup>

<abstract>
<t>Mechanism to discover a destination used to deliver user-supplied FBL reports
to an original DKIM signer or other responsible parties.  This allows the
reporting entity to deliver reports for each party which has affixed
a validating DKIM signature.  The discovery is made via DNS and the record is
constructed using items within the DKIM signature in the message.</t>
</abstract>

</front>

<middle>

<section anchor="introduction"><name>Introduction</name>
<t>Historically, Feedback Loops (FBL), typically comprised of False Positive (FP)
and False Negative (FN) reports, have allowed users the ability to inform
their Mailbox Provider (MBP) that they disagree with a message's placement
in the Inbox or Spam folder. In some situations, an MBP may then forward that
feedback directly, or via an intermediary, to the original source system of
that message.  Traditionally, this source system identified via a
registration system, typically tying a set of IPs or DKIM-based domains to
a specific reporting location.</t>
<t>This document is meant to create a method by which a MBP can discover how to
report feedback in the form of an FBL.  By utilizing this new method, and
allowing reporters to discover the destination and reporting preferences on
their own, this could reduce friction getting FBLs to the original DKIM
signer(s).</t>
<t>This is <strong>not</strong> meant to document how a MBP can provide feedback about
DKIM-related issues.</t>
</section>

<section anchor="discovery-using-dns"><name>Discovery using DNS</name>
<t>There are alternative approaches for discovering the feedback information
proposed. This document describes a method for using DNS to discover a feedback
address by utilizing the DKIM signature(s) within a message itself.</t>
<t>The advantage of the DNS approach is that it can be changed after messages
are delivered, allowing for old reports to be processed after migrating to a
new report processing provider. It also avoids common problems with modifying
headers of messages that are already signed by another DKIM signature.</t>
<t>Email service providers and intermediaries, which have a shared responsibility
with an upstream sender, will commonly add their own DKIM signatures to the
messages, thus resulting in the message having two signatures in different DKIM
d= domains. Dual-signed messages will result in feedback going to the location
specified in the DNS for both domains. Thus there is no reason to modify any
message headers and potentially break the original DKIM signature.</t>
</section>

<section anchor="dns-record-location"><name>DNS Record Location</name>
<t>The record will combine a label with the &quot;d&quot; value from the DKIM signature
in the message being sent, optionally using a DNS wildcard (* character).
Using this abbreviated DKIM-Signature as an example:</t>
<t>DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=example.org; s=selector1;
	t=1767558375; bh=8Fgi2BuhJ2eE9KTZlip4By07JDsm5vSu2HdVM=;
	h=From:Reply-To:To:Subject:Date;
	b=6DZuSCPnTrFCeEtRSOu8RRuuiV9vw...==</t>
<t>Such as the case where &quot;d=example.org&quot;, the record would be located at:</t>
<t>_feedback._domainkey.example.org</t>
<t>or</t>
<t>*._feedback._domainkey.example.org</t>
<t>Either of the records above would result in all reports for all selectors
going to the declared &quot;ra&quot; address.  This is the default action, unless a
selector-based record is created (described below).</t>
<t>If the reporting destination needs to be different for individual DKIM
selectors, each selector will need a DNS record with a value combined with a
label with the &quot;s=&quot; value from the DKIM signature in the message being sent.
Such as the case where &quot;d=example.org&quot;, and &quot;s=selector1&quot;, for example:</t>
<t>selector1._feedback._domainkey.example.org</t>
<t>By including the selector, this allows a domain to be able to segment the
feedback to various report processing providers.  It is possible to have a
wildcard record, as well as a specific record.  Doing so may be ideal as it
allows for there to be a fallback if a selector is overlooked during
configuration.</t>
<t><em>The need for selector level feedback still needs to be assessed.</em></t>
<t>A record will be valid only for the exact &quot;d=&quot; domain that is in the DNS label,
and will not apply to sub-domains.</t>
<t>All domain owners that want to ensure they receive all feedback for a given
domain should, at a minimum, publish a record at the following location
as a catch-all:</t>
<t>_feedback._domainkey.example.org</t>
<t>The DNS entry will contain a TXT record described below.</t>
</section>

<section anchor="dns-record-format"><name>DNS Record Format</name>
<t>The DNS record MUST contain the information necessary for a report generator
to send the feedback to the proper location.</t>
<t>v: A string identifying the record.  The value must be &quot;DKIMRFBLv1&quot;</t>
<t>ra: An address destination for reports.  The address should match the
    format defined in <xref target="RFC5321"></xref>. If there is a &quot;rfr&quot; entry, the &quot;ra&quot; may be
    omitted. If there is more than one target address, the entries must be
    separated by a comma (&quot;,&quot;). The destination MUST use a classification
    of &quot;mailto&quot; or &quot;https&quot;, indicating the receipt transfer methods supported
    by the DKIM signer. This MAY coexist with the &quot;rfr&quot; attribute.</t>
<t>rfr: An optional field to refer the report generator(s) to another DNS entry.
     This option MAY coexist with the &quot;ra&quot; tag. (NOTE: there should probably be
     a limit on how many rfr will be followed)</t>
<t>c: Content flag. If set to 'n', the reporting entity SHOULD remove all
   content beyond the headers of the original message that is being reported.
   The default is &quot;n&quot;. See notes about content below.</t>
<t>h: The header by which the signer can identify the recipient, sender, and
   campaign.  If a report generator is trying to create a minimalistic report,
   this would be the minimum amount of information to properly act on the
   report.  This field is OPTIONAL, and MUST contain only one attribute.</t>
<t>hp: The header by which the signer can only identify the campaign.<br />
   If present, the report generator may use the hp header instead of the
   h header if the recipient needs to remain private and there is no expectation
   of future sending to the recipient to be suppressed.<br />
   This field is OPTIONAL, and MUST contain only one attribute.</t>

<section anchor="dkim-requirements"><name>DKIM Requirements</name>
<t>If a sender utilizes the <tt>h</tt> or <tt>hp</tt> attributes in their DNS record, those
fields MUST be covered by the DKIM signature that is requesting the report.
If the header is not signed by the proper requester (or not valid), the
receiver SHOULD refuse to generate any reports for those related messages.</t>
</section>

<section anchor="content-flag"><name>Content flag</name>
<t>It should be noted that not all MBPs will honor the 'c' flag, and may only
send reports without full content.  Entities requesting reports SHOULD be
able to handle reports with and without content.</t>
</section>

<section anchor="examples"><name>Examples</name>
<t>_feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:reporting@feedback.example.org&quot;">mailto:reporting@feedback.example.org"</eref></t>
<t>contact._feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;rfr=_feedback._domainkey.example.org&quot;</t>
<t>contact._feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:fbl@example.org;rfr=_feedback._domainkey.example.org&quot;">mailto:fbl@example.org;rfr=_feedback._domainkey.example.org"</eref></t>
<t>*._feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:other_fbl@example.org&quot;">mailto:other_fbl@example.org"</eref></t>
<t>_feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;c=n;ra=<eref target="https://ra.example.org/reports;h=SendingIdentifier&quot;">https://ra.example.org/reports;h=SendingIdentifier"</eref></t>
<t>_feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:fbl@example.org;hp=Campaign-Id;c=n&quot;">mailto:fbl@example.org;hp=Campaign-Id;c=n"</eref></t>
<t>_feedback.domainkey.sender.com TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:fbl@other.com;h=SendingIdentifier;hp=Campaign-Id;c=y&quot;">mailto:fbl@other.com;h=SendingIdentifier;hp=Campaign-Id;c=y"</eref></t>
</section>
</section>

<section anchor="report-contents"><name>Report Contents</name>
<t>The reports are meant to be mimialistic, and include the minimum information
necessary for the signing entity to determine how to identify the source
of the message.</t>
<t>Additionally, the contents of the report itself MAY be base64-encoded.</t>
<t>NOTE: Originally, there was a section here to be ARF/XARF.  That has been
removed.</t>
</section>

<section anchor="content-flag-1"><name>Content Flag</name>
<t>Some DKIM signers may prefer that they only receive headers from a reporter.
The reporter SHOULD attempt to adhere to those wishes of the signer.  In a
situation where c=n and <tt>h</tt> has a value, the report generator would send a
report with only that single header. if the 'hp' tag has a value then the
report generator MAY use that value instead of the 'h' tag if the recipient's
privacy needs to be preserved at the expense of future sending possibly not
being suppressed to that address.</t>
</section>

<section anchor="delivery-methods"><name>Delivery Methods</name>
<t>Reports MUST be sent to the address(es) specified by the &quot;ra&quot; tag.  If the
declaration has a &quot;rfr&quot; tag, those recipient address(es) MUST also receive
the reports.</t>

<section anchor="mailto"><name>mailto</name>
<t>Refer to <xref target="RFC5965"></xref></t>
</section>

<section anchor="https"><name>https</name>
<t>A DKIM signer may specify that they wish to receive reports via HTTPS. When
doing so, the reporter should continue to use the format specified by the rest
of the declaration.</t>
<t>NOTE: Consider if HTTPS should be supported, based on historical usage patterns
	for other similar mechanisms</t>
<t>The report generator SHOULD follow redirects.</t>
<t>The HTTPS method MUST be POST.</t>
<t>HTTPS GET requests to the URL MUST provide easy to follow instructions for
users to report complaints.</t>
<t>The report generator SHOULD NOT remove parameters from the URL before
submitting the report unless the 'hp' tag is specified. If the 'hp' tag is
specified then the parameters can be removed if the report generator needs to
preserve the privacy of the recipient at the expense of the report not
causing suppressed sending to that recipient in the future.</t>
<t>DNS record</t>

<artwork>   v=DKIMRFBLv1;c=n;ra=https://ra.example.org/dkim-fbl?track=xzy;h=Message-Id;hp=Feedback-Id
</artwork>
<t>Header in Email</t>

<artwork>   DKIM-FBL: &lt;https://ra.example.com/reports&gt;
   Message-Id: opaque@example.com
   Feedback-Id: opaque
</artwork>
<t>Resulting POST request</t>

<artwork>   POST /dkim-fbl?optional=opaquePart HTTP/1.1
   Host: ra.example.com
   Content-Type: application/x-www-form-urlencoded
   Feedback-Type: abuse
   Content-Length: 26
</artwork>

<section anchor="https-feedback-type-header"><name>https Feedback-Type Header</name>
<t>A reporter MAY include a HTTP header that denotes which report type is being
delivered.  If used, the header MUST be titled &quot;Feedback-Type&quot;, and adhere
to the definition referenced in <xref target="RFC5965"></xref> section 7.3 or the associated IANA
declarations.  If this header is absent, the Feedback-Type MUST be
considered &quot;abuse&quot;.</t>
</section>
</section>
</section>

<section anchor="verifying-external-destinations"><name>Verifying External Destinations</name>
<t>In order to limit the possibility of misdirected reports, if the receiving
entity domain does not align to the d= of the DKIM signature, there MUST be a
DNS record to verify the external destination.</t>
<t>Domain alignment is determined by the logic defined by [DMARCbis]. Domain
alignment applies to domain of the email address in the 'ra' tag if the 'ra'
tag is 'mailto'. Domain alignment applies to the domain defined in the
URI of the header referenced by the 'ra' tag if the 'f' tag is 'https'</t>
<t>Consider the record:</t>
<t>foo._feedback._domainkey.example.org TXT <br />
  &quot;v=DKIMRFBLv1;ra=<eref target="mailto:reporting@othersite.com&quot;">mailto:reporting@othersite.com"</eref></t>
<t>In order for &quot;othersite.com&quot; to receive reports for this DKIM signature, a
record must exist at specified location, and contain a specified value.</t>

<ol spacing="compact">
<li>Using the domain of the destination</li>
<li>Prepend &quot;_report._feedback&quot;</li>
<li>Prepend the values from <tt>d=</tt> and <tt>s=</tt> from the original signature.</li>
<li>Ensure the value is set to &quot;v=DKIMRFBLv1&quot;</li>
</ol>
<t>foo.example.org._report._feedback.othersite.com TXT &quot;v=DKIMRFBLv1&quot;</t>
<t>If the feedback receiver is comfortable with receiving feedback for all
selectors within a domain, then they may omit the <tt>s=</tt> value from the
DNS record location. The record would be named:</t>
<t>example.org._report._feedback.othersite.com TXT &quot;v=DKIMRFBLv1&quot;</t>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>

<section anchor="feedback-to-malicious-senders"><name>Feedback to Malicious Senders</name>
<t>There is some concern that a MBP may provide some advantage or useful
information to a malicious entity by providing them with FBL data.  Each
MBP should use their own judgement when deciding where to send reports. It is
possible that an attacker could use this information to attempt to bypass
anti-spam filters, or to validate a recipient at a given site.</t>
</section>

<section anchor="report-contents-for-arf"><name>Report Contents for ARF</name>
<t>Noting in <xref target="RFC5965"></xref> section 2.g, there should be enough information for most
senders to process a complaint without the content of the message.  While the
<tt>c</tt> flag allows the report receiver to state that they do not wish to receive
content, the report generator, as per <xref target="RFC5965"></xref>, may not need to include that
information, regardless of the flag settings. Not all report generators will
honor the <tt>c</tt> flag, may redact content based on local policies.  A report
receiver should be prepared to receive reports with and without content.</t>
</section>
</section>

<section anchor="other-considerations"><name>Other Considerations</name>

<section anchor="supplying-fp-reports"><name>Supplying FP Reports</name>
<t>It is at the discretion of the report generator as to whether they supply False
Positive reports, or aggregate information, to the report requester.</t>
</section>

<section anchor="site-requirements"><name>Site Requirements</name>
<t>A report generator may place some requirements on the sender in order to be
eligible to receive reports. This could include something such as a DMARC
policy requirements, TLS usage, or some level of reputation.</t>
</section>

<section anchor="unaligned-domains"><name>Unaligned Domains</name>
<t>A report generator may decide that they would only like to provide reports
to the aligned signer in a message.  That is their discretion.</t>
</section>
</section>

<section anchor="contributors"><name>Contributors</name>
</section>

<section anchor="notes"><name>Notes</name>
</section>

<section anchor="appendix"><name>Appendix</name>

<section anchor="samples"><name>Samples</name>

<section anchor="sample-message"><name>Sample message</name>
<t>DKIM-Signature: d=example.com;s=Selector1;h=From:To:Subject:Message-Id:Campaign-Id:Date
From: &quot;Sender&quot; <eref target="mailto:marketing@example.com">marketing@example.com</eref>
To: &quot;Customer&quot; <eref target="mailto:recipient@example.net">recipient@example.net</eref>
Subject: SubjectHere
Message-Id: <eref target="mailto:awav4w4vaw.aw4473737bab.AWAe@sender">awav4w4vaw.aw4473737bab.AWAe@sender</eref>
Campaign-Id: 20240314a_Sender
FBL-Message-Id: fgjm7Bbbse56b.Sender.recipient.example.net
Date: March 24th, 2024 12:34.000UTC</t>
<t>Click here for stuff
&lt;EOM&gt;</t>
</section>

<section anchor="sample-dns-and-reports"><name>Sample DNS and Reports</name>

<section anchor="content-requested"><name>Content-requested</name>
<t>DNS: v=DKIMRFBLv1;ra=<eref target="mailto:fbl@example.com;c=y">mailto:fbl@example.com;c=y</eref></t>
</section>

<section anchor="no-content-requested"><name>No Content Requested</name>
<t>DNS: v=DKIMRFBLv1;ra=<eref target="mailto:fbl@example.com;c=n;h=Campaign-Id">mailto:fbl@example.com;c=n;h=Campaign-Id</eref></t>
</section>

<section anchor="no-content-summary-only"><name>No Content, Summary only</name>
<t>DNS: v=DKIMRFBLv1;ra=<eref target="mailto:fbl@example.com;c=n;hp=FBL-Message-Id">mailto:fbl@example.com;c=n;hp=FBL-Message-Id</eref></t>
<t>Nothing should be delivered, as the FBL-Message-Id is not signed</t>
</section>
</section>
</section>
</section>

<section anchor="references"><name>References</name>
<t>[DMARCbis] <eref target="https://datatracker.ietf.org/doc/draft-ietf-dmarc-dmarcbis/">https://datatracker.ietf.org/doc/draft-ietf-dmarc-dmarcbis/</eref></t>
</section>

</middle>

<back>
<references><name>Normative References</name>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5321.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5965.xml"/>
</references>

</back>

</rfc>
