diff options
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | doc/doc-txt/experimental-spec.txt | 19 | ||||
-rw-r--r-- | src/src/transports/smtp.c | 13 | ||||
-rw-r--r-- | src/src/utf8.c | 1 |
4 files changed, 33 insertions, 4 deletions
@@ -14,8 +14,8 @@ destination supports the SMTPUTF8 extension ====================== -to-Alabel convert of helo name -- smtp transport +++ to-Alabel convert of helo name +++ - smtp transport ++ An "international" flag on the message? ++ An is-international expansion condition? diff --git a/doc/doc-txt/experimental-spec.txt b/doc/doc-txt/experimental-spec.txt index 3dbf13f9d..c22288bed 100644 --- a/doc/doc-txt/experimental-spec.txt +++ b/doc/doc-txt/experimental-spec.txt @@ -1278,7 +1278,7 @@ RFCs 6530, 6533, 5890 Compile with EXPERIMENTAL_INTERNATIONAL and libidn. -Main config option smtputf8_advertise_hosts, default '*', +New main config option smtputf8_advertise_hosts, default '*', a host list. If this matches the sending host and accept_8bitmime is true (the default) then the ESMTP option SMTPUTF8 will be advertised. @@ -1291,15 +1291,30 @@ The option allow_utf8_domains is set to true for this message. All DNS lookups are converted to a-label form whatever the setting of allow_utf8_domains. +Both localparts and domain are maintained as the original +utf8 form internally; any matching or regex use will +require appropriate care. Filenames created, eg. by +the appendfile transport, will have utf8 name. + +Helo names sent by the smtp transport will have any utf8 +components expanded to a-label form. + Log lines and Received-by: header lines will aquire a "utf8" prefix on the protocol element, eg. utf8esmtp. -Expansion operators: +New expansion operators: ${utf8_domain_to_alabel:str} ${utf8_domain_from_alabel:str} ${utf8_localpart_to_alabel:str} ${utf8_localpart_from_alabel:str} +Known issues: + - Currently LMTP is not supported. + - DSN unitext handling is not present + - no provision for converting logging from UTF-8 + - VRFY and EXPN not handled + - non-smtp input not handled (!) + - MSA mode not handled (!) -------------------------------------------------------------- End of file diff --git a/src/src/transports/smtp.c b/src/src/transports/smtp.c index 0ca6b4e42..65bb1de22 100644 --- a/src/src/transports/smtp.c +++ b/src/src/transports/smtp.c @@ -1486,6 +1486,19 @@ if (continue_hostname == NULL) delayed till here so that $sending_interface and $sending_port are set. */ helo_data = expand_string(ob->helo_data); +#ifdef EXPERIMENTAL_INTERNATIONAL + if (helo_data) + { + uschar * errstr = NULL; + if ((helo_data = string_domain_utf8_to_alabel(helo_data, &errstr)), errstr) + { + errstr = string_sprintf("failed to expand helo_data: %s", errstr); + set_errno(addrlist, ERRNO_EXPANDFAIL, errstr, DEFER, FALSE, NULL); + yield = DEFER; + goto SEND_QUIT; + } + } +#endif /* The first thing is to wait for an initial OK response. The dreaded "goto" is nevertheless a reasonably clean way of programming this kind of logic, diff --git a/src/src/utf8.c b/src/src/utf8.c index 6d0c5029b..6bc0c2ed5 100644 --- a/src/src/utf8.c +++ b/src/src/utf8.c @@ -54,6 +54,7 @@ string_domain_alabel_to_utf8(const uschar * alabel, uschar ** err) uschar * s1; uschar * s; int rc; + if ( (rc = idna_to_unicode_8z8z(CCS alabel, CSS &s1, IDNA_USE_STD3_ASCII_RULES)) != IDNA_SUCCESS) { |