
=head1 Data Structure

   feedback => {
      version          => 1,  # decimal
      report_metadata  => {                # info about DMARC reporter
          report_id          => string
          org_name           => 'Art Farm',
          email              => 'no-reply@theartfarm.com',
          extra_contact_info => string     # min 0
          date_range         => {
              begin          => epoch time,
              end            => epoch time,
          },
          error              => string,   # min 0, max unbounded
      },
      policy_published => {
          domain =>   string
          adkim  =>   r, s
          aspf   =>   r, s
          p      =>   none, quarantine, reject
          sp     =>   none, quarantine, reject
          pct    =>   integer
      },
      record   => {
         row => {
            source_ip     =>   # IPAddress
            count         =>   # integer
            policy_evaluated => {       # min=0
               disposition =>           # none, quarantine, reject
               dkim        =>           # pass, fail
               spf         =>           # pass, fail
               reason      => {         # min 0, max unbounded
                   type    =>    # forwarded sampled_out ...
                   comment =>    # string, min 0
               },
           }
        },
        identifiers => {
            envelope_to    min=0
            envelope_from  min=1
            header_from    min=1
        },
        auth_results => {
            spf  =>  {        # min 1, max unbounded
                domain  =>    # min 1
                scope   =>    # helo, mfrom  -  min 1
                result  =>    # none neutral ...
            }                   # ( unknown -> temperror, error -> permerror )
            dkim   =>  {            # min 0, max unbounded
               domain       =>  ,   # the d= parameter in the signature
               selector     =>  ,   # min 0
               result       =>  ,   # none pass fail policy ...
               human_result =>      # min 0
            },
        },
     },
  };

=cut

