Un e-mail entrant provoque un plantage avec un en-tête Authentication-Results « no result » (RFC 8601) (authserv-id; none)

Lorsque email_in_authserv_id est défini et qu’un e-mail entrant porte un en-tête Authentication-Results correspondant sans résultat (Authentication-Results: ``mx.example.com``; none, la forme « sans résultat » définie dans la RFC 8601 §2.2), la création du message échoue avec l’erreur suivante :

NoMethodError: undefined method 'each' for nil
lib/email/authentication_results.rb:45:in 'block in Email::AuthenticationResults#calc_dmarc'

Le message est perdu, et l’expéditeur ne reçoit pas d’e-mail de rejet.

Pourquoi : dans parse_header, la branche no_result de authres_payload correspond, donc resinfo_val est nil et parsed_resinfo n’est jamais assigné. Le résultat est { authserv_id: "``mx.example.com``", resinfo: nil }, et calc_dmarc appelle ensuite result[:resinfo].each.

Quand cela se produit : certains MTA ajoutent la forme « sans résultat » lorsqu’ils n’ont effectué aucune vérification. rspamd le fait, par exemple, pour les e-mails non authentifiés provenant de ses local_addrs, comme les e-mails relayés depuis l’intérieur du réseau. Le plantage n’apparaît que lorsqu’un message est créé (Email::Receiver#create_post → auth_res_action). Les e-mails rejetés plus tôt, par exemple ceux provenant d’un inconnu, n’atteignent jamais cette étape.

Reproduction (console rails) :

SiteSetting.email_in_authserv_id = "mx.example.com"
Email::AuthenticationResults.new(["mx.example.com; none"]).verdict
# => NoMethodError: undefined method 'each' for nil

Correction suggérée : dans calc_dmarc, utiliser Array(result[:resinfo]).each do |resinfo|, ou définir parsed_resinfo = [] dans parse_header. Un en-tête sans résultat est alors compté comme gris, ce qui correspond à sa signification.

Observé sur ESR v2026.7.3, et la même ligne est toujours présente sur main.