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.