smtp: Support the SMTPUTF8 extension for the EXPN command

Simply notify the server we support the SMTPUTF8 extension if it does.
This commit is contained in:
Steve Holme 2020-02-09 16:41:34 +00:00
parent efce3ea5a8
commit 34a1ffb05f
No known key found for this signature in database
GPG Key ID: 4059CB85CA7E8F19
3 changed files with 67 additions and 10 deletions

View File

@ -487,16 +487,16 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
struct SMTP *smtp = data->req.protop; struct SMTP *smtp = data->req.protop;
if(smtp->rcpt) { if(smtp->rcpt) {
if((!smtp->custom) || (!smtp->custom[0])) {
char *address = NULL;
struct hostname host = { NULL, NULL, NULL, NULL };
/* We notify the server we are sending UTF-8 data if a) it supports the /* We notify the server we are sending UTF-8 data if a) it supports the
SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
either the local address or host name parts. This is regardless of either the local address or host name parts. This is regardless of
whether the host name is encoded using IDN ACE */ whether the host name is encoded using IDN ACE */
bool utf8 = FALSE; bool utf8 = FALSE;
if((!smtp->custom) || (!smtp->custom[0])) {
char *address = NULL;
struct hostname host = { NULL, NULL, NULL, NULL };
/* Parse the mailbox to verify into the local address and host name /* Parse the mailbox to verify into the local address and host name
parts, converting the host name to an IDN A-label if necessary */ parts, converting the host name to an IDN A-label if necessary */
result = smtp_parse_address(conn, smtp->rcpt->data, result = smtp_parse_address(conn, smtp->rcpt->data,
@ -521,10 +521,17 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
Curl_free_idnconverted_hostname(&host); Curl_free_idnconverted_hostname(&host);
free(address); free(address);
} }
else else {
/* Establish whether we should report that we support SMTPUTF8 for EXPN
commands to the server as per RFC-6531 sect. 3.1 point 6 */
utf8 = (conn->proto.smtpc.utf8_supported) &&
(!strcmp(smtp->custom, "EXPN"));
/* Send the custom recipient based command such as the EXPN command */ /* Send the custom recipient based command such as the EXPN command */
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s", smtp->custom, result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s%s", smtp->custom,
smtp->rcpt->data); smtp->rcpt->data,
utf8 ? " SMTPUTF8" : "");
}
} }
else else
/* Send the non-recipient based command such as HELP */ /* Send the non-recipient based command such as HELP */

View File

@ -109,7 +109,7 @@ test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \ test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 test953 \ test945 test946 test947 test948 test949 test950 test951 test952 test953 \
test954 test955 test956 test957 test958 test959 test960 test961 test962 \ test954 test955 test956 test957 test958 test959 test960 test961 test962 \
test963 test964 test965 test966 test967 test968 \ test963 test964 test965 test966 test967 test968 test969 \
\ \
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \ test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \ test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \

50
tests/data/test969 Normal file
View File

@ -0,0 +1,50 @@
<testcase>
<info>
<keywords>
SMTP
EXPN
CUSTOMREQUEST
IDN
</keywords>
</info>
#
# Server-side
<reply>
<servercmd>
CAPA SMTPUTF8
</servercmd>
<data>
250-Joe Smith <joe.smith@example.com>
250-Harry Smith <harry.smith@example.com>
250 Melvin Smith <melvin.smith@example.com>
</data>
</reply>
#
# Client-side
<client>
<server>
smtp
</server>
<features>
idn
</features>
<name>
SMTP mailing list EXPN (CUSTOMREQUEST) with SMTPUTF8 support
</name>
<command>
smtp://%HOSTIP:%SMTPPORT/969 --mail-rcpt Friends -X EXPN
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
EHLO 969
EXPN Friends SMTPUTF8
QUIT
</protocol>
</verify>
</testcase>