Home | History | Annotate | Line # | Download | only in global
      1 /*	$NetBSD: mail_proto.h,v 1.7 2026/05/09 18:49:16 christos Exp $	*/
      2 
      3 #ifndef _MAIL_PROTO_H_INCLUDED_
      4 #define _MAIL_PROTO_H_INCLUDED_
      5 
      6 /*++
      7 /* NAME
      8 /*	mail_proto 3h
      9 /* SUMMARY
     10 /*	mail internal and external protocol support
     11 /* SYNOPSIS
     12 /*	#include <mail_proto.h>
     13 /* DESCRIPTION
     14 /* .nf
     15 
     16  /*
     17   * System library.
     18   */
     19 #include <stdarg.h>
     20 #include <string.h>
     21 
     22  /*
     23   * Utility library.
     24   */
     25 #include <vstream.h>
     26 #include <iostuff.h>
     27 #include <attr.h>
     28 
     29  /*
     30   * External protocols.
     31   */
     32 #define MAIL_PROTO_SMTP		"SMTP"
     33 #define MAIL_PROTO_ESMTP	"ESMTP"
     34 #define MAIL_PROTO_QMQP		"QMQP"
     35 
     36  /*
     37   * Names of services: these are the names of the UNIX-domain socket or FIFO
     38   * that a service listens on.
     39   */
     40 #define MAIL_SERVICE_BOUNCE	"bounce"
     41 #define MAIL_SERVICE_CLEANUP	"cleanup"
     42 #define MAIL_SERVICE_DEFER	"defer"
     43 #define MAIL_SERVICE_FORWARD	"forward"
     44 #define MAIL_SERVICE_LOCAL	"local"
     45 #define MAIL_SERVICE_PICKUP	"pickup"
     46 #define MAIL_SERVICE_QUEUE	"qmgr"
     47 #define MAIL_SERVICE_TLSMGR	"tlsmgr"
     48 #define MAIL_SERVICE_RESOLVE	"resolve"
     49 #define MAIL_SERVICE_REWRITE	"rewrite"
     50 #define MAIL_SERVICE_VIRTUAL	"virtual"
     51 #define MAIL_SERVICE_SMTP	"smtp"
     52 #define MAIL_SERVICE_SMTPD	"smtpd"
     53 #define MAIL_SERVICE_SHOWQ	"showq"
     54 #define MAIL_SERVICE_ERROR	"error"
     55 #define MAIL_SERVICE_RETRY	"retry"
     56 #define MAIL_SERVICE_FLUSH	"flush"
     57 #define MAIL_SERVICE_VERIFY	"verify"
     58 #define MAIL_SERVICE_TRACE	"trace"
     59 #define MAIL_SERVICE_RELAY	"relay"
     60 #define MAIL_SERVICE_PROXYMAP	"proxymap"
     61 #define MAIL_SERVICE_PROXYWRITE	"proxywrite"
     62 #define MAIL_SERVICE_SCACHE	"scache"
     63 #define MAIL_SERVICE_DNSBLOG	"dnsblog"
     64 #define MAIL_SERVICE_TLSPROXY	"tlsproxy"
     65 #define MAIL_SERVICE_POSTLOG	"postlog"
     66 
     67  /*
     68   * Process names: convention is to use the basename of an executable file,
     69   * but there is nothing to enforce that.
     70   */
     71 #define MAIL_PROC_NAME_SMTP	"smtp"
     72 #define MAIL_PROC_NAME_LMTP	"lmtp"
     73 
     74  /*
     75   * Mail source classes. Used to specify policy decisions for content
     76   * inspection and SMTPUTF8 detection.
     77   */
     78 #define MAIL_SRC_NAME_SENDMAIL	"sendmail"	/* sendmail(1) */
     79 #define MAIL_SRC_NAME_SMTPD	"smtpd"	/* smtpd(8) */
     80 #define MAIL_SRC_NAME_QMQPD	"qmqpd"	/* qmqpd(8) */
     81 #define MAIL_SRC_NAME_FORWARD	"forward"	/* local(8) forward/alias */
     82 #define MAIL_SRC_NAME_BOUNCE	"bounce"/* bounce(8) */
     83 #define MAIL_SRC_NAME_NOTIFY	"notify"/* protocol etc. errors */
     84 #define MAIL_SRC_NAME_VERIFY	"verify"/* protocol etc. errors */
     85 #define MAIL_SRC_NAME_ALL	"all"	/* all sources */
     86 
     87 #define MAIL_SRC_MASK_SENDMAIL	(1<<0)	/* sendmail(1) */
     88 #define MAIL_SRC_MASK_SMTPD	(1<<1)	/* smtpd(8) */
     89 #define MAIL_SRC_MASK_QMQPD	(1<<2)	/* qmqpd(8) */
     90 #define MAIL_SRC_MASK_FORWARD	(1<<3)	/* local(8) forward/alias */
     91 #define MAIL_SRC_MASK_BOUNCE	(1<<4)	/* bounce(8) */
     92 #define MAIL_SRC_MASK_NOTIFY	(1<<5)	/* protocol etc. errors */
     93 #define MAIL_SRC_MASK_VERIFY	(1<<6)	/* protocol etc. errors */
     94 
     95 #define MAIL_SRC_MASK_ALL \
     96 	( MAIL_SRC_MASK_SENDMAIL | MAIL_SRC_MASK_SMTPD \
     97 	| MAIL_SRC_MASK_QMQPD |  MAIL_SRC_MASK_FORWARD \
     98 	| MAIL_SRC_MASK_BOUNCE | MAIL_SRC_MASK_NOTIFY \
     99 	| MAIL_SRC_MASK_VERIFY)
    100 
    101  /*
    102   * Well-known socket or FIFO directories. The main difference is in file
    103   * access permissions.
    104   */
    105 #define MAIL_CLASS_PUBLIC	"public"
    106 #define MAIL_CLASS_PRIVATE	"private"
    107 
    108  /*
    109   * Generic triggers.
    110   */
    111 #define TRIGGER_REQ_WAKEUP	'W'	/* wakeup */
    112 
    113  /*
    114   * Queue manager requests.
    115   */
    116 #define QMGR_REQ_SCAN_DEFERRED	'D'	/* scan deferred queue */
    117 #define QMGR_REQ_SCAN_INCOMING	'I'	/* scan incoming queue */
    118 #define QMGR_REQ_FLUSH_DEAD	'F'	/* flush dead xport/site */
    119 #define QMGR_REQ_SCAN_ALL	'A'	/* ignore time stamps */
    120 
    121  /*
    122   * Functional interface.
    123   */
    124 extern VSTREAM *mail_connect(const char *, const char *, int);
    125 extern VSTREAM *mail_connect_wait(const char *, const char *);
    126 extern int mail_command_client(const char *, const char *, const char *,...);
    127 extern int mail_command_server(VSTREAM *,...);
    128 extern int mail_trigger(const char *, const char *, const char *, ssize_t);
    129 extern char *mail_pathname(const char *, const char *);
    130 
    131  /*
    132   * Each Postfix internal service identifies the protocol that it intends to
    133   * use. On the receiver end, this information does not contribute to the
    134   * reported number of received attributes (it is a constant).
    135   */
    136 #define MAIL_ATTR_PROTO		"protocol"
    137 
    138 #define MAIL_ATTR_PROTO_ANVIL	"anvil_protocol"
    139 #define MAIL_ATTR_PROTO_BOUNCE	"delivery_status_protocol"
    140 #define MAIL_ATTR_PROTO_CLEANUP	"cleanup_protocol"
    141 #define MAIL_ATTR_PROTO_DELIVER	"delivery_request_protocol"
    142 #define MAIL_ATTR_PROTO_FLUSH	"queue_flush_protocol"
    143 #define MAIL_ATTR_PROTO_POSTDROP "postdrop_protocol"
    144 #define MAIL_ATTR_PROTO_PROXYMAP "proxymap_protocol"
    145 #define MAIL_ATTR_PROTO_SCACHE	"connection_cache_protocol"
    146 #define MAIL_ATTR_PROTO_SHOWQ	"mail_queue_list_protocol"
    147 #define MAIL_ATTR_PROTO_TLSMGR	"tlsmgr_protocol"
    148 #define MAIL_ATTR_PROTO_TLSPROXY "tlsproxy_protocol"
    149 #define MAIL_ATTR_PROTO_TRIVIAL	"trivial_rewrite_protocol"
    150 #define MAIL_ATTR_PROTO_VERIFY	"address_verification_prrotocol"
    151 
    152  /*
    153   * Attribute names in internal and policy delegation protocols.
    154   */
    155 #define MAIL_ATTR_REQ		"request"
    156 #define MAIL_ATTR_NREQ		"nrequest"
    157 #define MAIL_ATTR_STATUS	"status"
    158 
    159 #define MAIL_ATTR_FLAGS		"flags"
    160 #define MAIL_ATTR_QUEUE		"queue_name"
    161 #define MAIL_ATTR_QUEUEID	"queue_id"
    162 #define MAIL_ATTR_SENDER	"sender"
    163 #define MAIL_ATTR_RCPT_COUNT	"recipient_count"
    164 #define MAIL_ATTR_ORCPT		"original_recipient"
    165 #define MAIL_ATTR_RECIP		"recipient"
    166 #define MAIL_ATTR_WHY		"reason"
    167 #define MAIL_ATTR_VERPDL	"verp_delimiters"
    168 #define MAIL_ATTR_SITE		"site"
    169 #define MAIL_ATTR_OFFSET	"offset"
    170 #define MAIL_ATTR_SIZE		"size"
    171 #define MAIL_ATTR_ERRTO		"errors-to"
    172 #define MAIL_ATTR_RRCPT		"return-receipt"
    173 #define MAIL_ATTR_TIME		"time"
    174 #define MAIL_ATTR_LOCALTIME	"localtime"
    175 #define MAIL_ATTR_CREATE_TIME	"create_time"
    176 #define MAIL_ATTR_RULE		"rule"
    177 #define MAIL_ATTR_ADDR		"address"
    178 #define MAIL_ATTR_TRANSPORT	"transport"
    179 #define MAIL_ATTR_NEXTHOP	"nexthop"
    180 #define MAIL_ATTR_TRACE_FLAGS	"trace_flags"
    181 #define MAIL_ATTR_ADDR_STATUS	"recipient_status"
    182 #define MAIL_ATTR_ACTION	"action"
    183 #define MAIL_ATTR_TABLE		"table"
    184 #define MAIL_ATTR_KEY		"key"
    185 #define MAIL_ATTR_VALUE		"value"
    186 #define MAIL_ATTR_INSTANCE	"instance"
    187 #define MAIL_ATTR_SASL_METHOD	"sasl_method"
    188 #define MAIL_ATTR_SASL_USERNAME	"sasl_username"
    189 #define MAIL_ATTR_SASL_SENDER	"sasl_sender"
    190 #define MAIL_ATTR_ETRN_DOMAIN	"etrn_domain"
    191 #define MAIL_ATTR_DUMMY		"dummy"
    192 #define MAIL_ATTR_STRESS	"stress"
    193 #define MAIL_ATTR_LOG_IDENT	"log_ident"
    194 #define MAIL_ATTR_RWR_CONTEXT	"rewrite_context"
    195 #define MAIL_ATTR_POL_CONTEXT	"policy_context"
    196 #define MAIL_ATTR_FORCED_EXPIRE	"forced_expire"
    197 
    198 #define MAIL_ATTR_RWR_LOCAL	"local"
    199 #define MAIL_ATTR_RWR_REMOTE	"remote"
    200 
    201 #define MAIL_ATTR_TTL		"ttl"
    202 #define MAIL_ATTR_LABEL		"label"
    203 #define MAIL_ATTR_PROP		"property"
    204 #define MAIL_ATTR_FUNC		"function"
    205 #define MAIL_ATTR_CCERT_SUBJECT	"ccert_subject"
    206 #define MAIL_ATTR_CCERT_ISSUER	"ccert_issuer"
    207 #define MAIL_ATTR_CCERT_CERT_FPRINT "ccert_fingerprint"
    208 #define MAIL_ATTR_CCERT_PKEY_FPRINT "ccert_pubkey_fingerprint"
    209 #define MAIL_ATTR_CRYPTO_PROTOCOL "encryption_protocol"
    210 #define MAIL_ATTR_CRYPTO_CIPHER	"encryption_cipher"
    211 #define MAIL_ATTR_CRYPTO_KEYSIZE "encryption_keysize"
    212 #define MAIL_ATTR_COMPAT_LEVEL	"compatibility_level"
    213 #define MAIL_ATTR_MAIL_VERSION	"mail_version"
    214 
    215 #define MAIL_ATTR_INST_FLAGS	"instance_flags"
    216 
    217  /*
    218   * Suffixes for sender_name, sender_domain etc.
    219   */
    220 #define MAIL_ATTR_S_NAME	"_name"
    221 #define MAIL_ATTR_S_DOMAIN	"_domain"
    222 
    223  /*
    224   * Special names for RBL results.
    225   */
    226 #define MAIL_ATTR_RBL_WHAT	"rbl_what"
    227 #define MAIL_ATTR_RBL_DOMAIN	"rbl_domain"
    228 #define MAIL_ATTR_RBL_REASON	"rbl_reason"
    229 #define MAIL_ATTR_RBL_TXT	"rbl_txt"	/* LaMont compatibility */
    230 #define MAIL_ATTR_RBL_CLASS	"rbl_class"
    231 #define MAIL_ATTR_RBL_CODE	"rbl_code"
    232 #define MAIL_ATTR_RBL_ADDR	"rbl_addr"
    233 
    234  /*
    235   * The following attribute names are stored in queue files. Changing this
    236   * means lots of work to maintain backwards compatibility with queued mail.
    237   */
    238 #define MAIL_ATTR_ENCODING	"encoding"	/* internal encoding */
    239 #define MAIL_ATTR_ENC_8BIT	"8bit"	/* 8BITMIME equivalent */
    240 #define MAIL_ATTR_ENC_7BIT	"7bit"	/* 7BIT equivalent */
    241 #define MAIL_ATTR_ENC_NONE	""	/* encoding unknown */
    242 
    243 #define MAIL_ATTR_LOG_CLIENT_NAME "log_client_name"	/* client hostname */
    244 #define MAIL_ATTR_LOG_CLIENT_ADDR "log_client_address"	/* client address */
    245 #define MAIL_ATTR_LOG_CLIENT_PORT "log_client_port"	/* client port */
    246 #define MAIL_ATTR_LOG_HELO_NAME	"log_helo_name"	/* SMTP helo name */
    247 #define MAIL_ATTR_LOG_PROTO_NAME "log_protocol_name"	/* SMTP/ESMTP/QMQP */
    248 #define MAIL_ATTR_LOG_ORIGIN	"log_message_origin"	/* name[addr]:port */
    249 
    250 #define MAIL_ATTR_ACT_CLIENT	"client"/* client name addr */
    251 #define MAIL_ATTR_ACT_CLIENT_NAME "client_name"	/* client name */
    252 #define MAIL_ATTR_ACT_CLIENT_ADDR "client_address"	/* client address */
    253 #define MAIL_ATTR_ACT_CLIENT_PORT "client_port"	/* client TCP port */
    254 #define MAIL_ATTR_ACT_CLIENT_AF	"client_address_type"	/* AF_INET etc. */
    255 #define MAIL_ATTR_ACT_HELO_NAME	"helo_name"	/* SMTP helo name */
    256 #define MAIL_ATTR_ACT_PROTO_NAME "protocol_name"	/* SMTP/ESMTP/QMQP */
    257 #define MAIL_ATTR_ACT_REVERSE_CLIENT_NAME "reverse_client_name"
    258 #define MAIL_ATTR_ACT_FORWARD_CLIENT_NAME "forward_client_name"
    259 
    260 #define MAIL_ATTR_ACT_SERVER_ADDR "server_address"	/* server address */
    261 #define MAIL_ATTR_ACT_SERVER_PORT "server_port"	/* server TCP port */
    262 
    263 #define MAIL_ATTR_PROTO_STATE	"protocol_state"	/* MAIL/RCPT/... */
    264 #define MAIL_ATTR_ORG_NONE	"unknown"	/* origin unknown */
    265 #define MAIL_ATTR_ORG_LOCAL	"local"	/* local submission */
    266 
    267 #define MAIL_ATTR_MESSAGE_ID	"message_id"	/* Used for threaded bounce */
    268 
    269 #define MAIL_ATTR_LOG_CLASS	"log_class"	/* bounce/defer/trace */
    270 
    271  /*
    272   * XCLIENT/XFORWARD in SMTP.
    273   */
    274 #define XCLIENT_CMD		"XCLIENT"	/* XCLIENT command */
    275 #define XCLIENT_NAME		"NAME"	/* client name */
    276 #define XCLIENT_REVERSE_NAME	"REVERSE_NAME"	/* reverse client name */
    277 #ifdef FORWARD_CLIENT_NAME
    278 #define XCLIENT_FORWARD_NAME	"FORWARD_NAME"	/* forward client name */
    279 #endif
    280 #define XCLIENT_ADDR		"ADDR"	/* client address */
    281 #define XCLIENT_PORT		"PORT"	/* client port */
    282 #define XCLIENT_PROTO		"PROTO"	/* client protocol */
    283 #define XCLIENT_HELO		"HELO"	/* client helo */
    284 #define XCLIENT_LOGIN		"LOGIN"	/* SASL login name */
    285 #define XCLIENT_DESTADDR	"DESTADDR"	/* server address */
    286 #define XCLIENT_DESTPORT	"DESTPORT"	/* server port */
    287 
    288 #define XCLIENT_UNAVAILABLE	"[UNAVAILABLE]"	/* permanently unavailable */
    289 #define XCLIENT_TEMPORARY	"[TEMPUNAVAIL]"	/* temporarily unavailable */
    290 
    291 #define XFORWARD_CMD		"XFORWARD"	/* XFORWARD command */
    292 #define XFORWARD_NAME		"NAME"	/* client name */
    293 #define XFORWARD_ADDR		"ADDR"	/* client address */
    294 #define XFORWARD_PORT		"PORT"	/* client port */
    295 #define XFORWARD_PROTO		"PROTO"	/* client protocol */
    296 #define XFORWARD_HELO		"HELO"	/* client helo */
    297 #define XFORWARD_IDENT		"IDENT"	/* message identifier */
    298 #define XFORWARD_DOMAIN		"SOURCE"/* origin type */
    299 #define XFORWARD_DOM_LOCAL	"LOCAL"	/* local origin */
    300 #define XFORWARD_DOM_REMOTE	"REMOTE"/* remote origin */
    301 
    302 #define XFORWARD_UNAVAILABLE	"[UNAVAILABLE]"	/* attribute unavailable */
    303 
    304  /*
    305   * DSN support.
    306   */
    307 #define MAIL_ATTR_DSN_STATUS	"status"/* XXX Postfix <2.3 compat */
    308 #define MAIL_ATTR_DSN_DTYPE	"diag_type"	/* dsn diagnostic code */
    309 #define MAIL_ATTR_DSN_DTEXT	"diag_text"	/* dsn diagnostic code */
    310 #define MAIL_ATTR_DSN_MTYPE	"mta_type"	/* dsn remote MTA */
    311 #define MAIL_ATTR_DSN_MNAME	"mta_mname"	/* dsn remote MTA */
    312 #define MAIL_ATTR_DSN_ACTION	"action"/* XXX Postfix <2.3 compat */
    313 #define MAIL_ATTR_DSN_ENVID	"envelope_id"	/* dsn envelope id */
    314 #define MAIL_ATTR_DSN_RET	"ret_flags"	/* dsn full/headers */
    315 #define MAIL_ATTR_DSN_NOTIFY	"notify_flags"	/* dsn notify flags */
    316 #define MAIL_ATTR_DSN_ORCPT	"dsn_orig_rcpt"	/* dsn original recipient */
    317 #define MAIL_ATTR_SENDOPTS	"sendopts"	/* RFC6531 etc. support */
    318 
    319  /*
    320   * SMTP reply footer support.
    321   */
    322 #define MAIL_ATTR_SERVER_NAME	"server_name"
    323 
    324  /*
    325   * Non-Berkeley-DB migration.
    326   */
    327 #define MAIL_ATTR_PROTO_NBDB_REINDEX	"nbdb_reindex"	/* Re-index protocol */
    328 #define MAIL_ATTR_NBDB_TYPE		"nbdb_type"	/* maptype */
    329 #define MAIL_ATTR_NBDB_PATH		"nbdb_path"	/* mapname */
    330 
    331 /* LICENSE
    332 /* .ad
    333 /* .fi
    334 /*	The Secure Mailer license must be distributed with this software.
    335 /* AUTHOR(S)
    336 /*	Wietse Venema
    337 /*	IBM T.J. Watson Research
    338 /*	P.O. Box 704
    339 /*	Yorktown Heights, NY 10598, USA
    340 /*
    341 /*	Wietse Venema
    342 /*	Google, Inc.
    343 /*	111 8th Avenue
    344 /*	New York, NY 10011, USA
    345 /*
    346 /*	Wietse Venema
    347 /*	porcupine.org
    348 /*--*/
    349 
    350 #endif
    351