Skip to content

Commit

Permalink
smtp: Support the SMTPUTF8 extension for the EXPN command
Browse files Browse the repository at this point in the history
Simply notify the server we support the SMTPUTF8 extension if it does.
  • Loading branch information
captain-caveman2k committed Feb 14, 2020
1 parent 67da3d9 commit e2b473e
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 10 deletions.
25 changes: 16 additions & 9 deletions lib/smtp.c
Expand Up @@ -487,16 +487,16 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
struct SMTP *smtp = data->req.protop;

if(smtp->rcpt) {
/* 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
either the local address or host name parts. This is regardless of
whether the host name is encoded using IDN ACE */
bool utf8 = false;

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
SMTPUTF8 extension and b) The mailbox contains UTF-8 charaacters, in
either the local address or host name parts. This is regardless of
whether the host name is encoded using IDN ACE */
bool utf8 = false;

/* Parse the mailbox to verify into the local address and host name
parts, converting the host name to an IDN A-label if necessary */
result = smtp_parse_address(conn, smtp->rcpt->data,
Expand All @@ -521,10 +521,17 @@ static CURLcode smtp_perform_command(struct connectdata *conn)
Curl_free_idnconverted_hostname(&host);
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 */
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s", smtp->custom,
smtp->rcpt->data);
result = Curl_pp_sendf(&conn->proto.smtpc.pp, "%s %s%s", smtp->custom,
smtp->rcpt->data,
utf8 ? " SMTPUTF8" : "");
}
}
else
/* Send the non-recipient based command such as HELP */
Expand Down
2 changes: 1 addition & 1 deletion tests/data/Makefile.inc
Expand Up @@ -109,7 +109,7 @@ test927 test928 test929 test930 test931 test932 test933 test934 test935 \
test936 test937 test938 test939 test940 test941 test942 test943 test944 \
test945 test946 test947 test948 test949 test950 test951 test952 test953 \
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 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \
Expand Down
50 changes: 50 additions & 0 deletions tests/data/test969
@@ -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>

0 comments on commit e2b473e

Please sign in to comment.