Hello,
I know this thread is quite outdated, but it still appears on search results. I came up with a solution to this problem a few years ago, but was searching to see if anyone came up with a different approach, or if the How-To was updated.
The problem can be duplicated as follows:
* Postfix is set up to use virtual_alias_maps. An example would be as follows in the
main.cf configuration file:
Code:
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf
* The mysql-virtual.cf file may be configured as follows:
Code:
table = virtual
select_field = dest
where_field = alias
additional_conditions = and status = '1' order by alias desc
* The domain
example.com is added.
* An account user is created. For example:
joe@example.com.
* An account is added that will be used as a catch-all. For example:
catch@example.com.
* An alias is added as a catch-all account. For example,
@example.com is aliased to
catch@example.com.
* Now, when mail is sent to
joe@example.com, it
should be sent to
joe@example.com. However, it will end up in
catch@example.com. Thus, the problem arises.
The reason this happens is because Postfix first checks the virtual_alias_maps for an alias.
@example.com matches as an alias. No other aliases exist. Therefore, the mail is sent to the catch-all account.
There are two possible solutions. The first would be to create an alias for each and every account. For example, your alias table would contain an alias of
joe@example.com, with a destination of
joe@example.com. This is inconvenient if you are using software such as Web-Cyradm to administer your accounts. You cannot tell Web-Cyradm to add this alias for every account without hacking Web-Cyradm.
The better solution would be to update your
virtual_alias_maps file, in my case
mysql-virtual.cf, to search the table holding your virtual e-mail account users. The change can be applied as follows:
Edit the
virtual_alias_maps directive in
main.cf configuration file as follows:
Code:
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual.cf, mysql:/etc/postfix/mysql-accountusers.cf
Now, create the file
/etc/postfix/mysql-accountusers.cf with the following:
Code:
table = accountuser
select_field = username
where_field = username
additional_conditions = and status = '1' order by alias desc
Now, when an e-mail is sent to
joe@example.com, two matches are found. The
mysql-virtual.cf returns
@example.com, which is aliased to
catch@example.com. The
mysql-accountuser.cf returns
joe@example.com, which is aliased to
joe@example.com. Since
joe@example.com is the more specific of the two results, mail is delivered to this address, instead of the catch-all.
Be sure to reload the postfix configuration files before testing.
If you are more curious about the inner workings of this. You can turn on mysql logging and view the queries made both before and after the change. You will see what queries are made.
Please note that you may have to change the mysql-*.cf configuration files to correspond with your table structure. The tables I am using are the default tables used by Web-Cyradm.
If anyone has a better solution, please respond on here. I've used this method for several years without a problem. If you have any questions, please ask.
Thanks,
Jim