properties => {
domain => { type => 'string' },
host => { type => 'string' },
+ protocol => { type => 'string' },
port => { type => 'integer' },
use_mx => { type => 'boolean' },
comment => { type => 'string'},
description => "Target host (name or IP address).",
type => 'string', format => 'address',
},
+ protocol => {
+ description => "Transport protocol.",
+ type => 'string',
+ enum => [qw(smtp lmtp)],
+ default => 'smtp',
+ optional => 1,
+ },
port => {
- description => "SMTP port.",
+ description => "Transport port.",
type => 'integer',
minimum => 1,
maximum => 65535,
default => 25,
},
use_mx => {
- description => "Enable MX lookups.",
+ description => "Enable MX lookups (SMTP).",
type => 'boolean',
optional => 1,
default => 1,
$tmap->{$param->{domain}} = {
domain => $param->{domain},
host => $param->{host},
+ protocol => $param->{protocol} // 'smtp',
port => $param->{port} // 25,
use_mx => $param->{use_mx} // 1,
comment => $param->{comment} // '',
properties => {
domain => { type => 'string'},
host => { type => 'string'},
+ protocol => { type => 'string'},
port => { type => 'integer'},
use_mx => { type => 'boolean'},
comment => { type => 'string'},
type => 'string', format => 'address',
optional => 1,
},
+ protocol => {
+ description => "Transport protocol.",
+ type => 'string',
+ enum => [qw(smtp lmtp)],
+ default => 'smtp',
+ optional => 1,
+ },
port => {
- description => "SMTP port.",
+ description => "Transport port.",
type => 'integer',
minimum => 1,
maximum => 65535,
optional => 1,
},
use_mx => {
- description => "Enable MX lookups.",
+ description => "Enable MX lookups (SMTP).",
type => 'boolean',
optional => 1,
},
die "no options specified\n" if !scalar(keys %$param);
- for my $prop (qw(host port use_mx comment)) {
+ for my $prop (qw(host protocol port use_mx comment)) {
$data->{$prop} = $param->{$prop} if defined($param->{$prop});
}
description => "The default mail delivery transport (incoming mails).",
type => 'string', format => 'address',
},
+ relayprotocol => {
+ description => "Transport protocol for relay host.",
+ type => 'string',
+ enum => [qw(smtp lmtp)],
+ default => 'smtp',
+ },
relayport => {
- description => "SMTP port number for relay host.",
+ description => "Transport port number for relay host.",
type => 'integer',
minimum => 1,
maximum => 65535,
default => 25,
},
relaynomx => {
- description => "Disable MX lookups for default relay.",
+ description => "Disable MX lookups for default relay (SMTP).",
type => 'boolean',
default => 0,
},
smarthost => { optional => 1 },
smarthostport => { optional => 1 },
relay => { optional => 1 },
+ relayprotocol => { optional => 1 },
relayport => { optional => 1 },
relaynomx => { optional => 1 },
dwarning => { optional => 1 },
$comment = '';
};
- if ($line =~ m/^(\S+)\s+smtp:(\S+):(\d+)\s*$/) {
- my ($domain, $host, $port) = ($1, $2, $3);
+ if ($line =~ m/^(\S+)\s+(?:(lmtp):inet|(smtp)):(\S+):(\d+)\s*$/) {
+ my ($domain, $protocol, $host, $port) = ($1, ($2 or $3), $4, $5);
eval { pmg_verify_transport_domain_or_email($domain); };
if (my $err = $@) {
$host = $1;
$use_mx = 0;
}
+ $use_mx = 0 if ($protocol eq "lmtp");
eval { PVE::JSONSchema::pve_verify_address($host); };
if (my $err = $@) {
my $data = {
domain => $domain,
+ protocol => $protocol,
host => $host,
port => $port,
use_mx => $use_mx,
my $use_mx = $data->{use_mx};
$use_mx = 0 if $data->{host} =~ m/^(?:$IPV4RE|$IPV6RE)$/;
- if ($use_mx) {
+ my $is_lmtp = 0;
+ $is_lmtp = 1 if $data->{protocol} eq "lmtp";
+
+ if ($is_lmtp) {
+ $data->{protocol} = "lmtp:inet";
+ }
+
+ if ($use_mx or $is_lmtp) {
PVE::Tools::safe_print(
- $filename, $fh, "$data->{domain} smtp:$data->{host}:$data->{port}\n");
+ $filename, $fh, "$data->{domain} $data->{protocol}:$data->{host}:$data->{port}\n");
} else {
PVE::Tools::safe_print(
- $filename, $fh, "$data->{domain} smtp:[$data->{host}]:$data->{port}\n");
+ $filename, $fh, "$data->{domain} $data->{protocol}:[$data->{host}]:$data->{port}\n");
}
}
}
transport_maps = hash:/etc/pmg/transport
[% IF pmg.mail.relay %]
+[% IF pmg.mail.relayprotocol == 'lmtp' %]
+relay_transport = [% pmg.mail.relayprotocol %]:inet:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+[% ELSE %]
[% IF pmg.mail.relaynomx %]
-relay_transport = smtp:[[% pmg.mail.relay %]]:[% pmg.mail.relayport %]
+relay_transport = [% pmg.mail.relayprotocol %]:[[% pmg.mail.relay %]]:[% pmg.mail.relayport %]
[% ELSE %]
-relay_transport = smtp:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+relay_transport = [% pmg.mail.relayprotocol %]:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+[% END %]
[% END %]
[% END %]
transport_maps = hash:/etc/pmg/transport
[% IF pmg.mail.relay %]
+[% IF pmg.mail.relayprotocol == 'lmtp' %]
+relay_transport = [% pmg.mail.relayprotocol %]:inet:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+[% ELSE %]
[% IF pmg.mail.relaynomx %]
-relay_transport = smtp:[[% pmg.mail.relay %]]:[% pmg.mail.relayport %]
+relay_transport = [% pmg.mail.relayprotocol %]:[[% pmg.mail.relay %]]:[% pmg.mail.relayport %]
[% ELSE %]
-relay_transport = smtp:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+relay_transport = [% pmg.mail.relayprotocol %]:[% pmg.mail.relay %]:[% pmg.mail.relayport %]
+[% END %]
[% END %]
[% END %]