queue/smtp_forward
May 20, 2026 · View on GitHub
==================
This plugin delivers to another mail server. This is a common setup when you want to have a mail server with a solid pedigree of outbound delivery to other hosts, and inbound delivery to users.
In comparison to queue/smtp_proxy, this plugin waits until queue time to attempt the ongoing connection. This can be a benefit in reducing connections to your inbound mail server when you have content filtering (such as spamassassin) enabled. A possible downside is that it also delays recipient validation that the ongoing mail server may provide until queue time.
Configuration
Configuration is stored in smtp_forward.ini in the following keys:
-
enable_outbound=[true]
SMTP forward outbound messages (set to false to enable Haraka's separate Outbound mail routing (MX based delivery)).
-
host=HOST
The host to connect to.
-
port=PORT
The port to connect to. Default: 25
-
connect_timeout=SECONDS
The maximum amount of time to wait when creating a new connection to the host. Default: 30 seconds.
-
timeout=SECONDS
The amount of seconds to let a backend connection live idle in the connection pool. This should always be less than the global plugin timeout, which should in turn be less than the connection timeout.
-
max_connections=NUMBER
Maximum number of connections at any given time. Default: 1000
-
enable_tls=[true]
Enable opportunistic TLS with the forward host via
STARTTLS(if the host advertises it). This plugin does not work with implicit SMTP over TLS. -
auth_type=[plain|login]
Enable PLAIN or LOGIN SMTP AUTH. This is required to enable AUTH.
-
auth_user=USERNAME
SMTP AUTH username to use.
-
auth_pass=PASSWORD
SMTP AUTH password to use.
-
queue
Which queue plugin to use. Default: undefined. The default bahavior is to use smtp_forward for inbound connections and outbound for relaying connections. This option is used for complex mail routes.
-
check_sender=false
Requires that sender domains defined in smtp_forward.ini (see Per-Domain below) have relaying privileges. This is a form of spoof prevention and assumes that any mail clients have relaying or AUTH privileges. This is usually the case.
-
check_recipient=false
By default, Haraka accepts no emails until a recipient plugin has been configured to accept mails for a domain. The simplest common case is the in_host_list plugin with a list of domains in config/host_list. An alternative is to set
check_recipient=trueand list each domain in a definition block in smtp_forward.ini (see Per-Domain Configuration). An example for two domains:[example.com] [example.net]
-
[tls]
Client STARTTLS options are assembled by merging:
tls.ini[main]— the global Haraka TLS configsmtp_forward.ini[tls]— overrides. Anything set here wins.
Example smtp_forward.ini [tls] section:
[tls]
rejectUnauthorized=true
minVersion=TLSv1.2
no_tls_hosts[]=10.0.0.5
Per-domain enable_tls=false still disables STARTTLS for that backend. Per-domain TLS cipher/cert overrides are not currently supported.
Changes to tls.ini require a Haraka restart to apply to the forward path; changes to smtp_forward.ini are picked up by the existing reload hook.
Per-Domain Configuration
More specific forward routes for domains can be defined. The domain is chosen based on the value of the domain_selector config variable.
When domain_selector is set to rcpt_to (the default), more specific routes are only honored for SMTP connections with a single recipient or SMTP connections where every recipient host is identical.
When domain_selector is set to mail_from, it first searches for configuration using the complete email address, falls back to the domain if not found, then to main configuration.
enable_outbound can be set or unset on a per-domain level to enable or disable forwarding for specific domains.
# default SMTP host
host=1.2.3.4
# auth_type=plain
# auth_user=user
# auth_user=pass
[example1.com]
host=1.2.3.5
# auth_type=plain
# auth_user=user
# auth_pass=pass
[email@example1.com]
host=1.2.3.5
# auth_type=plain
# auth_user=user
# auth_pass=pass
[example2.com]
host=1.2.3.5
[example3.com]
host=1.2.3.6
[example4.com]
enable\_outbound=false
Split host forward routing
When an incoming email transaction has multiple recipients with different forward routes, recipients to subsequent forward routes are deferred. Example: an incoming email transaction has recipients user@example1.com, user@example2.com, and user@example3.com. The first two recipients will be accepted (they share the same forward destination) and the latter will be deferred. It will arrive in a future delivery attempt by the remote.