1
0
mirror of https://github.com/moparisthebest/curl synced 2024-08-13 17:03:50 -04:00

smtp: Support the SMTPUTF8 extension in the RCPT TO command

Note: The RCPT TO command isn't required to advertise to the server that
it contains UTF-8 characters, instead the server is told that a mail may
contain UTF-8 in any envelope command via the MAIL command.
This commit is contained in:
Steve Holme 2020-02-13 22:39:28 +00:00
parent aba1bf630f
commit 483edeb8dd
No known key found for this signature in database
GPG Key ID: 4059CB85CA7E8F19
4 changed files with 91 additions and 6 deletions

View File

@ -670,6 +670,23 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
}
}
/* If the mailboxes in the FROM and AUTH parameters don't include a UTF-8
based address then quickly scan through the recipient list and check if
any there do, as we need to correctly identify our support for SMTPUTF8
in the envelope, as per RFC-6531 sect. 3.4 */
if(conn->proto.smtpc.utf8_supported && !utf8) {
struct SMTP *smtp = data->req.protop;
struct curl_slist *rcpt = smtp->rcpt;
while(rcpt && !utf8) {
/* Does the host name contain non-ASCII characters? */
if(!Curl_is_ASCII_name(rcpt->data))
utf8 = TRUE;
rcpt = rcpt->next;
}
}
/* Send the MAIL command */
result = Curl_pp_sendf(&conn->proto.smtpc.pp,
"MAIL FROM:%s%s%s%s%s%s",
@ -679,7 +696,7 @@ static CURLcode smtp_perform_mail(struct connectdata *conn)
size ? " SIZE=" : "", /* Optional on SIZE support */
size ? size : "", /* */
utf8 ? " SMTPUTF8" /* Internationalised mailbox */
: ""); /* address included */
: ""); /* included in our envelope */
free(from);
free(auth);

View File

@ -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 \
test963 test964 test965 test966 \
\
test1000 test1001 test1002 test1003 test1004 test1005 test1006 test1007 \
test1008 test1009 test1010 test1011 test1012 test1013 test1014 test1015 \

65
tests/data/test966 Normal file
View File

@ -0,0 +1,65 @@
<testcase>
<info>
<keywords>
SMTP
IDN
</keywords>
</info>
#
# Server-side
<reply>
<servercmd>
CAPA SMTPUTF8
</servercmd>
</reply>
#
# Client-side
<client>
<server>
smtp
</server>
<features>
idn
</features>
<setenv>
LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
</setenv>
<precheck>
perl -MI18N::Langinfo=langinfo,CODESET -e 'die "Needs a UTF-8 locale" if (lc(langinfo(CODESET())) ne "utf-8");'
</precheck>
<name>
SMTP with SMTPUTF8 support - UTF-8 based recipient
</name>
<stdin>
From: different
To: another
body
</stdin>
<command>
smtp://%HOSTIP:%SMTPPORT/966 --mail-rcpt Stödmottagaren@åäö.se --mail-from sender@example.com -T -
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
EHLO 966
MAIL FROM:<sender@example.com> SMTPUTF8
RCPT TO:<Stödmottagaren@xn--4cab6c.se>
DATA
QUIT
</protocol>
<upload>
From: different
To: another
body
.
</upload>
</verify>
</testcase>

View File

@ -871,16 +871,19 @@ sub RCPT_smtp {
sendcontrol "501 Unrecognized parameter\r\n";
}
else {
my $smtputf8 = grep /^SMTPUTF8$/, @capabilities;
my $to = $1;
# Validate the to address (only a valid email address inside <> is
# allowed, such as <user@example.com>)
if ($to !~
/^<([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})>$/) {
sendcontrol "501 Invalid address\r\n";
if ((!$smtputf8 && $to =~
/^<([a-zA-Z0-9._%+-]+)\@(([a-zA-Z0-9-]+)\.)+([a-zA-Z]{2,4})>$/) ||
($smtputf8 && $to =~
/^<([a-zA-Z0-9\x{80}-\x{ff}._%+-]+)\@(([a-zA-Z0-9\x{80}-\x{ff}-]+)\.)+([a-zA-Z]{2,4})>$/)) {
sendcontrol "250 Recipient OK\r\n";
}
else {
sendcontrol "250 Recipient OK\r\n";
sendcontrol "501 Invalid address\r\n";
}
}