If no Routing Table record can be applied to an address, and the address is not a special address or an IP address of a local domain, the Router calls each communication module requesting a routing operation.
Each module looks at the address passed and can:
If a module has modified an address, the Router makes a new iteration, repeating all steps for the new, modified address.
If the Router is called from the Message Enqueuer component, and a module has accepted the address, the message is enqueued to this module for delivery.
If the Router is called from the Signal component, and a module has accepted the address, the Signal Request is sent to this module for processing.
Each module is called twice. First, the Router calls each module asking to process "explicit" addresses. On this call the modules process only the addresses that are definitely directed to that module: the SMTP module processes addresses with the domain part ending with ._smtp, the LIST module processes the addresses of the existing mailing lists, etc.
If all modules have ignored an address, the Router calls each module again, asking for a "final" attempt. On that stage, the Local Delivery module processes all addresses directed to local Domains, the SIP module accepts all signal-type addresses, the SMTP module processes all addresses with domain names that have at least one dot, etc.
This two-step method allows several modules to correctly process addresses without relying to a particular module call order. If each module would process an address in one step, listname@domainname addresses (that look like Local account addresses), would be rejected with the Local Delivery module if it is called before the LIST module, user@accountName.local addresses would be taken with the SMTP module instead of the Local Delivery module, etc.
See the module descriptions for the details.