Troubleshoot tool: Use the configured source IP address when connecting to remote servers (fixes #2867)

This commit is contained in:
Maurus Decimus
2026-06-19 17:04:43 +02:00
parent cd6cd04b40
commit 88412f9540
2 changed files with 12 additions and 2 deletions

View File

@@ -36,9 +36,11 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If
- `SearchSnippet/get`: incorrect response structure.
- `Thread/changes`: emit a container delete when a thread becomes empty.
- `VacationResponse/set`: incorrect singleton handling.
- DANE: Improper `TLSA` record validation (#2328).
- OIDC: Add default domain name to groups that are not email addresses.
- RocksDB: Enable blob garbage collection to reclaim disk space from deleted blobs.
- Sieve: `include` statements ignore capitalisation of sub-script names (#1643)
- Troubleshoot tool: Use the configured source IP address when connecting to remote servers (#2867).
## [0.16.9] - 2026-06-15

View File

@@ -18,7 +18,7 @@ use smtp::outbound::{
client::{SmtpClient, StartTlsResult},
dane::{dnssec::TlsaLookup, verify::TlsaVerify},
error::ClientError,
lookup::{DnsLookup, ToNextHop},
lookup::{DnsLookup, SourceIp, ToNextHop},
mta_sts::{lookup::MtaStsLookup, verify::VerifyPolicy},
};
use std::{
@@ -218,6 +218,7 @@ async fn delivery_diagnose(
};
let local_host = &server.core.network.server_name;
let conn_strategy = server.get_connection_or_default("default", 0);
tx.send(DeliveryStage::MxLookupStart {
domain: domain.to_string(),
@@ -472,7 +473,13 @@ async fn delivery_diagnose(
.await?;
let now = Instant::now();
match SmtpClient::connect(SocketAddr::new(remote_ip, 25), timeout, 0).await {
let connect = if let Some(ip_host) = conn_strategy.source_ip(remote_ip.is_ipv4()) {
SmtpClient::connect_using(ip_host.ip, SocketAddr::new(remote_ip, 25), timeout, 0)
.await
} else {
SmtpClient::connect(SocketAddr::new(remote_ip, 25), timeout, 0).await
};
match connect {
Ok(mut client) => {
tx.send(DeliveryStage::ConnectionSuccess {
elapsed: now.elapsed_ms(),
@@ -586,6 +593,7 @@ async fn delivery_diagnose(
if let Err(err) = dane_policy.verify(
0,
hostname,
&[hostname],
client.tls_connection().peer_certificates(),
) {
tx.send(DeliveryStage::DaneVerifyError {