I'm trying to have smtpd:

1. Deliver mail directly to existing users
2. Otherwise fall back to the contents of /etc/mail/aliases
3. Otherwise fall back to a catch-all that sends all mail to me

I can't seem to figure it out.

According to table(5), to use a catch-all I must use a "virtual context", which 
means smtpd(8)'s 'virtual' keyword. But with this, the catch-all takes 
precedence over *all* mail and mail *only* comes to me, not to my other users:

# echo '@   kousu' > /etc/mail/catchall                                         
                                                                              
# cat /etc/mail/smtpd.conf
[...]
table catchall file:/etc/mail/catchall
[...]
action "inbound" maildir virtual <catchall>
[...]
match from any for domain "kousu.ca" action "inbound"
[...]
# ls /home/     # these users should be able to receive mail directly           
                                                                               
_sysupgrade oxford      jane        kousu       test1       test2
comms3# smtpd -d                 
info: OpenSMTPD 7.0.0 starting
b2412232263c0878 mta connecting address=smtp+tls://XXX.XXX.XXX.XXX:25 
host=mail.example.ca
b2412233f0b9eead smtp connected address=XXX.XXX.XXX.XXX host=mail.example.ca
b2412233f0b9eead smtp tls ciphers=TLSv1.3:TLS_AES_256_GCM_SHA384:256
b2412233f0b9eead smtp message msgid=e3c3d9c7 size=902 nrcpt=1 proto=ESMTP
b2412233f0b9eead smtp envelope evpid=e3c3d9c7d8532695 from=<t...@example.ca> 
to=<j...@kousu.ca>
b2412236b38065b9 mda delivery evpid=e3c3d9c7d8532695 from=<t...@example.ca> 
to=<j...@kousu.ca> rcpt=<j...@kousu.ca> user=kousu delay=2s result=Ok 
stat=Delivered
b2412233f0b9eead smtp message msgid=e39f6445 size=902 nrcpt=1 proto=ESMTP
b2412233f0b9eead smtp envelope evpid=e39f6445ff6aca0c from=<t...@example.ca> 
to=<n...@kousu.ca>
b2412238cd9028f2 mda delivery evpid=e39f6445ff6aca0c from=<t...@example.ca> 
to=<n...@kousu.ca> rcpt=<n...@kousu.ca> user=kousu delay=2s result=Ok 
stat=Delivered


I'm happy it mapped n...@kousu.ca: kousu, but unhappy it also mapped 
j...@kousu.ca: kousu.

And on the other hand, if I try to add the catch-all to /etc/mail/aliases, it's 
silently ignored (table(5) documents this, though it took me a moment to 
realize that's what it was saying)

# echo '@   kousu' >> /etc/mail/aliases
# cat /etc/mail/smtpd.conf
table aliases file:/etc/mail/aliases
[...]
action "inbound" maildir alias <alias>
[...]
match from any for domain "kousu.ca" action "inbound"
[...]
comms3# smtpd -d             
info: OpenSMTPD 7.0.0 starting
0b519d1a49e4ee04 mta connecting address=smtp+tls://XXX.XXX.XXX.XXX:25 
host=mail.example.ca
0b519d1b1de1a199 smtp connected address=XXX.XXX.XXX.XXX host=mail.example.ca
0b519d1b1de1a199 smtp tls ciphers=TLSv1.3:TLS_AES_256_GCM_SHA384:256
0b519d1b1de1a199 smtp message msgid=de68177e size=902 nrcpt=1 proto=ESMTP
0b519d1b1de1a199 smtp envelope evpid=de68177ebd58d3b2 from=<t...@example.ca> 
to=<j...@kousu.ca>
0b519d1ccba260c0 mda delivery evpid=de68177ebd58d3b2 from=<t...@example.ca> 
to=<j...@kousu.ca> rcpt=<j...@kousu.ca> user=jane delay=2s result=Ok 
stat=Delivered
0b519d1b1de1a199 smtp failed-command command="RCPT TO:<n...@kousu.ca>" 
result="550 Invalid recipient: <n...@kousu.ca>"

Here it mapped j...@kousu.ca: jane, which I'm happy for, but it mapped 
n...@kousu.ca: /dev/null, which is no good.


I also tried adding a second 'match' and a second 'action',

# cat /etc/mail/smtpd.conf
table aliases file:/etc/mail/aliases
[...]
action "inbound" maildir alias <alias>
action "inbound-catchall" maildir "~/.mail/" virtual <catchall>
[...]
match from any for domain "kousu.ca" action "inbound"
match from any for domain "kousu.ca" action "inbound-catchall"

But this just ignores the second match, behaving the same as the 'alias' case; 
and if I swap the order then it behaves the same as the 'virtual' case.


So, Question: how do I set up a fall-back catch-all with opensmtpd?


And some follow-ups:

Question: are 'alias' and 'virtual' mutually exclusive? The smtpd.conf(5) 
manpage doesn't state this explicitly, but if I try it it fails:

# cat /etc/mail/smtpd.conf
table aliases file:/etc/mail/aliases
table catchall file:/etc/mail/catchall
[...]
action "inbound" maildir virtual <catchall> alias <alias>
[...]
match from any for domain "kousu.ca" action "inbound"
[...]
# smtpd -d 
/etc/mail/smtpd.conf:27: virtual mapping already specified for this dispatcher
/etc/mail/smtpd.conf:40: no such dispatcher: inbound
/etc/mail/smtpd.conf:41: no such dispatcher: inbound


Question: It seems like 'virtual' can do everything 'alias' can, so is 'alias' 
deprecated?

Question: aliases(5), and the default /etc/mail/aliases, show the format has 
colons (:) in it:

# cat /etc/mail/aliases 
[...]
# RFC 2142: NETWORK OPERATIONS MAILBOX NAMES
abuse:          root
# noc:          root
security:       root
[...]

but table(5) doesn't show any colons. smtpd seems to be able to handle either 
with or without colons; is one supposed to be more canonical than the other?




For reference, I'm on:

# uname -a
OpenBSD comms3.kousu.ca 7.1 GENERIC#3 amd64





Thanks in advance! Hope you're having a chill day

(and please CC me, I'm not subscribed)
-Nick

Reply via email to