use strict;
use warnings;
use IO::Socket;
+use Encode;
use PVE::SafeSyslog;
$self->{from} = undef;
$self->{to} = [];
$self->{queue} = undef;
+ delete $self->{smtputf8};
delete $self->{xforward};
delete $self->{status};
}
$self->reply ("250-PIPELINING");
$self->reply ("250-ENHANCEDSTATUSCODES");
$self->reply ("250-8BITMIME");
+ $self->reply ("250-SMTPUTF8");
$self->reply ("250-XFORWARD NAME ADDR PROTO HELO");
$self->reply ("250 OK.");
$self->{lmtp} = 1 if ($cmd eq 'lhlo');
$self->reply ("250 2.5.0 OK");
next;
} elsif ($cmd eq 'mail') {
- if ($args =~ m/^from:\s*<(\S*)>/i) {
+ if ($args =~ m/^from:\s*<([^\s\>]*)>([^>]*)$/i) {
delete $self->{to};
- $self->{from} = $1;
+ my ($from, $opts) = ($1, $2);
+ if ($opts =~ m/\sSMTPUTF8/) {
+ $self->{smtputf8} = 1;
+ $from = decode('UTF-8', $from);
+ }
+ $self->{from} = $from;
$self->reply ('250 2.5.0 OK');
next;
} else {
next;
}
} elsif ($cmd eq 'rcpt') {
- if ($args =~ m/^to:\s*<(\S+)>/i) {
- push @{$self->{to}} , $1;
+ if ($args =~ m/^to:\s*<([^\s\>]+)>[^>]*$/i) {
+ my $to = $self->{smtputf8} ? decode('UTF-8', $1) : $1;
+ push @{$self->{to}} , $to;
$self->reply ('250 2.5.0 OK');
next;
} else {
- $self->reply ("501 5.5.2 Syntax: MAIL FROM: <address>");
+ $self->reply ("501 5.5.2 Syntax: RCPT TO: <address>");
next;
}
} elsif ($cmd eq 'data') {