Implicit MX on lookup failures

This commit is contained in:
mdecimus 2025-03-18 20:04:46 +01:00
parent c30d12157a
commit 552347b792

View file

@ -4,33 +4,34 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/ */
use crate::outbound::client::{from_error_status, from_mail_send_error, SmtpClient}; use crate::outbound::client::{SmtpClient, from_error_status, from_mail_send_error};
use crate::outbound::dane::dnssec::TlsaLookup; use crate::outbound::dane::dnssec::TlsaLookup;
use crate::outbound::lookup::DnsLookup; use crate::outbound::lookup::DnsLookup;
use crate::outbound::mta_sts::lookup::MtaStsLookup; use crate::outbound::mta_sts::lookup::MtaStsLookup;
use crate::outbound::mta_sts::verify::VerifyPolicy; use crate::outbound::mta_sts::verify::VerifyPolicy;
use crate::outbound::{client::StartTlsResult, dane::verify::TlsaVerify}; use crate::outbound::{client::StartTlsResult, dane::verify::TlsaVerify};
use crate::queue::dsn::SendDsn; use crate::queue::dsn::SendDsn;
use crate::queue::spool::{SmtpSpool, LOCK_EXPIRY}; use crate::queue::spool::{LOCK_EXPIRY, SmtpSpool};
use crate::queue::throttle::IsAllowed; use crate::queue::throttle::IsAllowed;
use crate::reporting::SmtpReporting; use crate::reporting::SmtpReporting;
use common::Server;
use common::config::{ use common::config::{
server::ServerProtocol, server::ServerProtocol,
smtp::{queue::RequireOptional, report::AggregateFrequency}, smtp::{queue::RequireOptional, report::AggregateFrequency},
}; };
use common::ipc::{PolicyType, QueueEvent, QueueEventStatus, TlsEvent}; use common::ipc::{PolicyType, QueueEvent, QueueEventStatus, TlsEvent};
use common::Server;
use mail_auth::{ use mail_auth::{
mta_sts::TlsRpt, mta_sts::TlsRpt,
report::tlsrpt::{FailureDetails, ResultType}, report::tlsrpt::{FailureDetails, ResultType},
}; };
use rand::Rng; use rand::Rng;
use smtp_proto::MAIL_REQUIRETLS; use smtp_proto::MAIL_REQUIRETLS;
use std::sync::Arc;
use std::{ use std::{
net::{IpAddr, Ipv4Addr, SocketAddr}, net::{IpAddr, Ipv4Addr, SocketAddr},
time::{Duration, Instant}, time::{Duration, Instant},
}; };
use store::write::{now, BatchBuilder, QueueClass, ValueClass}; use store::write::{BatchBuilder, QueueClass, ValueClass, now};
use trc::{DaneEvent, DeliveryEvent, MtaStsEvent, ServerEvent, TlsRptEvent}; use trc::{DaneEvent, DeliveryEvent, MtaStsEvent, ServerEvent, TlsRptEvent};
use crate::{ use crate::{
@ -38,7 +39,7 @@ use crate::{
reporting::tls::TlsRptOptions, reporting::tls::TlsRptOptions,
}; };
use super::{lookup::ToNextHop, mta_sts, session::SessionParams, NextHop, TlsStrategy}; use super::{NextHop, TlsStrategy, lookup::ToNextHop, mta_sts, session::SessionParams};
use crate::queue::{Domain, Error, QueueEnvelope, QueuedMessage, Status}; use crate::queue::{Domain, Error, QueueEnvelope, QueuedMessage, Status};
impl QueuedMessage { impl QueuedMessage {
@ -104,9 +105,10 @@ impl QueuedMessage {
))); )));
if let Err(err) = server.store().write(batch.build()).await { if let Err(err) = server.store().write(batch.build()).await {
trc::error!(err trc::error!(
.details("Failed to delete queue event.") err.details("Failed to delete queue event.")
.caused_by(trc::location!())); .caused_by(trc::location!())
);
} }
// Unlock event // Unlock event
@ -493,6 +495,17 @@ impl QueuedMessage {
.await .await
{ {
Ok(mx) => mx, Ok(mx) => mx,
Err(mail_auth::Error::DnsRecordNotFound(_)) => {
trc::event!(
Delivery(DeliveryEvent::MxLookupFailed),
SpanId = message.span_id,
Domain = domain.domain.clone(),
Details = "No MX records were found, attempting implicit MX.",
Elapsed = time.elapsed(),
);
Arc::new(vec![])
}
Err(err) => { Err(err) => {
trc::event!( trc::event!(
Delivery(DeliveryEvent::MxLookupFailed), Delivery(DeliveryEvent::MxLookupFailed),