Podop is a piece of middleware designed to run between Postfix or Dovecot on one side, any Python implementation of a table lookup protocol on the other side. It is thus able to forward Postfix maps and Dovecot dicts to the same (or multiple) backends in order to write a single, more flexible backend for a mail distribution. Examples ======== - Connect Postfix to a DNS lookup so that every domain that has a proper MX record to your Postfix is actually accepted as a local domain - Connect both Postfix and Dovecot to an HTTP microservice to run a high availability microservice-based mail service - Use a single database server running any Python-compatible API for both your Postfix and Dovecot servers Configure Podop tables ====================== Podop tables are configured through CLI arguments when running the server. You must provide a ``--name`` for the table, a ``--type`` for the table and a ``--param`` that parametrizes the map. URL table --------- The URL table will initiate an HTTP GET request for read access and an HTTP POST request for write access to a table. The table is parametrized with a template URL containing ``§`` (or ``{}``) for inserting the table key. ``` --name test --type url --param http://microservice/api/v1/map/tests/§ ``` GET requests should return ``200`` and a JSON-encoded object that will be passed either to Postfix or Dovecot. They should return ``4XX`` for access issues that will result in lookup miss, and ``5XX`` for backend issues that will result in a temporary failure. POST requests will contain a JSON-encoded object in the request body, that will be saved in the table. Postfix usage ============= In order to access Podop tables from Postfix, you should setup ``socketmap`` Postfix maps. For instance, in order to access the ``test`` table on a Podop socket at ``/tmp/podop.socket``, use the following setup: ``` virtual_alias_maps = socketmap:unix:/tmp/podop.socket:test ``` Multiple maps or identical maps can be configured for various usages. ``` virtual_alias_maps = socketmap:unix:/tmp/podop.socket:alias virtual_mailbox_domains = socketmap:unix:/tmp/podop.socket:domain virtual_mailbox_maps = socketmap:unix:/tmp/podop.socket:alias ``` In order to simplify the configuration, you can setup a shortcut. ``` podop = socketmap:unix:/tmp/podop.socket virtual_alias_maps = ${podop}:alias virtual_mailbox_domains = ${podop}:domain virtual_mailbox_maps = ${podop}:alias ``` Dovecot usage ============= In order to access Podop tables from Dovecot, you should setup a ``proxy`` Dovecot dictionary. For instance, in order to access the ``test`` table on a Podop socket at ``/tmp/podop.socket``, use the following setup: ``` mail_attribute_dict = proxy:/tmp/podop.socket:test ``` Multiple maps or identical maps can be configured for various usages. ``` mail_attribute_dict = proxy:/tmp/podop.socket:meta passdb { driver = dict args = /etc/dovecot/auth.conf } userdb { driver = dict args = /etc/dovecot/auth.conf } # then in auth.conf uri = proxy:/tmp/podop.socket:auth iterate_disable = yes default_pass_scheme = plain password_key = passdb/%u user_key = userdb/%u ``` Contributing ============ Podop is free software, open to suggestions and contributions. All components are free software and compatible with the MIT license. All the code is placed under the MIT license.