Home | History | Annotate | Line # | Download | only in global
      1 /*	$NetBSD: smtputf8.h,v 1.4 2025/02/25 19:15:46 christos Exp $	*/
      2 
      3 #ifndef _SMTPUTF8_H_INCLUDED_
      4 #define _SMTPUTF8_H_INCLUDED_
      5 
      6 /*++
      7 /* NAME
      8 /*	smtputf8 3h
      9 /* SUMMARY
     10 /*	SMTPUTF8 support
     11 /* SYNOPSIS
     12 /*	#include <smtputf8.h>
     13 /* DESCRIPTION
     14 /* .nf
     15 
     16  /*
     17   * Global library.
     18   */
     19 #include <sendopts.h>
     20 
     21  /*
     22   * Avoiding chicken-and-egg problems during the initial SMTPUTF8 roll-out in
     23   * environments with pre-existing mail flows that contain UTF8.
     24   *
     25   * Prior to SMTPUTF8, mail flows that contain UTF8 worked because the vast
     26   * majority of MTAs is perfectly capable of handling UTF8 in address
     27   * localparts (and in headers), even if pre-SMTPUTF8 standards do not
     28   * support this practice.
     29   *
     30   * When turning on Postfix SMTPUTF8 support for the first time, we don't want
     31   * to suddenly break pre-existing mail flows that contain UTF8 because 1) a
     32   * client does not request SMTPUTF8 support, and because 2) a down-stream
     33   * MTA does not announce SMTPUTF8 support.
     34   *
     35   * While 1) is easy enough to avoid (keep accepting UTF8 in address localparts
     36   * just like Postfix has always done), 2) presents a thornier problem. The
     37   * root cause of that problem is the need for SMTPUTF8 autodetection.
     38   *
     39   * What is SMTPUTF8 autodetection? Postfix cannot rely solely on the sender's
     40   * declaration that a message requires SMTPUTF8 support, because UTF8 may be
     41   * introduced during local processing (for example, the client hostname in
     42   * Postfix's Received: header, adding @$myorigin or .$mydomain to an
     43   * incomplete address, address rewriting, alias expansion, automatic BCC
     44   * recipients, local forwarding, and changes made by header checks or Milter
     45   * applications).
     46   *
     47   * In summary, after local processing has happened, Postfix may decide that a
     48   * message requires SMTPUTF8 support, even when that message initially did
     49   * not require SMTPUTF8 support. This could make the message undeliverable
     50   * to destinations that do not support SMTPUTF8. In an environment with
     51   * pre-existing mail flows that contain UTF8, we want to avoid disrupting
     52   * those mail flows when rolling out SMTPUTF8 support.
     53   *
     54   * For the vast majority of sites, the simplest solution is to autodetect
     55   * SMTPUTF8 support only for Postfix sendmail command-line submissions, at
     56   * least as long as SMTPUTF8 support has not yet achieved wold domination.
     57   *
     58   * However, sites that add UTF8 content via local processing (see above) should
     59   * autodetect SMTPUTF8 support for all email.
     60   *
     61   * smtputf8_autodetect() uses the setting of the smtputf8_autodetect_classes
     62   * parameter, and the mail source classes defined in mail_params.h.
     63   */
     64 extern int smtputf8_autodetect(int);
     65 
     66  /*
     67   * The flag SMTPUTF8_FLAG_REQUESTED is raised on request by the sender, or
     68   * when SMTPUTF8 auto-detection is enabled and a queue file contains at
     69   * least one UTF8 envelope sender, envelope recipient, or message header.
     70   * Once this flag is raised, it is preserved when mail is forwarded or
     71   * bounced.
     72   *
     73   * The flag SMTPUTF8_FLAG_HEADER is raised when a queue file contains at least
     74   * one UTF8 message header even if SMTPUTF8_FLAG_REQUESTED is disabled.
     75   *
     76   * The flag SMTPUTF8_FLAG_SENDER is raised when a queue file contains an UTF8
     77   * envelope sender, even if SMTPUTF8_FLAG_REQUESTED is disabled.
     78   *
     79   * The three flags SMTPUTF8_FLAG_REQUESTED/HEADER/SENDER are stored in the
     80   * queue file, are sent with delivery requests to Postfix delivery agents,
     81   * and are sent with "flush" requests to the bounce daemon to ensure that
     82   * the resulting notification message will have a content-transfer-encoding
     83   * of 8bit. The derived flags SMTPUTF8_FLAG_HEADER/SENDER are ignored when a
     84   * message is re-queued with "postsuper -r". They may be regenerated by the
     85   * cleanup daemon.
     86   *
     87   * In the future, mailing lists will have a mix of UTF8 and non-UTF8
     88   * subscribers. With the following flag, Postfix can avoid requiring
     89   * SMTPUTF8 delivery when it isn't really needed.
     90   *
     91   * The fourth flag, SMTPUTF8_FLAG_RECIPIENT, is raised when a delivery request
     92   * (NOT: message) contains at least one UTF8 envelope recipient. This flag
     93   * is NOT stored in the queue file. The flag is used ONLY in requests to
     94   * Postfix delivery agents, to give delivery agents flexibility when
     95   * delivering messages to non-SMTPUTF8 servers. Delivery agents may then
     96   * pass the flag to the bounce daemon.
     97   *
     98   * If a delivery request has none of the flags SMTPUTF8_FLAG_RECIPIENT,
     99   * SMTPUTF8_FLAG_SENDER, or SMTPUTF8_FLAG_HEADER, then the message can
    100   * safely be delivered to a non-SMTPUTF8 server (DSN original recipients
    101   * will be encoded appropriately per RFC 6533).
    102   *
    103   * To allow even more SMTPUTF8 mail to be sent to non-SMTPUTF8 servers,
    104   * implement RFC 2047 header encoding in the Postfix SMTP client, and update
    105   * the SMTP client protocol engine.
    106   */
    107 #define SMTPUTF8_FLAG_NONE	(0)
    108  /* In queue file, delivery request, or bounce request. */
    109 #define SMTPUTF8_FLAG_REQUESTED	SOPT_SMTPUTF8_REQUESTED
    110 #define SMTPUTF8_FLAG_HEADER	SOPT_SMTPUTF8_HEADER
    111 #define SMTPUTF8_FLAG_SENDER	SOPT_SMTPUTF8_SENDER
    112  /* In delivery or bounce request only. */
    113 #define SMTPUTF8_FLAG_RECIPIENT	SOPT_SMTPUTF8_RECIPIENT
    114 
    115 #define SMTPUTF8_FLAG_ALL	SOPT_SMTPUTF8_ALL
    116 #define SMTPUTF8_FLAG_DERIVED	SOPT_SMTPUTF8_DERIVED
    117 
    118 /* LICENSE
    119 /* .ad
    120 /* .fi
    121 /*	The Secure Mailer license must be distributed with this software.
    122 /* AUTHOR(S)
    123 /*	Wietse Venema
    124 /*	IBM T.J. Watson Research
    125 /*	P.O. Box 704
    126 /*	Yorktown Heights, NY 10598, USA
    127 /*
    128 /*	Wietse Venema
    129 /*	porcupine.org
    130 /*--*/
    131 
    132 #endif
    133