This is one possible configuration which should do that which I think you are describing:


table vdomains   file:/etc/mail/table_vmail_domains
table vaddr          file:/etc/mail/table_vmail_addresses
table vmailstub   { '@' = vmail }

action "deliver_vmail" maildir "/home/vmail/domains/%{rcpt.domain:lowercase}/%{rcpt.user:lowercase|strip}" virtual <vmailstub>

match from any for domain <vdomains> rcpt-to <vaddr> action "deliver_vmail"


This setup accepts mail ONLY for virtual accounts and delivers it to a typical "vpopmail" maildir structure: "/home/vmail/domain/name"

You must create a system user "vmail" which does not receive any mail but is just the home folder for the mailboxes and the user for permission to deliver the mail.

Automate making the domains file with a script which extracts the unique domains from the addresses file.  The redundancy here is due to the smtpd.conf requirements (i.e. not because I think it's cool to have both domain and email address files).

If it's not clear, I can elaborate on how it works.


On 4/5/2020 4:24 AM, Leo Unglaub wrote:
first of all i want to thank you all for your work on OpenSMTPD over all those years. It has powered my one domain very well over all those years. But now i have a problem with setting up virtual domains and users.

My goal is the following. I have the following domains:

With those domains i have the following email addresses:

But all those users dont exist on my machine as real users. I just want to recieve emails for those accounts and process them via lmtp to dovecot. So my action basically looks like that:

action "local_lmtp_deliver" lmtp "/var/dovecot/lmtp"

But when i trace the lookup from the smtpd i get the following:

b4e62ea90ed6c91d smtp connected address=local
lookup: match "local" as NETADDR in table static:<anyhost> -> true
lookup: match "" as DOMAIN in table static:<anydestination> -> true
rule #1 matched: match from any for any action local_lmtp_deliver
lookup: lookup "user1" as USERINFO in table getpwnam:<getpwnam> -> none
b4e62ea90ed6c91d smtp failed-command command="RCPT TO:<> " result="550 Invalid recipient: <>"      b4e62ea90ed6c91d smtp disconnected reason=disconnect
debug: control -> client: pipe closed
debug: clearing p=client, fd=11, pid=0

For some reason the user1 part is still getting resolved as a real user on the system. I read on the man page and found the "user username" option for the action. I did the following:

action "local_lmtp_deliver" lmtp "/var/dovecot/lmtp" rcpt-to user "dovecot-worker"
dovecot-worker is the account used by dovecot to handle all the email storage in /var/vmail. But i get the same error.

So i guess i am doing it all wrong. Could someone please be so kind and give me a hint in the right direction how the virtual user stuff is working in OpenSMTPD. Because i think i am lost here. I am doing something completely wrong.

I am on the latest OpenBSD release (including all syspatch).

Thanks so much!

Reply via email to