1/*	$NetBSD: smtp.c,v 1.13 2023/12/23 20:30:45 christos Exp $	*/
2
3/*++
4/* NAME
5/*	smtp 8
6/* SUMMARY
7/*	Postfix SMTP+LMTP client
8/* SYNOPSIS
9/*	\fBsmtp\fR [generic Postfix daemon options] [flags=DORX]
10/* DESCRIPTION
11/*	The Postfix SMTP+LMTP client implements the SMTP and LMTP mail
12/*	delivery protocols. It processes message delivery requests from
13/*	the queue manager. Each request specifies a queue file, a sender
14/*	address, a domain or host to deliver to, and recipient information.
15/*	This program expects to be run from the \fBmaster\fR(8) process
16/*	manager.
17/*
18/*	The SMTP+LMTP client updates the queue file and marks recipients
19/*	as finished, or it informs the queue manager that delivery should
20/*	be tried again at a later time. Delivery status reports are sent
21/*	to the \fBbounce\fR(8), \fBdefer\fR(8) or \fBtrace\fR(8) daemon as
22/*	appropriate.
23/*
24/*	The SMTP+LMTP client looks up a list of mail exchanger addresses for
25/*	the destination host, sorts the list by preference, and connects
26/*	to each listed address until it finds a server that responds.
27/*
28/*	When a server is not reachable, or when mail delivery fails due
29/*	to a recoverable error condition, the SMTP+LMTP client will try to
30/*	deliver the mail to an alternate host.
31/*
32/*	After a successful mail transaction, a connection may be saved
33/*	to the \fBscache\fR(8) connection cache server, so that it
34/*	may be used by any SMTP+LMTP client for a subsequent transaction.
35/*
36/*	By default, connection caching is enabled temporarily for
37/*	destinations that have a high volume of mail in the active
38/*	queue. Connection caching can be enabled permanently for
39/*	specific destinations.
40/* SMTP DESTINATION SYNTAX
41/* .ad
42/* .fi
43/*	The Postfix SMTP+LMTP client supports multiple destinations
44/*	separated by comma or whitespace (Postfix 3.5 and later).
45/*	SMTP destinations have the following form:
46/* .IP \fIdomainname\fR
47/* .IP \fIdomainname\fR:\fIport\fR
48/*	Look up the mail exchangers for the specified domain, and
49/*	connect to the specified port (default: \fBsmtp\fR).
50/* .IP [\fIhostname\fR]
51/* .IP [\fIhostname\fR]:\fIport\fR
52/*	Look up the address(es) of the specified host, and connect to
53/*	the specified port (default: \fBsmtp\fR).
54/* .IP [\fIaddress\fR]
55/* .IP [\fIaddress\fR]:\fIport\fR
56/*	Connect to the host at the specified address, and connect
57/*	to the specified port (default: \fBsmtp\fR). An IPv6 address
58/*	must be formatted as [\fBipv6\fR:\fIaddress\fR].
59/* LMTP DESTINATION SYNTAX
60/* .ad
61/* .fi
62/*	The Postfix SMTP+LMTP client supports multiple destinations
63/*	separated by comma or whitespace (Postfix 3.5 and later).
64/*	LMTP destinations have the following form:
65/* .IP \fBunix\fR:\fIpathname\fR
66/*	Connect to the local UNIX-domain server that is bound to the specified
67/*	\fIpathname\fR. If the process runs chrooted, an absolute pathname
68/*	is interpreted relative to the Postfix queue directory.
69/* .IP \fBinet\fR:\fIhostname\fR
70/* .IP \fBinet\fR:\fIhostname\fR:\fIport\fR
71/* .IP \fBinet\fR:[\fIaddress\fR]
72/* .IP \fBinet\fR:[\fIaddress\fR]:\fIport\fR
73/*	Connect to the specified TCP port on the specified local or
74/*	remote host. If no port is specified, connect to the port defined as
75/*	\fBlmtp\fR in \fBservices\fR(4).
76/*	If no such service is found, the \fBlmtp_tcp_port\fR configuration
77/*	parameter (default value of 24) will be used.
78/*	An IPv6 address must be formatted as [\fBipv6\fR:\fIaddress\fR].
79/* SINGLE-RECIPIENT DELIVERY
80/* .ad
81/* .fi
82/*	By default, the Postfix SMTP+LMTP client delivers mail to
83/*	multiple recipients per delivery request. This is undesirable
84/*	when prepending a \fBDelivered-to:\fR or \fBX-Original-To:\fR
85/*	message header. To prevent Postfix from sending multiple
86/*	recipients per delivery request, specify
87/* .sp
88/* .nf
89/*	    \fItransport\fB_destination_recipient_limit = 1\fR
90/* .fi
91/*
92/*	in the Postfix \fBmain.cf\fR file, where \fItransport\fR
93/*	is the name in the first column of the Postfix \fBmaster.cf\fR
94/*	entry for this mail delivery service.
95/* COMMAND ATTRIBUTE SYNTAX
96/* .ad
97/* .fi
98/* .IP "\fBflags=DORX\fR (optional)"
99/*	Optional message processing flags.
100/* .RS
101/* .IP \fBD\fR
102/*	Prepend a "\fBDelivered-To: \fIrecipient\fR" message header
103/*	with the envelope recipient address. Note: for this to work,
104/*	the \fItransport\fB_destination_recipient_limit\fR must be
105/*	1 (see SINGLE-RECIPIENT DELIVERY above for details).
106/* .sp
107/*	The \fBD\fR flag also enforces loop detection: if a message
108/*	already contains a \fBDelivered-To:\fR header with the same
109/*	recipient address, then the message is returned as
110/*	undeliverable. The address comparison is case insensitive.
111/* .sp
112/*	This feature is available as of Postfix 3.5.
113/* .IP \fBO\fR
114/*	Prepend an "\fBX-Original-To: \fIrecipient\fR" message
115/*	header with the recipient address as given to Postfix. Note:
116/*	for this to work, the
117/*	\fItransport\fB_destination_recipient_limit\fR must be 1
118/*	(see SINGLE-RECIPIENT DELIVERY above for details).
119/* .sp
120/*	This feature is available as of Postfix 3.5.
121/* .IP \fBR\fR
122/*	Prepend a "\fBReturn-Path: <\fIsender\fB>\fR" message header
123/*	with the envelope sender address.
124/* .sp
125/*	This feature is available as of Postfix 3.5.
126/* .IP \fBX\fR
127/*	Indicates that the delivery is final. This flag affects
128/*	the status reported in "success" DSN (delivery status
129/*	notification) messages, and changes it from "relayed" into
130/*	"delivered".
131/* .sp
132/*	This feature is available as of Postfix 3.5.
133/* .RE
134/* SECURITY
135/*	The SMTP+LMTP client is moderately security-sensitive. It
136/*	talks to SMTP or LMTP servers and to DNS servers on the
137/*	network. The SMTP+LMTP client can be run chrooted at fixed
138/*	low privilege.
139/* STANDARDS
140/*	RFC 821 (SMTP protocol)
141/*	RFC 822 (ARPA Internet Text Messages)
142/*	RFC 1651 (SMTP service extensions)
143/*	RFC 1652 (8bit-MIME transport)
144/*	RFC 1870 (Message Size Declaration)
145/*	RFC 2033 (LMTP protocol)
146/*	RFC 2034 (SMTP Enhanced Error Codes)
147/*	RFC 2045 (MIME: Format of Internet Message Bodies)
148/*	RFC 2046 (MIME: Media Types)
149/*	RFC 2554 (AUTH command)
150/*	RFC 2821 (SMTP protocol)
151/*	RFC 2782 (SRV resource records)
152/*	RFC 2920 (SMTP Pipelining)
153/*	RFC 3207 (STARTTLS command)
154/*	RFC 3461 (SMTP DSN Extension)
155/*	RFC 3463 (Enhanced Status Codes)
156/*	RFC 4954 (AUTH command)
157/*	RFC 5321 (SMTP protocol)
158/*	RFC 6531 (Internationalized SMTP)
159/*	RFC 6533 (Internationalized Delivery Status Notifications)
160/*	RFC 7672 (SMTP security via opportunistic DANE TLS)
161/* DIAGNOSTICS
162/*	Problems and transactions are logged to \fBsyslogd\fR(8)
163/*	or \fBpostlogd\fR(8).
164/*	Corrupted message files are marked so that the queue manager can
165/*	move them to the \fBcorrupt\fR queue for further inspection.
166/*
167/*	Depending on the setting of the \fBnotify_classes\fR parameter,
168/*	the postmaster is notified of bounces, protocol problems, and of
169/*	other trouble.
170/* BUGS
171/*	SMTP and LMTP connection reuse for TLS (without closing the
172/*	SMTP or LMTP connection) is not supported before Postfix 3.4.
173/*
174/*	SMTP and LMTP connection reuse assumes that SASL credentials
175/*	are valid for all destinations that map onto the same IP
176/*	address and TCP port.
177/* CONFIGURATION PARAMETERS
178/* .ad
179/* .fi
180/*	Before Postfix version 2.3, the LMTP client is a separate
181/*	program that implements only a subset of the functionality
182/*	available with SMTP: there is no support for TLS, and
183/*	connections are cached in-process, making it ineffective
184/*	when the client is used for multiple domains.
185/*
186/*	Most smtp_\fIxxx\fR configuration parameters have an
187/*	lmtp_\fIxxx\fR "mirror" parameter for the equivalent LMTP
188/*	feature. This document describes only those LMTP-related
189/*	parameters that aren't simply "mirror" parameters.
190/*
191/*	Changes to \fBmain.cf\fR are picked up automatically, as \fBsmtp\fR(8)
192/*	processes run for only a limited amount of time. Use the command
193/*	"\fBpostfix reload\fR" to speed up a change.
194/*
195/*	The text below provides only a parameter summary. See
196/*	\fBpostconf\fR(5) for more details including examples.
197/* COMPATIBILITY CONTROLS
198/* .ad
199/* .fi
200/* .IP "\fBignore_mx_lookup_error (no)\fR"
201/*	Ignore DNS MX lookups that produce no response.
202/* .IP "\fBsmtp_always_send_ehlo (yes)\fR"
203/*	Always send EHLO at the start of an SMTP session.
204/* .IP "\fBsmtp_never_send_ehlo (no)\fR"
205/*	Never send EHLO at the start of an SMTP session.
206/* .IP "\fBsmtp_defer_if_no_mx_address_found (no)\fR"
207/*	Defer mail delivery when no MX record resolves to an IP address.
208/* .IP "\fBsmtp_line_length_limit (998)\fR"
209/*	The maximal length of message header and body lines that Postfix
210/*	will send via SMTP.
211/* .IP "\fBsmtp_pix_workaround_delay_time (10s)\fR"
212/*	How long the Postfix SMTP client pauses before sending
213/*	".<CR><LF>" in order to work around the PIX firewall
214/*	"<CR><LF>.<CR><LF>" bug.
215/* .IP "\fBsmtp_pix_workaround_threshold_time (500s)\fR"
216/*	How long a message must be queued before the Postfix SMTP client
217/*	turns on the PIX firewall "<CR><LF>.<CR><LF>"
218/*	bug workaround for delivery through firewalls with "smtp fixup"
219/*	mode turned on.
220/* .IP "\fBsmtp_pix_workarounds (disable_esmtp, delay_dotcrlf)\fR"
221/*	A list that specifies zero or more workarounds for CISCO PIX
222/*	firewall bugs.
223/* .IP "\fBsmtp_pix_workaround_maps (empty)\fR"
224/*	Lookup tables, indexed by the remote SMTP server address, with
225/*	per-destination workarounds for CISCO PIX firewall bugs.
226/* .IP "\fBsmtp_quote_rfc821_envelope (yes)\fR"
227/*	Quote addresses in Postfix SMTP client MAIL FROM and RCPT TO commands
228/*	as required
229/*	by RFC 5321.
230/* .IP "\fBsmtp_reply_filter (empty)\fR"
231/*	A mechanism to transform replies from remote SMTP servers one
232/*	line at a time.
233/* .IP "\fBsmtp_skip_5xx_greeting (yes)\fR"
234/*	Skip remote SMTP servers that greet with a 5XX status code.
235/* .IP "\fBsmtp_skip_quit_response (yes)\fR"
236/*	Do not wait for the response to the SMTP QUIT command.
237/* .PP
238/*	Available in Postfix version 2.0 and earlier:
239/* .IP "\fBsmtp_skip_4xx_greeting (yes)\fR"
240/*	Skip SMTP servers that greet with a 4XX status code (go away, try
241/*	again later).
242/* .PP
243/*	Available in Postfix version 2.2 and later:
244/* .IP "\fBsmtp_discard_ehlo_keyword_address_maps (empty)\fR"
245/*	Lookup tables, indexed by the remote SMTP server address, with
246/*	case insensitive lists of EHLO keywords (pipelining, starttls, auth,
247/*	etc.) that the Postfix SMTP client will ignore in the EHLO response from a
248/*	remote SMTP server.
249/* .IP "\fBsmtp_discard_ehlo_keywords (empty)\fR"
250/*	A case insensitive list of EHLO keywords (pipelining, starttls,
251/*	auth, etc.) that the Postfix SMTP client will ignore in the EHLO
252/*	response from a remote SMTP server.
253/* .IP "\fBsmtp_generic_maps (empty)\fR"
254/*	Optional lookup tables that perform address rewriting in the
255/*	Postfix SMTP client, typically to transform a locally valid address into
256/*	a globally valid address when sending mail across the Internet.
257/* .PP
258/*	Available in Postfix version 2.2.9 and later:
259/* .IP "\fBsmtp_cname_overrides_servername (version dependent)\fR"
260/*	When the remote SMTP servername is a DNS CNAME, replace the
261/*	servername with the result from CNAME expansion for the purpose of
262/*	logging, SASL password lookup, TLS
263/*	policy decisions, or TLS certificate verification.
264/* .PP
265/*	Available in Postfix version 2.3 and later:
266/* .IP "\fBlmtp_discard_lhlo_keyword_address_maps (empty)\fR"
267/*	Lookup tables, indexed by the remote LMTP server address, with
268/*	case insensitive lists of LHLO keywords (pipelining, starttls,
269/*	auth, etc.) that the Postfix LMTP client will ignore in the LHLO
270/*	response
271/*	from a remote LMTP server.
272/* .IP "\fBlmtp_discard_lhlo_keywords (empty)\fR"
273/*	A case insensitive list of LHLO keywords (pipelining, starttls,
274/*	auth, etc.) that the Postfix LMTP client will ignore in the LHLO
275/*	response
276/*	from a remote LMTP server.
277/* .PP
278/*	Available in Postfix version 2.4.4 and later:
279/* .IP "\fBsend_cyrus_sasl_authzid (no)\fR"
280/*	When authenticating to a remote SMTP or LMTP server with the
281/*	default setting "no", send no SASL authoriZation ID (authzid); send
282/*	only the SASL authentiCation ID (authcid) plus the authcid's password.
283/* .PP
284/*	Available in Postfix version 2.5 and later:
285/* .IP "\fBsmtp_header_checks (empty)\fR"
286/*	Restricted \fBheader_checks\fR(5) tables for the Postfix SMTP client.
287/* .IP "\fBsmtp_mime_header_checks (empty)\fR"
288/*	Restricted \fBmime_header_checks\fR(5) tables for the Postfix SMTP
289/*	client.
290/* .IP "\fBsmtp_nested_header_checks (empty)\fR"
291/*	Restricted \fBnested_header_checks\fR(5) tables for the Postfix SMTP
292/*	client.
293/* .IP "\fBsmtp_body_checks (empty)\fR"
294/*	Restricted \fBbody_checks\fR(5) tables for the Postfix SMTP client.
295/* .PP
296/*	Available in Postfix version 2.6 and later:
297/* .IP "\fBtcp_windowsize (0)\fR"
298/*	An optional workaround for routers that break TCP window scaling.
299/* .PP
300/*	Available in Postfix version 2.8 and later:
301/* .IP "\fBsmtp_dns_resolver_options (empty)\fR"
302/*	DNS Resolver options for the Postfix SMTP client.
303/* .PP
304/*	Available in Postfix version 2.9 - 3.6:
305/* .IP "\fBsmtp_per_record_deadline (no)\fR"
306/*	Change the behavior of the smtp_*_timeout time limits, from a
307/*	time limit per read or write system call, to a time limit to send
308/*	or receive a complete record (an SMTP command line, SMTP response
309/*	line, SMTP message content line, or TLS protocol message).
310/* .PP
311/*	Available in Postfix version 2.9 and later:
312/* .IP "\fBsmtp_send_dummy_mail_auth (no)\fR"
313/*	Whether or not to append the "AUTH=<>" option to the MAIL
314/*	FROM command in SASL-authenticated SMTP sessions.
315/* .PP
316/*	Available in Postfix version 2.11 and later:
317/* .IP "\fBsmtp_dns_support_level (empty)\fR"
318/*	Level of DNS support in the Postfix SMTP client.
319/* .PP
320/*	Available in Postfix version 3.0 and later:
321/* .IP "\fBsmtp_delivery_status_filter ($default_delivery_status_filter)\fR"
322/*	Optional filter for the \fBsmtp\fR(8) delivery agent to change the
323/*	delivery status code or explanatory text of successful or unsuccessful
324/*	deliveries.
325/* .IP "\fBsmtp_dns_reply_filter (empty)\fR"
326/*	Optional filter for Postfix SMTP client DNS lookup results.
327/* .PP
328/*	Available in Postfix version 3.3 and later:
329/* .IP "\fBsmtp_balance_inet_protocols (yes)\fR"
330/*	When a remote destination resolves to a combination of IPv4 and
331/*	IPv6 addresses, ensure that the Postfix SMTP client can try both
332/*	address types before it runs into the smtp_mx_address_limit.
333/* .PP
334/*	Available in Postfix 3.5 and later:
335/* .IP "\fBinfo_log_address_format (external)\fR"
336/*	The email address form that will be used in non-debug logging
337/*	(info, warning, etc.).
338/* .PP
339/*	Available in Postfix 3.6 and later:
340/* .IP "\fBdnssec_probe (ns:.)\fR"
341/*	The DNS query type (default: "ns") and DNS query name (default:
342/*	".") that Postfix may use to determine whether DNSSEC validation
343/*	is available.
344/* .IP "\fBknown_tcp_ports (lmtp=24, smtp=25, smtps=submissions=465, submission=587)\fR"
345/*	Optional setting that avoids lookups in the \fBservices\fR(5) database.
346/* .PP
347/*	Available in Postfix version 3.7 and later:
348/* .IP "\fBsmtp_per_request_deadline (no)\fR"
349/*	Change the behavior of the smtp_*_timeout time limits, from a
350/*	time limit per plaintext or TLS read or write call, to a combined
351/*	time limit for sending a complete SMTP request and for receiving a
352/*	complete SMTP response.
353/* .IP "\fBsmtp_min_data_rate (500)\fR"
354/*	The minimum plaintext data transfer rate in bytes/second for
355/*	DATA requests, when deadlines are enabled with smtp_per_request_deadline.
356/* .IP "\fBheader_from_format (standard)\fR"
357/*	The format of the Postfix-generated \fBFrom:\fR header.
358/* .PP
359/*	Available in Postfix version 3.8 and later:
360/* .IP "\fBuse_srv_lookup (empty)\fR"
361/*	Enables discovery for the specified service(s) using DNS SRV
362/*	records.
363/* .IP "\fBignore_srv_lookup_error (no)\fR"
364/*	When SRV record lookup fails, fall back to MX or IP address
365/*	lookup as if SRV record lookup was not enabled.
366/* .IP "\fBallow_srv_lookup_fallback (no)\fR"
367/*	When SRV record lookup fails or no SRV record exists, fall back
368/*	to MX or IP address lookup as if SRV record lookup was not enabled.
369/* MIME PROCESSING CONTROLS
370/* .ad
371/* .fi
372/*	Available in Postfix version 2.0 and later:
373/* .IP "\fBdisable_mime_output_conversion (no)\fR"
374/*	Disable the conversion of 8BITMIME format to 7BIT format.
375/* .IP "\fBmime_boundary_length_limit (2048)\fR"
376/*	The maximal length of MIME multipart boundary strings.
377/* .IP "\fBmime_nesting_limit (100)\fR"
378/*	The maximal recursion level that the MIME processor will handle.
379/* EXTERNAL CONTENT INSPECTION CONTROLS
380/* .ad
381/* .fi
382/*	Available in Postfix version 2.1 and later:
383/* .IP "\fBsmtp_send_xforward_command (no)\fR"
384/*	Send the non-standard XFORWARD command when the Postfix SMTP server
385/*	EHLO response announces XFORWARD support.
386/* SASL AUTHENTICATION CONTROLS
387/* .ad
388/* .fi
389/* .IP "\fBsmtp_sasl_auth_enable (no)\fR"
390/*	Enable SASL authentication in the Postfix SMTP client.
391/* .IP "\fBsmtp_sasl_password_maps (empty)\fR"
392/*	Optional Postfix SMTP client lookup tables with one username:password
393/*	entry per sender, remote hostname or next-hop domain.
394/* .IP "\fBsmtp_sasl_security_options (noplaintext, noanonymous)\fR"
395/*	Postfix SMTP client SASL security options; as of Postfix 2.3
396/*	the list of available
397/*	features depends on the SASL client implementation that is selected
398/*	with \fBsmtp_sasl_type\fR.
399/* .PP
400/*	Available in Postfix version 2.2 and later:
401/* .IP "\fBsmtp_sasl_mechanism_filter (empty)\fR"
402/*	If non-empty, a Postfix SMTP client filter for the remote SMTP
403/*	server's list of offered SASL mechanisms.
404/* .PP
405/*	Available in Postfix version 2.3 and later:
406/* .IP "\fBsmtp_sender_dependent_authentication (no)\fR"
407/*	Enable sender-dependent authentication in the Postfix SMTP client; this is
408/*	available only with SASL authentication, and disables SMTP connection
409/*	caching to ensure that mail from different senders will use the
410/*	appropriate credentials.
411/* .IP "\fBsmtp_sasl_path (empty)\fR"
412/*	Implementation-specific information that the Postfix SMTP client
413/*	passes through to
414/*	the SASL plug-in implementation that is selected with
415/*	\fBsmtp_sasl_type\fR.
416/* .IP "\fBsmtp_sasl_type (cyrus)\fR"
417/*	The SASL plug-in type that the Postfix SMTP client should use
418/*	for authentication.
419/* .PP
420/*	Available in Postfix version 2.5 and later:
421/* .IP "\fBsmtp_sasl_auth_cache_name (empty)\fR"
422/*	An optional table to prevent repeated SASL authentication
423/*	failures with the same remote SMTP server hostname, username and
424/*	password.
425/* .IP "\fBsmtp_sasl_auth_cache_time (90d)\fR"
426/*	The maximal age of an smtp_sasl_auth_cache_name entry before it
427/*	is removed.
428/* .IP "\fBsmtp_sasl_auth_soft_bounce (yes)\fR"
429/*	When a remote SMTP server rejects a SASL authentication request
430/*	with a 535 reply code, defer mail delivery instead of returning
431/*	mail as undeliverable.
432/* .PP
433/*	Available in Postfix version 2.9 and later:
434/* .IP "\fBsmtp_send_dummy_mail_auth (no)\fR"
435/*	Whether or not to append the "AUTH=<>" option to the MAIL
436/*	FROM command in SASL-authenticated SMTP sessions.
437/* STARTTLS SUPPORT CONTROLS
438/* .ad
439/* .fi
440/*	Detailed information about STARTTLS configuration may be found
441/*	in the TLS_README document.
442/* .IP "\fBsmtp_tls_security_level (empty)\fR"
443/*	The default SMTP TLS security level for the Postfix SMTP client.
444/* .IP "\fBsmtp_sasl_tls_security_options ($smtp_sasl_security_options)\fR"
445/*	The SASL authentication security options that the Postfix SMTP
446/*	client uses for TLS encrypted SMTP sessions.
447/* .IP "\fBsmtp_starttls_timeout (300s)\fR"
448/*	Time limit for Postfix SMTP client write and read operations
449/*	during TLS startup and shutdown handshake procedures.
450/* .IP "\fBsmtp_tls_CAfile (empty)\fR"
451/*	A file containing CA certificates of root CAs trusted to sign
452/*	either remote SMTP server certificates or intermediate CA certificates.
453/* .IP "\fBsmtp_tls_CApath (empty)\fR"
454/*	Directory with PEM format Certification Authority certificates
455/*	that the Postfix SMTP client uses to verify a remote SMTP server
456/*	certificate.
457/* .IP "\fBsmtp_tls_cert_file (empty)\fR"
458/*	File with the Postfix SMTP client RSA certificate in PEM format.
459/* .IP "\fBsmtp_tls_mandatory_ciphers (medium)\fR"
460/*	The minimum TLS cipher grade that the Postfix SMTP client will
461/*	use with
462/*	mandatory TLS encryption.
463/* .IP "\fBsmtp_tls_exclude_ciphers (empty)\fR"
464/*	List of ciphers or cipher types to exclude from the Postfix
465/*	SMTP client cipher
466/*	list at all TLS security levels.
467/* .IP "\fBsmtp_tls_mandatory_exclude_ciphers (empty)\fR"
468/*	Additional list of ciphers or cipher types to exclude from the
469/*	Postfix SMTP client cipher list at mandatory TLS security levels.
470/* .IP "\fBsmtp_tls_dcert_file (empty)\fR"
471/*	File with the Postfix SMTP client DSA certificate in PEM format.
472/* .IP "\fBsmtp_tls_dkey_file ($smtp_tls_dcert_file)\fR"
473/*	File with the Postfix SMTP client DSA private key in PEM format.
474/* .IP "\fBsmtp_tls_key_file ($smtp_tls_cert_file)\fR"
475/*	File with the Postfix SMTP client RSA private key in PEM format.
476/* .IP "\fBsmtp_tls_loglevel (0)\fR"
477/*	Enable additional Postfix SMTP client logging of TLS activity.
478/* .IP "\fBsmtp_tls_note_starttls_offer (no)\fR"
479/*	Log the hostname of a remote SMTP server that offers STARTTLS,
480/*	when TLS is not already enabled for that server.
481/* .IP "\fBsmtp_tls_policy_maps (empty)\fR"
482/*	Optional lookup tables with the Postfix SMTP client TLS security
483/*	policy by next-hop destination; when a non-empty value is specified,
484/*	this overrides the obsolete smtp_tls_per_site parameter.
485/* .IP "\fBsmtp_tls_mandatory_protocols (see 'postconf -d' output)\fR"
486/*	TLS protocols that the Postfix SMTP client will use with mandatory
487/*	TLS encryption.
488/* .IP "\fBsmtp_tls_scert_verifydepth (9)\fR"
489/*	The verification depth for remote SMTP server certificates.
490/* .IP "\fBsmtp_tls_secure_cert_match (nexthop, dot-nexthop)\fR"
491/*	How the Postfix SMTP client verifies the server certificate
492/*	peername for the "secure" TLS security level.
493/* .IP "\fBsmtp_tls_session_cache_database (empty)\fR"
494/*	Name of the file containing the optional Postfix SMTP client
495/*	TLS session cache.
496/* .IP "\fBsmtp_tls_session_cache_timeout (3600s)\fR"
497/*	The expiration time of Postfix SMTP client TLS session cache
498/*	information.
499/* .IP "\fBsmtp_tls_verify_cert_match (hostname)\fR"
500/*	How the Postfix SMTP client verifies the server certificate
501/*	peername for the
502/*	"verify" TLS security level.
503/* .IP "\fBtls_daemon_random_bytes (32)\fR"
504/*	The number of pseudo-random bytes that an \fBsmtp\fR(8) or \fBsmtpd\fR(8)
505/*	process requests from the \fBtlsmgr\fR(8) server in order to seed its
506/*	internal pseudo random number generator (PRNG).
507/* .IP "\fBtls_high_cipherlist (see 'postconf -d' output)\fR"
508/*	The OpenSSL cipherlist for "high" grade ciphers.
509/* .IP "\fBtls_medium_cipherlist (see 'postconf -d' output)\fR"
510/*	The OpenSSL cipherlist for "medium" or higher grade ciphers.
511/* .IP "\fBtls_null_cipherlist (eNULL:!aNULL)\fR"
512/*	The OpenSSL cipherlist for "NULL" grade ciphers that provide
513/*	authentication without encryption.
514/* .PP
515/*	Available in in Postfix version 2.3..3.7:
516/* .IP "\fBtls_low_cipherlist (see 'postconf -d' output)\fR"
517/*	The OpenSSL cipherlist for "low" or higher grade ciphers.
518/* .IP "\fBtls_export_cipherlist (see 'postconf -d' output)\fR"
519/*	The OpenSSL cipherlist for "export" or higher grade ciphers.
520/* .PP
521/*	Available in Postfix version 2.4 and later:
522/* .IP "\fBsmtp_sasl_tls_verified_security_options ($smtp_sasl_tls_security_options)\fR"
523/*	The SASL authentication security options that the Postfix SMTP
524/*	client uses for TLS encrypted SMTP sessions with a verified server
525/*	certificate.
526/* .PP
527/*	Available in Postfix version 2.5 and later:
528/* .IP "\fBsmtp_tls_fingerprint_cert_match (empty)\fR"
529/*	List of acceptable remote SMTP server certificate fingerprints for
530/*	the "fingerprint" TLS security level (\fBsmtp_tls_security_level\fR =
531/*	fingerprint).
532/* .IP "\fBsmtp_tls_fingerprint_digest (see 'postconf -d' output)\fR"
533/*	The message digest algorithm used to construct remote SMTP server
534/*	certificate fingerprints.
535/* .PP
536/*	Available in Postfix version 2.6 and later:
537/* .IP "\fBsmtp_tls_protocols (see postconf -d output)\fR"
538/*	TLS protocols that the Postfix SMTP client will use with
539/*	opportunistic TLS encryption.
540/* .IP "\fBsmtp_tls_ciphers (medium)\fR"
541/*	The minimum TLS cipher grade that the Postfix SMTP client
542/*	will use with opportunistic TLS encryption.
543/* .IP "\fBsmtp_tls_eccert_file (empty)\fR"
544/*	File with the Postfix SMTP client ECDSA certificate in PEM format.
545/* .IP "\fBsmtp_tls_eckey_file ($smtp_tls_eccert_file)\fR"
546/*	File with the Postfix SMTP client ECDSA private key in PEM format.
547/* .PP
548/*	Available in Postfix version 2.7 and later:
549/* .IP "\fBsmtp_tls_block_early_mail_reply (no)\fR"
550/*	Try to detect a mail hijacking attack based on a TLS protocol
551/*	vulnerability (CVE-2009-3555), where an attacker prepends malicious
552/*	HELO, MAIL, RCPT, DATA commands to a Postfix SMTP client TLS session.
553/* .PP
554/*	Available in Postfix version 2.8 and later:
555/* .IP "\fBtls_disable_workarounds (see 'postconf -d' output)\fR"
556/*	List or bit-mask of OpenSSL bug work-arounds to disable.
557/* .PP
558/*	Available in Postfix version 2.11-3.1:
559/* .IP "\fBtls_dane_digest_agility (on)\fR"
560/*	Configure RFC7671 DANE TLSA digest algorithm agility.
561/* .IP "\fBtls_dane_trust_anchor_digest_enable (yes)\fR"
562/*	Enable support for RFC 6698 (DANE TLSA) DNS records that contain
563/*	digests of trust-anchors with certificate usage "2".
564/* .PP
565/*	Available in Postfix version 2.11 and later:
566/* .IP "\fBsmtp_tls_trust_anchor_file (empty)\fR"
567/*	Zero or more PEM-format files with trust-anchor certificates
568/*	and/or public keys.
569/* .IP "\fBsmtp_tls_force_insecure_host_tlsa_lookup (no)\fR"
570/*	Lookup the associated DANE TLSA RRset even when a hostname is
571/*	not an alias and its address records lie in an unsigned zone.
572/* .IP "\fBtlsmgr_service_name (tlsmgr)\fR"
573/*	The name of the \fBtlsmgr\fR(8) service entry in master.cf.
574/* .PP
575/*	Available in Postfix version 3.0 and later:
576/* .IP "\fBsmtp_tls_wrappermode (no)\fR"
577/*	Request that the Postfix SMTP client connects using the
578/*	SUBMISSIONS/SMTPS protocol instead of using the STARTTLS command.
579/* .PP
580/*	Available in Postfix version 3.1 and later:
581/* .IP "\fBsmtp_tls_dane_insecure_mx_policy (see 'postconf -d' output)\fR"
582/*	The TLS policy for MX hosts with "secure" TLSA records when the
583/*	nexthop destination security level is \fBdane\fR, but the MX
584/*	record was found via an "insecure" MX lookup.
585/* .PP
586/*	Available in Postfix version 3.2 and later:
587/* .IP "\fBtls_eecdh_auto_curves (see 'postconf -d' output)\fR"
588/*	The prioritized list of elliptic curves supported by the Postfix
589/*	SMTP client and server.
590/* .PP
591/*	Available in Postfix version 3.4 and later:
592/* .IP "\fBsmtp_tls_connection_reuse (no)\fR"
593/*	Try to make multiple deliveries per TLS-encrypted connection.
594/* .IP "\fBsmtp_tls_chain_files (empty)\fR"
595/*	List of one or more PEM files, each holding one or more private keys
596/*	directly followed by a corresponding certificate chain.
597/* .IP "\fBsmtp_tls_servername (empty)\fR"
598/*	Optional name to send to the remote SMTP server in the TLS Server
599/*	Name Indication (SNI) extension.
600/* .PP
601/*	Available in Postfix 3.5, 3.4.6, 3.3.5, 3.2.10, 3.1.13 and later:
602/* .IP "\fBtls_fast_shutdown_enable (yes)\fR"
603/*	A workaround for implementations that hang Postfix while shutting
604/*	down a TLS session, until Postfix times out.
605/* .PP
606/*	Available in Postfix version 3.8 and later:
607/* .IP "\fBtls_ffdhe_auto_groups (see 'postconf -d' output)\fR"
608/*	The prioritized list of finite-field Diffie-Hellman ephemeral
609/*	(FFDHE) key exchange groups supported by the Postfix SMTP client and
610/*	server.
611/* .PP
612/*	Available in Postfix 3.9, 3.8.1, 3.7.6, 3.6.10, 3.5.20 and later:
613/* .IP "\fBtls_config_file (default)\fR"
614/*	Optional configuration file with baseline OpenSSL settings.
615/* .IP "\fBtls_config_name (empty)\fR"
616/*	The application name passed by Postfix to OpenSSL library
617/*	initialization functions.
618/* OBSOLETE STARTTLS CONTROLS
619/* .ad
620/* .fi
621/*	The following configuration parameters exist for compatibility
622/*	with Postfix versions before 2.3. Support for these will
623/*	be removed in a future release.
624/* .IP "\fBsmtp_use_tls (no)\fR"
625/*	Opportunistic mode: use TLS when a remote SMTP server announces
626/*	STARTTLS support, otherwise send the mail in the clear.
627/* .IP "\fBsmtp_enforce_tls (no)\fR"
628/*	Enforcement mode: require that remote SMTP servers use TLS
629/*	encryption, and never send mail in the clear.
630/* .IP "\fBsmtp_tls_enforce_peername (yes)\fR"
631/*	With mandatory TLS encryption, require that the remote SMTP
632/*	server hostname matches the information in the remote SMTP server
633/*	certificate.
634/* .IP "\fBsmtp_tls_per_site (empty)\fR"
635/*	Optional lookup tables with the Postfix SMTP client TLS usage
636/*	policy by next-hop destination and by remote SMTP server hostname.
637/* .IP "\fBsmtp_tls_cipherlist (empty)\fR"
638/*	Obsolete Postfix < 2.3 control for the Postfix SMTP client TLS
639/*	cipher list.
640/* RESOURCE AND RATE CONTROLS
641/* .ad
642/* .fi
643/* .IP "\fBsmtp_connect_timeout (30s)\fR"
644/*	The Postfix SMTP client time limit for completing a TCP connection, or
645/*	zero (use the operating system built-in time limit).
646/* .IP "\fBsmtp_helo_timeout (300s)\fR"
647/*	The Postfix SMTP client time limit for sending the HELO or EHLO command,
648/*	and for receiving the initial remote SMTP server response.
649/* .IP "\fBlmtp_lhlo_timeout (300s)\fR"
650/*	The Postfix LMTP client time limit for sending the LHLO command,
651/*	and for receiving the initial remote LMTP server response.
652/* .IP "\fBsmtp_xforward_timeout (300s)\fR"
653/*	The Postfix SMTP client time limit for sending the XFORWARD command,
654/*	and for receiving the remote SMTP server response.
655/* .IP "\fBsmtp_mail_timeout (300s)\fR"
656/*	The Postfix SMTP client time limit for sending the MAIL FROM command,
657/*	and for receiving the remote SMTP server response.
658/* .IP "\fBsmtp_rcpt_timeout (300s)\fR"
659/*	The Postfix SMTP client time limit for sending the SMTP RCPT TO
660/*	command, and for receiving the remote SMTP server response.
661/* .IP "\fBsmtp_data_init_timeout (120s)\fR"
662/*	The Postfix SMTP client time limit for sending the SMTP DATA command,
663/*	and for receiving the remote SMTP server response.
664/* .IP "\fBsmtp_data_xfer_timeout (180s)\fR"
665/*	The Postfix SMTP client time limit for sending the SMTP message content.
666/* .IP "\fBsmtp_data_done_timeout (600s)\fR"
667/*	The Postfix SMTP client time limit for sending the SMTP ".", and
668/*	for receiving the remote SMTP server response.
669/* .IP "\fBsmtp_quit_timeout (300s)\fR"
670/*	The Postfix SMTP client time limit for sending the QUIT command,
671/*	and for receiving the remote SMTP server response.
672/* .PP
673/*	Available in Postfix version 2.1 and later:
674/* .IP "\fBsmtp_mx_address_limit (5)\fR"
675/*	The maximal number of MX (mail exchanger) IP addresses that can
676/*	result from Postfix SMTP client mail exchanger lookups, or zero (no
677/*	limit).
678/* .IP "\fBsmtp_mx_session_limit (2)\fR"
679/*	The maximal number of SMTP sessions per delivery request before
680/*	the Postfix SMTP client
681/*	gives up or delivers to a fall-back relay host, or zero (no
682/*	limit).
683/* .IP "\fBsmtp_rset_timeout (20s)\fR"
684/*	The Postfix SMTP client time limit for sending the RSET command,
685/*	and for receiving the remote SMTP server response.
686/* .PP
687/*	Available in Postfix version 2.2 and earlier:
688/* .IP "\fBlmtp_cache_connection (yes)\fR"
689/*	Keep Postfix LMTP client connections open for up to $max_idle
690/*	seconds.
691/* .PP
692/*	Available in Postfix version 2.2 and later:
693/* .IP "\fBsmtp_connection_cache_destinations (empty)\fR"
694/*	Permanently enable SMTP connection caching for the specified
695/*	destinations.
696/* .IP "\fBsmtp_connection_cache_on_demand (yes)\fR"
697/*	Temporarily enable SMTP connection caching while a destination
698/*	has a high volume of mail in the active queue.
699/* .IP "\fBsmtp_connection_reuse_time_limit (300s)\fR"
700/*	The amount of time during which Postfix will use an SMTP
701/*	connection repeatedly.
702/* .IP "\fBsmtp_connection_cache_time_limit (2s)\fR"
703/*	When SMTP connection caching is enabled, the amount of time that
704/*	an unused SMTP client socket is kept open before it is closed.
705/* .PP
706/*	Available in Postfix version 2.3 and later:
707/* .IP "\fBconnection_cache_protocol_timeout (5s)\fR"
708/*	Time limit for connection cache connect, send or receive
709/*	operations.
710/* .PP
711/*	Available in Postfix version 2.9 - 3.6:
712/* .IP "\fBsmtp_per_record_deadline (no)\fR"
713/*	Change the behavior of the smtp_*_timeout time limits, from a
714/*	time limit per read or write system call, to a time limit to send
715/*	or receive a complete record (an SMTP command line, SMTP response
716/*	line, SMTP message content line, or TLS protocol message).
717/* .PP
718/*	Available in Postfix version 2.11 and later:
719/* .IP "\fBsmtp_connection_reuse_count_limit (0)\fR"
720/*	When SMTP connection caching is enabled, the number of times
721/*	that an SMTP session may be reused before it is closed, or zero (no
722/*	limit).
723/* .PP
724/*	Available in Postfix version 3.4 and later:
725/* .IP "\fBsmtp_tls_connection_reuse (no)\fR"
726/*	Try to make multiple deliveries per TLS-encrypted connection.
727/* .PP
728/*	Available in Postfix version 3.7 and later:
729/* .IP "\fBsmtp_per_request_deadline (no)\fR"
730/*	Change the behavior of the smtp_*_timeout time limits, from a
731/*	time limit per plaintext or TLS read or write call, to a combined
732/*	time limit for sending a complete SMTP request and for receiving a
733/*	complete SMTP response.
734/* .IP "\fBsmtp_min_data_rate (500)\fR"
735/*	The minimum plaintext data transfer rate in bytes/second for
736/*	DATA requests, when deadlines are enabled with smtp_per_request_deadline.
737/* .PP
738/*	Implemented in the qmgr(8) daemon:
739/* .IP "\fBtransport_destination_concurrency_limit ($default_destination_concurrency_limit)\fR"
740/*	A transport-specific override for the
741/*	default_destination_concurrency_limit parameter value, where
742/*	\fItransport\fR is the master.cf name of the message delivery
743/*	transport.
744/* .IP "\fBtransport_destination_recipient_limit ($default_destination_recipient_limit)\fR"
745/*	A transport-specific override for the
746/*	default_destination_recipient_limit parameter value, where
747/*	\fItransport\fR is the master.cf name of the message delivery
748/*	transport.
749/* SMTPUTF8 CONTROLS
750/* .ad
751/* .fi
752/*	Preliminary SMTPUTF8 support is introduced with Postfix 3.0.
753/* .IP "\fBsmtputf8_enable (yes)\fR"
754/*	Enable preliminary SMTPUTF8 support for the protocols described
755/*	in RFC 6531, RFC 6532, and RFC 6533.
756/* .IP "\fBsmtputf8_autodetect_classes (sendmail, verify)\fR"
757/*	Detect that a message requires SMTPUTF8 support for the specified
758/*	mail origin classes.
759/* .PP
760/*	Available in Postfix version 3.2 and later:
761/* .IP "\fBenable_idna2003_compatibility (no)\fR"
762/*	Enable 'transitional' compatibility between IDNA2003 and IDNA2008,
763/*	when converting UTF-8 domain names to/from the ASCII form that is
764/*	used for DNS lookups.
765/* TROUBLE SHOOTING CONTROLS
766/* .ad
767/* .fi
768/* .IP "\fBdebug_peer_level (2)\fR"
769/*	The increment in verbose logging level when a nexthop destination,
770/*	remote client or server name or network address matches a pattern
771/*	given with the debug_peer_list parameter.
772/* .IP "\fBdebug_peer_list (empty)\fR"
773/*	Optional list of nexthop destination, remote client or server
774/*	name or network address patterns that, if matched, cause the verbose
775/*	logging level to increase by the amount specified in $debug_peer_level.
776/* .IP "\fBerror_notice_recipient (postmaster)\fR"
777/*	The recipient of postmaster notifications about mail delivery
778/*	problems that are caused by policy, resource, software or protocol
779/*	errors.
780/* .IP "\fBinternal_mail_filter_classes (empty)\fR"
781/*	What categories of Postfix-generated mail are subject to
782/*	before-queue content inspection by non_smtpd_milters, header_checks
783/*	and body_checks.
784/* .IP "\fBnotify_classes (resource, software)\fR"
785/*	The list of error classes that are reported to the postmaster.
786/* MISCELLANEOUS CONTROLS
787/* .ad
788/* .fi
789/* .IP "\fBbest_mx_transport (empty)\fR"
790/*	Where the Postfix SMTP client should deliver mail when it detects
791/*	a "mail loops back to myself" error condition.
792/* .IP "\fBconfig_directory (see 'postconf -d' output)\fR"
793/*	The default location of the Postfix main.cf and master.cf
794/*	configuration files.
795/* .IP "\fBdaemon_timeout (18000s)\fR"
796/*	How much time a Postfix daemon process may take to handle a
797/*	request before it is terminated by a built-in watchdog timer.
798/* .IP "\fBdelay_logging_resolution_limit (2)\fR"
799/*	The maximal number of digits after the decimal point when logging
800/*	sub-second delay values.
801/* .IP "\fBdisable_dns_lookups (no)\fR"
802/*	Disable DNS lookups in the Postfix SMTP and LMTP clients.
803/* .IP "\fBinet_interfaces (all)\fR"
804/*	The local network interface addresses that this mail system receives
805/*	mail on.
806/* .IP "\fBinet_protocols (see 'postconf -d output')\fR"
807/*	The Internet protocols Postfix will attempt to use when making
808/*	or accepting connections.
809/* .IP "\fBipc_timeout (3600s)\fR"
810/*	The time limit for sending or receiving information over an internal
811/*	communication channel.
812/* .IP "\fBlmtp_assume_final (no)\fR"
813/*	When a remote LMTP server announces no DSN support, assume that
814/*	the
815/*	server performs final delivery, and send "delivered" delivery status
816/*	notifications instead of "relayed".
817/* .IP "\fBlmtp_tcp_port (24)\fR"
818/*	The default TCP port that the Postfix LMTP client connects to.
819/* .IP "\fBmax_idle (100s)\fR"
820/*	The maximum amount of time that an idle Postfix daemon process waits
821/*	for an incoming connection before terminating voluntarily.
822/* .IP "\fBmax_use (100)\fR"
823/*	The maximal number of incoming connections that a Postfix daemon
824/*	process will service before terminating voluntarily.
825/* .IP "\fBprocess_id (read-only)\fR"
826/*	The process ID of a Postfix command or daemon process.
827/* .IP "\fBprocess_name (read-only)\fR"
828/*	The process name of a Postfix command or daemon process.
829/* .IP "\fBproxy_interfaces (empty)\fR"
830/*	The remote network interface addresses that this mail system receives mail
831/*	on by way of a proxy or network address translation unit.
832/* .IP "\fBsmtp_address_preference (any)\fR"
833/*	The address type ("ipv6", "ipv4" or "any") that the Postfix
834/*	SMTP client will try first, when a destination has IPv6 and IPv4
835/*	addresses with equal MX preference.
836/* .IP "\fBsmtp_bind_address (empty)\fR"
837/*	An optional numerical network address that the Postfix SMTP client
838/*	should bind to when making an IPv4 connection.
839/* .IP "\fBsmtp_bind_address6 (empty)\fR"
840/*	An optional numerical network address that the Postfix SMTP client
841/*	should bind to when making an IPv6 connection.
842/* .IP "\fBsmtp_helo_name ($myhostname)\fR"
843/*	The hostname to send in the SMTP HELO or EHLO command.
844/* .IP "\fBlmtp_lhlo_name ($myhostname)\fR"
845/*	The hostname to send in the LMTP LHLO command.
846/* .IP "\fBsmtp_host_lookup (dns)\fR"
847/*	What mechanisms the Postfix SMTP client uses to look up a host's
848/*	IP address.
849/* .IP "\fBsmtp_randomize_addresses (yes)\fR"
850/*	Randomize the order of equal-preference MX host addresses.
851/* .IP "\fBsyslog_facility (mail)\fR"
852/*	The syslog facility of Postfix logging.
853/* .IP "\fBsyslog_name (see 'postconf -d' output)\fR"
854/*	A prefix that is prepended to the process name in syslog
855/*	records, so that, for example, "smtpd" becomes "prefix/smtpd".
856/* .PP
857/*	Available with Postfix 2.2 and earlier:
858/* .IP "\fBfallback_relay (empty)\fR"
859/*	Optional list of relay hosts for SMTP destinations that can't be
860/*	found or that are unreachable.
861/* .PP
862/*	Available with Postfix 2.3 and later:
863/* .IP "\fBsmtp_fallback_relay ($fallback_relay)\fR"
864/*	Optional list of relay destinations that will be used when an
865/*	SMTP destination is not found, or when delivery fails due to a
866/*	non-permanent error.
867/* .PP
868/*	Available with Postfix 3.0 and later:
869/* .IP "\fBsmtp_address_verify_target (rcpt)\fR"
870/*	In the context of email address verification, the SMTP protocol
871/*	stage that determines whether an email address is deliverable.
872/* .PP
873/*	Available with Postfix 3.1 and later:
874/* .IP "\fBlmtp_fallback_relay (empty)\fR"
875/*	Optional list of relay hosts for LMTP destinations that can't be
876/*	found or that are unreachable.
877/* .PP
878/*	Available with Postfix 3.2 and later:
879/* .IP "\fBsmtp_tcp_port (smtp)\fR"
880/*	The default TCP port that the Postfix SMTP client connects to.
881/* .PP
882/*	Available in Postfix 3.3 and later:
883/* .IP "\fBservice_name (read-only)\fR"
884/*	The master.cf service name of a Postfix daemon process.
885/* .PP
886/*	Available in Postfix 3.7 and later:
887/* .IP "\fBsmtp_bind_address_enforce (no)\fR"
888/*	Defer delivery when the Postfix SMTP client cannot apply the
889/*	smtp_bind_address or smtp_bind_address6 setting.
890/* SEE ALSO
891/*	generic(5), output address rewriting
892/*	header_checks(5), message header content inspection
893/*	body_checks(5), body parts content inspection
894/*	qmgr(8), queue manager
895/*	bounce(8), delivery status reports
896/*	scache(8), connection cache server
897/*	postconf(5), configuration parameters
898/*	master(5), generic daemon options
899/*	master(8), process manager
900/*	tlsmgr(8), TLS session and PRNG management
901/*	postlogd(8), Postfix logging
902/*	syslogd(8), system logging
903/* README FILES
904/* .ad
905/* .fi
906/*	Use "\fBpostconf readme_directory\fR" or
907/*	"\fBpostconf html_directory\fR" to locate this information.
908/* .na
909/* .nf
910/*	SASL_README, Postfix SASL howto
911/*	TLS_README, Postfix STARTTLS howto
912/* LICENSE
913/* .ad
914/* .fi
915/*	The Secure Mailer license must be distributed with this software.
916/* AUTHOR(S)
917/*	Wietse Venema
918/*	IBM T.J. Watson Research
919/*	P.O. Box 704
920/*	Yorktown Heights, NY 10598, USA
921/*
922/*	Wietse Venema
923/*	Google, Inc.
924/*	111 8th Avenue
925/*	New York, NY 10011, USA
926/*
927/*	Command pipelining in cooperation with:
928/*	Jon Ribbens
929/*	Oaktree Internet Solutions Ltd.,
930/*	Internet House,
931/*	Canal Basin,
932/*	Coventry,
933/*	CV1 4LY, United Kingdom.
934/*
935/*	SASL support originally by:
936/*	Till Franke
937/*	SuSE Rhein/Main AG
938/*	65760 Eschborn, Germany
939/*
940/*	TLS support originally by:
941/*	Lutz Jaenicke
942/*	BTU Cottbus
943/*	Allgemeine Elektrotechnik
944/*	Universitaetsplatz 3-4
945/*	D-03044 Cottbus, Germany
946/*
947/*	Revised TLS and SMTP connection cache support by:
948/*	Victor Duchovni
949/*	Morgan Stanley
950/*--*/
951
952/* System library. */
953
954#include <sys_defs.h>
955#include <unistd.h>
956#include <stdlib.h>
957#include <string.h>
958#include <fcntl.h>
959#include <dict.h>
960#include <stringops.h>
961
962/* Utility library. */
963
964#include <msg.h>
965#include <mymalloc.h>
966#include <name_mask.h>
967#include <name_code.h>
968#include <byte_mask.h>
969
970/* Global library. */
971
972#include <deliver_request.h>
973#include <delivered_hdr.h>
974#include <mail_proto.h>
975#include <mail_params.h>
976#include <mail_version.h>
977#include <mail_conf.h>
978#include <debug_peer.h>
979#include <flush_clnt.h>
980#include <scache.h>
981#include <string_list.h>
982#include <maps.h>
983#include <ext_prop.h>
984#include <hfrom_format.h>
985
986/* DNS library. */
987
988#include <dns.h>
989
990/* Single server skeleton. */
991
992#include <mail_server.h>
993
994/* Application-specific. */
995
996#include "smtp.h"
997#include "smtp_sasl.h"
998
999 /*
1000  * Tunable parameters. These have compiled-in defaults that can be overruled
1001  * by settings in the global Postfix configuration file.
1002  */
1003int     var_smtp_conn_tmout;
1004int     var_smtp_helo_tmout;
1005int     var_smtp_xfwd_tmout;
1006int     var_smtp_mail_tmout;
1007int     var_smtp_rcpt_tmout;
1008int     var_smtp_data0_tmout;
1009int     var_smtp_data1_tmout;
1010int     var_smtp_data2_tmout;
1011int     var_smtp_rset_tmout;
1012int     var_smtp_quit_tmout;
1013char   *var_notify_classes;
1014int     var_smtp_skip_5xx_greeting;
1015int     var_ign_mx_lookup_err;
1016int     var_skip_quit_resp;
1017char   *var_fallback_relay;
1018char   *var_bestmx_transp;
1019char   *var_error_rcpt;
1020int     var_smtp_always_ehlo;
1021int     var_smtp_never_ehlo;
1022char   *var_smtp_sasl_opts;
1023char   *var_smtp_sasl_path;
1024char   *var_smtp_sasl_passwd;
1025bool    var_smtp_sasl_enable;
1026char   *var_smtp_sasl_mechs;
1027char   *var_smtp_sasl_type;
1028char   *var_smtp_bind_addr;
1029char   *var_smtp_bind_addr6;
1030char   *var_smtp_vrfy_tgt;
1031bool    var_smtp_rand_addr;
1032int     var_smtp_pix_thresh;
1033int     var_queue_run_delay;
1034int     var_min_backoff_time;
1035int     var_smtp_pix_delay;
1036int     var_smtp_line_limit;
1037char   *var_smtp_helo_name;
1038char   *var_smtp_host_lookup;
1039bool    var_smtp_quote_821_env;
1040bool    var_smtp_defer_mxaddr;
1041bool    var_smtp_send_xforward;
1042int     var_smtp_mxaddr_limit;
1043int     var_smtp_mxsess_limit;
1044int     var_smtp_cache_conn;
1045int     var_smtp_reuse_time;
1046int     var_smtp_reuse_count;
1047char   *var_smtp_cache_dest;
1048char   *var_scache_service;		/* You can now leave this here. */
1049bool    var_smtp_cache_demand;
1050char   *var_smtp_ehlo_dis_words;
1051char   *var_smtp_ehlo_dis_maps;
1052char   *var_smtp_addr_pref;
1053
1054char   *var_smtp_tls_level;
1055bool    var_smtp_use_tls;
1056bool    var_smtp_enforce_tls;
1057char   *var_smtp_tls_per_site;
1058char   *var_smtp_tls_policy;
1059bool    var_smtp_tls_wrappermode;
1060bool    var_smtp_tls_conn_reuse;
1061char   *var_tlsproxy_service;
1062
1063#ifdef USE_TLS
1064char   *var_smtp_sasl_tls_opts;
1065char   *var_smtp_sasl_tlsv_opts;
1066int     var_smtp_starttls_tmout;
1067char   *var_smtp_tls_CAfile;
1068char   *var_smtp_tls_CApath;
1069char   *var_smtp_tls_chain_files;
1070char   *var_smtp_tls_cert_file;
1071char   *var_smtp_tls_mand_ciph;
1072char   *var_smtp_tls_excl_ciph;
1073char   *var_smtp_tls_mand_excl;
1074char   *var_smtp_tls_dcert_file;
1075char   *var_smtp_tls_dkey_file;
1076bool    var_smtp_tls_enforce_peername;
1077char   *var_smtp_tls_key_file;
1078char   *var_smtp_tls_loglevel;
1079bool    var_smtp_tls_note_starttls_offer;
1080char   *var_smtp_tls_mand_proto;
1081char   *var_smtp_tls_sec_cmatch;
1082int     var_smtp_tls_scert_vd;
1083char   *var_smtp_tls_vfy_cmatch;
1084char   *var_smtp_tls_fpt_cmatch;
1085char   *var_smtp_tls_fpt_dgst;
1086char   *var_smtp_tls_tafile;
1087char   *var_smtp_tls_proto;
1088char   *var_smtp_tls_ciph;
1089char   *var_smtp_tls_eccert_file;
1090char   *var_smtp_tls_eckey_file;
1091char   *var_smtp_tls_sni;
1092bool    var_smtp_tls_blk_early_mail_reply;
1093bool    var_smtp_tls_force_tlsa;
1094char   *var_smtp_tls_insecure_mx_policy;
1095
1096#endif
1097
1098char   *var_smtp_generic_maps;
1099char   *var_prop_extension;
1100bool    var_smtp_sender_auth;
1101char   *var_smtp_tcp_port;
1102int     var_scache_proto_tmout;
1103bool    var_smtp_cname_overr;
1104char   *var_smtp_pix_bug_words;
1105char   *var_smtp_pix_bug_maps;
1106char   *var_cyrus_conf_path;
1107char   *var_smtp_head_chks;
1108char   *var_smtp_mime_chks;
1109char   *var_smtp_nest_chks;
1110char   *var_smtp_body_chks;
1111char   *var_smtp_resp_filter;
1112bool    var_lmtp_assume_final;
1113char   *var_smtp_dns_res_opt;
1114char   *var_smtp_dns_support;
1115bool    var_smtp_dummy_mail_auth;
1116char   *var_smtp_dsn_filter;
1117char   *var_smtp_dns_re_filter;
1118bool    var_smtp_balance_inet_proto;
1119bool    var_smtp_req_deadline;
1120int     var_smtp_min_data_rate;
1121char   *var_use_srv_lookup;
1122bool	var_ign_srv_lookup_err;
1123bool	var_allow_srv_fallback;
1124
1125 /* Special handling of 535 AUTH errors. */
1126char   *var_smtp_sasl_auth_cache_name;
1127int     var_smtp_sasl_auth_cache_time;
1128bool    var_smtp_sasl_auth_soft_bounce;
1129
1130char   *var_hfrom_format;
1131bool var_smtp_bind_addr_enforce;
1132
1133 /*
1134  * Global variables.
1135  */
1136int     smtp_mode;
1137int     smtp_host_lookup_mask;
1138int     smtp_dns_support;
1139STRING_LIST *smtp_cache_dest;
1140SCACHE *smtp_scache;
1141MAPS   *smtp_ehlo_dis_maps;
1142MAPS   *smtp_generic_maps;
1143int     smtp_ext_prop_mask;
1144unsigned smtp_dns_res_opt;
1145MAPS   *smtp_pix_bug_maps;
1146HBC_CHECKS *smtp_header_checks;		/* limited header checks */
1147HBC_CHECKS *smtp_body_checks;		/* limited body checks */
1148SMTP_CLI_ATTR smtp_cli_attr;		/* parsed command-line */
1149int     smtp_hfrom_format;		/* postmaster notifications */
1150STRING_LIST *smtp_use_srv_lookup;
1151
1152#ifdef USE_TLS
1153
1154 /*
1155  * OpenSSL client state (opaque handle)
1156  */
1157TLS_APPL_STATE *smtp_tls_ctx;
1158int     smtp_tls_insecure_mx_policy;
1159
1160#endif
1161
1162 /*
1163  * IPv6 preference.
1164  */
1165static int smtp_addr_pref;
1166
1167/* get_cli_attr - get command-line attributes */
1168
1169static void get_cli_attr(SMTP_CLI_ATTR *attr, char **argv)
1170{
1171    const char myname[] = "get_cli_attr";
1172    const char *last_flags = "flags=";	/* i.e. empty */
1173    static const BYTE_MASK flags_map[] = {
1174	'D', SMTP_CLI_FLAG_DELIVERED_TO,
1175	'O', SMTP_CLI_FLAG_ORIG_RCPT,
1176	'R', SMTP_CLI_FLAG_RETURN_PATH,
1177	'X', SMTP_CLI_FLAG_FINAL_DELIVERY,
1178	0,
1179    };
1180
1181    /*
1182     * Initialize.
1183     */
1184    attr->flags = 0;
1185
1186    /*
1187     * Iterate over the command-line attribute list. Errors are fatal.
1188     */
1189    for ( /* void */ ; *argv != 0; argv++) {
1190
1191	/*
1192	 * flags=stuff. Errors are fatal.
1193	 */
1194	if (strncasecmp("flags=", *argv, sizeof("flags=") - 1) == 0) {
1195	    last_flags = *argv;
1196	    if (msg_verbose)
1197		msg_info("%s: %s", myname, last_flags);
1198	    attr->flags = byte_mask(*argv, flags_map,
1199				    *argv + sizeof("flags=") - 1);
1200	}
1201
1202	/*
1203	 * Bad.
1204	 */
1205	else
1206	    msg_fatal("unknown attribute name: %s", *argv);
1207    }
1208
1209    /*
1210     * Backwards compatibility, redundancy, and obsolescence.
1211     */
1212    if (!smtp_mode && var_lmtp_assume_final
1213	&& (attr->flags & SMTP_CLI_FLAG_FINAL_DELIVERY) == 0) {
1214	attr->flags |= SMTP_CLI_FLAG_FINAL_DELIVERY;
1215	msg_warn("%s is obsolete; instead, specify \"%sX\" in %s",
1216		 VAR_LMTP_ASSUME_FINAL, last_flags, MASTER_CONF_FILE);
1217    }
1218}
1219
1220/* deliver_message - deliver message with extreme prejudice */
1221
1222static int deliver_message(const char *service, DELIVER_REQUEST *request)
1223{
1224    SMTP_STATE *state;
1225    int     result;
1226
1227    if (msg_verbose)
1228	msg_info("deliver_message: from %s", request->sender);
1229
1230    /*
1231     * Sanity checks. The smtp server is unprivileged and chrooted, so we can
1232     * afford to distribute the data censoring code, instead of having it all
1233     * in one place.
1234     */
1235    if (request->nexthop[0] == 0)
1236	msg_fatal("empty nexthop hostname");
1237    if (request->rcpt_list.len <= 0)
1238	msg_fatal("recipient count: %d", request->rcpt_list.len);
1239
1240    /*
1241     * D flag checks.
1242     */
1243    if (smtp_cli_attr.flags & SMTP_CLI_FLAG_DELIVERED_TO) {
1244
1245	/*
1246	 * The D flag cannot be specified for multi-recipient deliveries.
1247	 */
1248	if (request->rcpt_list.len > 1) {
1249	    msg_warn("flag `D' requires %s_destination_recipient_limit = 1",
1250		     service);
1251	    return (reject_deliver_request(service, request, "4.3.5",
1252					"mail system configuration error"));
1253	}
1254
1255	/*
1256	 * The recipient cannot appear in a Delivered-To: header.
1257	 */
1258	else {
1259	    DELIVERED_HDR_INFO *delivered_info = delivered_hdr_init(
1260			  request->fp, request->data_offset, FOLD_ADDR_ALL);
1261	    VSTRING *generic_rcpt = vstring_alloc(100);
1262	    int     have_delivered_loop;
1263
1264	    smtp_rewrite_generic_internal(generic_rcpt,
1265					  request->rcpt_list.info->address);
1266	    have_delivered_loop = delivered_hdr_find(
1267					 delivered_info, STR(generic_rcpt));
1268	    vstring_free(generic_rcpt);
1269	    delivered_hdr_free(delivered_info);
1270	    if (have_delivered_loop) {
1271		return (reject_deliver_request(service, request, "5.4.6",
1272					       "mail forwarding loop for %s",
1273					 request->rcpt_list.info->address));
1274	    }
1275	}
1276    }
1277
1278    /*
1279     * The O flag cannot be specified for multi-recipient deliveries.
1280     */
1281    if ((smtp_cli_attr.flags & SMTP_CLI_FLAG_ORIG_RCPT)
1282	&& request->rcpt_list.len > 1) {
1283	msg_warn("flag `O' requires %s_destination_recipient_limit = 1",
1284		 service);
1285	return (reject_deliver_request(service, request, "4.3.5",
1286				       "mail system configuration error"));
1287    }
1288
1289    /*
1290     * Initialize. Bundle all information about the delivery request, so that
1291     * we can produce understandable diagnostics when something goes wrong
1292     * many levels below. The alternative would be to make everything global.
1293     */
1294    state = smtp_state_alloc();
1295    state->request = request;
1296    state->src = request->fp;
1297    state->service = service;
1298    state->misc_flags |= smtp_addr_pref;
1299    state->debug_peer_per_nexthop =
1300	debug_peer_check(request->nexthop, "noaddr");
1301    SMTP_RCPT_INIT(state);
1302
1303    /*
1304     * Establish an SMTP session and deliver this message to all requested
1305     * recipients. At the end, notify the postmaster of any protocol errors.
1306     * Optionally deliver mail locally when this machine is the best mail
1307     * exchanger.
1308     */
1309    result = smtp_connect(state);
1310
1311    /*
1312     * Clean up.
1313     */
1314    smtp_state_free(state);
1315
1316    return (result);
1317}
1318
1319/* smtp_service - perform service for client */
1320
1321static void smtp_service(VSTREAM *client_stream, char *service,
1322			         char **unused_argv)
1323{
1324    DELIVER_REQUEST *request;
1325    int     status;
1326
1327    /*
1328     * This routine runs whenever a client connects to the UNIX-domain socket
1329     * dedicated to remote SMTP delivery service. What we see below is a
1330     * little protocol to (1) tell the queue manager that we are ready, (2)
1331     * read a request from the queue manager, and (3) report the completion
1332     * status of that request. All connection-management stuff is handled by
1333     * the common code in single_server.c.
1334     */
1335    if ((request = deliver_request_read(client_stream)) != 0) {
1336	status = deliver_message(service, request);
1337	deliver_request_done(client_stream, request, status);
1338    }
1339}
1340
1341/* post_init - post-jail initialization */
1342
1343static void post_init(char *unused_name, char **argv)
1344{
1345    static const NAME_MASK lookup_masks[] = {
1346	SMTP_HOST_LOOKUP_DNS, SMTP_HOST_FLAG_DNS,
1347	SMTP_HOST_LOOKUP_NATIVE, SMTP_HOST_FLAG_NATIVE,
1348	0,
1349    };
1350    static const NAME_MASK dns_res_opt_masks[] = {
1351	SMTP_DNS_RES_OPT_DEFNAMES, RES_DEFNAMES,
1352	SMTP_DNS_RES_OPT_DNSRCH, RES_DNSRCH,
1353	0,
1354    };
1355    static const NAME_CODE dns_support[] = {
1356	SMTP_DNS_SUPPORT_DISABLED, SMTP_DNS_DISABLED,
1357	SMTP_DNS_SUPPORT_ENABLED, SMTP_DNS_ENABLED,
1358#if (RES_USE_DNSSEC != 0) && (RES_USE_EDNS0 != 0)
1359	SMTP_DNS_SUPPORT_DNSSEC, SMTP_DNS_DNSSEC,
1360#endif
1361	0, SMTP_DNS_INVALID,
1362    };
1363
1364    if (*var_smtp_dns_support == 0) {
1365	/* Backwards compatible empty setting */
1366	smtp_dns_support =
1367	    var_disable_dns ? SMTP_DNS_DISABLED : SMTP_DNS_ENABLED;
1368    } else {
1369	smtp_dns_support =
1370	    name_code(dns_support, NAME_CODE_FLAG_NONE, var_smtp_dns_support);
1371	if (smtp_dns_support == SMTP_DNS_INVALID)
1372	    msg_fatal("invalid %s: \"%s\"", VAR_LMTP_SMTP(DNS_SUPPORT),
1373		      var_smtp_dns_support);
1374	var_disable_dns = (smtp_dns_support == SMTP_DNS_DISABLED);
1375    }
1376
1377#ifdef USE_TLS
1378    if (smtp_mode) {
1379	smtp_tls_insecure_mx_policy =
1380	    tls_level_lookup(var_smtp_tls_insecure_mx_policy);
1381	switch (smtp_tls_insecure_mx_policy) {
1382	case TLS_LEV_MAY:
1383	case TLS_LEV_ENCRYPT:
1384	case TLS_LEV_DANE:
1385	    break;
1386	default:
1387	    msg_fatal("invalid %s: \"%s\"", VAR_SMTP_TLS_INSECURE_MX_POLICY,
1388		      var_smtp_tls_insecure_mx_policy);
1389	}
1390    }
1391#endif
1392
1393    /*
1394     * Select hostname lookup mechanisms.
1395     */
1396    if (smtp_dns_support == SMTP_DNS_DISABLED)
1397	smtp_host_lookup_mask = SMTP_HOST_FLAG_NATIVE;
1398    else
1399	smtp_host_lookup_mask =
1400	    name_mask(VAR_LMTP_SMTP(HOST_LOOKUP), lookup_masks,
1401		      var_smtp_host_lookup);
1402    if (msg_verbose)
1403	msg_info("host name lookup methods: %s",
1404		 str_name_mask(VAR_LMTP_SMTP(HOST_LOOKUP), lookup_masks,
1405			       smtp_host_lookup_mask));
1406
1407    /*
1408     * Session cache instance.
1409     */
1410    if (*var_smtp_cache_dest || var_smtp_cache_demand)
1411#if 0
1412	smtp_scache = scache_multi_create();
1413#else
1414	smtp_scache = scache_clnt_create(var_scache_service,
1415					 var_scache_proto_tmout,
1416					 var_ipc_idle_limit,
1417					 var_ipc_ttl_limit);
1418#endif
1419
1420    /*
1421     * Select DNS query flags.
1422     */
1423    smtp_dns_res_opt = name_mask(VAR_LMTP_SMTP(DNS_RES_OPT), dns_res_opt_masks,
1424				 var_smtp_dns_res_opt);
1425
1426    /*
1427     * Address verification.
1428     */
1429    smtp_vrfy_init();
1430
1431    /*
1432     * Look up service command-line attributes; these do not change during
1433     * the process lifetime.
1434     */
1435    get_cli_attr(&smtp_cli_attr, argv);
1436
1437    /*
1438     * header_from format, for postmaster notifications.
1439     */
1440    smtp_hfrom_format = hfrom_format_parse(VAR_HFROM_FORMAT, var_hfrom_format);
1441
1442    /*
1443     * Service discovery with SRV record lookup.
1444     */
1445    if (*var_use_srv_lookup)
1446	smtp_use_srv_lookup = string_list_init(VAR_USE_SRV_LOOKUP,
1447					       MATCH_FLAG_RETURN,
1448					       var_use_srv_lookup);
1449}
1450
1451/* pre_init - pre-jail initialization */
1452
1453static void pre_init(char *unused_name, char **unused_argv)
1454{
1455    int     use_tls;
1456    static const NAME_CODE addr_pref_map[] = {
1457	INET_PROTO_NAME_IPV6, SMTP_MISC_FLAG_PREF_IPV6,
1458	INET_PROTO_NAME_IPV4, SMTP_MISC_FLAG_PREF_IPV4,
1459	INET_PROTO_NAME_ANY, 0,
1460	0, -1,
1461    };
1462
1463    /*
1464     * Turn on per-peer debugging.
1465     */
1466    debug_peer_init();
1467
1468    /*
1469     * SASL initialization.
1470     */
1471    if (var_smtp_sasl_enable)
1472#ifdef USE_SASL_AUTH
1473	smtp_sasl_initialize();
1474#else
1475	msg_warn("%s is true, but SASL support is not compiled in",
1476		 VAR_LMTP_SMTP(SASL_ENABLE));
1477#endif
1478
1479    if (*var_smtp_tls_level != 0)
1480#ifdef USE_TLS
1481	switch (tls_level_lookup(var_smtp_tls_level)) {
1482	case TLS_LEV_SECURE:
1483	case TLS_LEV_VERIFY:
1484	case TLS_LEV_DANE_ONLY:
1485	case TLS_LEV_FPRINT:
1486	case TLS_LEV_ENCRYPT:
1487	    var_smtp_use_tls = var_smtp_enforce_tls = 1;
1488	    break;
1489	case TLS_LEV_DANE:
1490	case TLS_LEV_MAY:
1491	    var_smtp_use_tls = 1;
1492	    var_smtp_enforce_tls = 0;
1493	    break;
1494	case TLS_LEV_NONE:
1495	    var_smtp_use_tls = var_smtp_enforce_tls = 0;
1496	    break;
1497	default:
1498	    /* tls_level_lookup() logs no warning. */
1499	    /* session_tls_init() assumes that var_smtp_tls_level is sane. */
1500	    msg_fatal("Invalid TLS level \"%s\"", var_smtp_tls_level);
1501	}
1502#endif
1503    use_tls = (var_smtp_use_tls || var_smtp_enforce_tls);
1504
1505    /*
1506     * Initialize the TLS data before entering the chroot jail
1507     */
1508    if (use_tls || var_smtp_tls_per_site[0] || var_smtp_tls_policy[0]) {
1509#ifdef USE_TLS
1510	TLS_CLIENT_INIT_PROPS props;
1511
1512	tls_pre_jail_init(TLS_ROLE_CLIENT);
1513
1514	/*
1515	 * We get stronger type safety and a cleaner interface by combining
1516	 * the various parameters into a single tls_client_props structure.
1517	 *
1518	 * Large parameter lists are error-prone, so we emulate a language
1519	 * feature that C does not have natively: named parameter lists.
1520	 *
1521	 * With tlsproxy(8) turned on, this is still needed for DANE-related
1522	 * initializations.
1523	 */
1524	smtp_tls_ctx =
1525	    TLS_CLIENT_INIT(&props,
1526			    log_param = VAR_LMTP_SMTP(TLS_LOGLEVEL),
1527			    log_level = var_smtp_tls_loglevel,
1528			    verifydepth = var_smtp_tls_scert_vd,
1529			    cache_type = LMTP_SMTP_SUFFIX(TLS_MGR_SCACHE),
1530			    chain_files = var_smtp_tls_chain_files,
1531			    cert_file = var_smtp_tls_cert_file,
1532			    key_file = var_smtp_tls_key_file,
1533			    dcert_file = var_smtp_tls_dcert_file,
1534			    dkey_file = var_smtp_tls_dkey_file,
1535			    eccert_file = var_smtp_tls_eccert_file,
1536			    eckey_file = var_smtp_tls_eckey_file,
1537			    CAfile = var_smtp_tls_CAfile,
1538			    CApath = var_smtp_tls_CApath,
1539			    mdalg = var_smtp_tls_fpt_dgst);
1540	smtp_tls_list_init();
1541	tls_dane_loglevel(VAR_LMTP_SMTP(TLS_LOGLEVEL), var_smtp_tls_loglevel);
1542#else
1543	msg_warn("TLS has been selected, but TLS support is not compiled in");
1544#endif
1545    }
1546
1547    /*
1548     * Flush client.
1549     */
1550    flush_init();
1551
1552    /*
1553     * Session cache domain list.
1554     */
1555    if (*var_smtp_cache_dest)
1556	smtp_cache_dest = string_list_init(VAR_SMTP_CACHE_DEST,
1557					   MATCH_FLAG_RETURN,
1558					   var_smtp_cache_dest);
1559
1560    /*
1561     * EHLO keyword filter.
1562     */
1563    if (*var_smtp_ehlo_dis_maps)
1564	smtp_ehlo_dis_maps = maps_create(VAR_LMTP_SMTP(EHLO_DIS_MAPS),
1565					 var_smtp_ehlo_dis_maps,
1566					 DICT_FLAG_LOCK);
1567
1568    /*
1569     * PIX bug workarounds.
1570     */
1571    if (*var_smtp_pix_bug_maps)
1572	smtp_pix_bug_maps = maps_create(VAR_LMTP_SMTP(PIX_BUG_MAPS),
1573					var_smtp_pix_bug_maps,
1574					DICT_FLAG_LOCK);
1575
1576    /*
1577     * Generic maps.
1578     */
1579    if (*var_prop_extension)
1580	smtp_ext_prop_mask =
1581	    ext_prop_mask(VAR_PROP_EXTENSION, var_prop_extension);
1582    if (*var_smtp_generic_maps)
1583	smtp_generic_maps =
1584	    maps_create(VAR_LMTP_SMTP(GENERIC_MAPS), var_smtp_generic_maps,
1585			DICT_FLAG_LOCK | DICT_FLAG_FOLD_FIX
1586			| DICT_FLAG_UTF8_REQUEST);
1587
1588    /*
1589     * Header/body checks.
1590     */
1591    smtp_header_checks = hbc_header_checks_create(
1592			       VAR_LMTP_SMTP(HEAD_CHKS), var_smtp_head_chks,
1593			       VAR_LMTP_SMTP(MIME_CHKS), var_smtp_mime_chks,
1594			       VAR_LMTP_SMTP(NEST_CHKS), var_smtp_nest_chks,
1595						  smtp_hbc_callbacks);
1596    smtp_body_checks = hbc_body_checks_create(
1597			       VAR_LMTP_SMTP(BODY_CHKS), var_smtp_body_chks,
1598					      smtp_hbc_callbacks);
1599
1600    /*
1601     * Server reply filter.
1602     */
1603    if (*var_smtp_resp_filter)
1604	smtp_chat_resp_filter =
1605	    dict_open(var_smtp_resp_filter, O_RDONLY,
1606		      DICT_FLAG_LOCK | DICT_FLAG_FOLD_FIX);
1607
1608    /*
1609     * Address family preference.
1610     */
1611    if (*var_smtp_addr_pref) {
1612	smtp_addr_pref = name_code(addr_pref_map, NAME_CODE_FLAG_NONE,
1613				   var_smtp_addr_pref);
1614	if (smtp_addr_pref < 0)
1615	    msg_fatal("bad %s value: %s", VAR_LMTP_SMTP(ADDR_PREF),
1616		      var_smtp_addr_pref);
1617    }
1618
1619    /*
1620     * DNS reply filter.
1621     */
1622    if (*var_smtp_dns_re_filter)
1623	dns_rr_filter_compile(VAR_LMTP_SMTP(DNS_RE_FILTER),
1624			      var_smtp_dns_re_filter);
1625}
1626
1627/* pre_accept - see if tables have changed */
1628
1629static void pre_accept(char *unused_name, char **unused_argv)
1630{
1631    const char *table;
1632
1633    if ((table = dict_changed_name()) != 0) {
1634	msg_info("table %s has changed -- restarting", table);
1635	exit(0);
1636    }
1637}
1638
1639MAIL_VERSION_STAMP_DECLARE;
1640
1641/* main - pass control to the single-threaded skeleton */
1642
1643int     main(int argc, char **argv)
1644{
1645    char   *sane_procname;
1646
1647#include "smtp_params.c"
1648#include "lmtp_params.c"
1649
1650    /*
1651     * Fingerprint executables and core dumps.
1652     */
1653    MAIL_VERSION_STAMP_ALLOCATE;
1654
1655    /*
1656     * XXX At this point, var_procname etc. are not initialized.
1657     *
1658     * The process name, "smtp" or "lmtp", determines the protocol, the DSN
1659     * server reply type, SASL service information lookup, and more. Prepare
1660     * for the possibility there may be another personality.
1661     */
1662    sane_procname = sane_basename((VSTRING *) 0, argv[0]);
1663    if (strcmp(sane_procname, "smtp") == 0)
1664	smtp_mode = 1;
1665    else if (strcmp(sane_procname, "lmtp") == 0)
1666	smtp_mode = 0;
1667    else
1668	/* TODO: logging is not initialized. */
1669	msg_fatal("unexpected process name \"%s\" - "
1670		  "specify \"smtp\" or \"lmtp\"", var_procname);
1671
1672    /*
1673     * Initialize with the LMTP or SMTP parameter name space.
1674     */
1675    single_server_main(argc, argv, smtp_service,
1676		       CA_MAIL_SERVER_TIME_TABLE(smtp_mode ?
1677					 smtp_time_table : lmtp_time_table),
1678		       CA_MAIL_SERVER_INT_TABLE(smtp_mode ?
1679					   smtp_int_table : lmtp_int_table),
1680		       CA_MAIL_SERVER_STR_TABLE(smtp_mode ?
1681					   smtp_str_table : lmtp_str_table),
1682		       CA_MAIL_SERVER_BOOL_TABLE(smtp_mode ?
1683					 smtp_bool_table : lmtp_bool_table),
1684		       CA_MAIL_SERVER_NBOOL_TABLE(smtp_mode ?
1685				       smtp_nbool_table : lmtp_nbool_table),
1686		       CA_MAIL_SERVER_PRE_INIT(pre_init),
1687		       CA_MAIL_SERVER_POST_INIT(post_init),
1688		       CA_MAIL_SERVER_PRE_ACCEPT(pre_accept),
1689		       CA_MAIL_SERVER_BOUNCE_INIT(VAR_SMTP_DSN_FILTER,
1690						  &var_smtp_dsn_filter),
1691		       0);
1692}
1693