The optional canonical file specifies an address mapping for local and non-local addresses. The mapping is used by the cleanup(8) daemon. The address mapping is recursive.

The file serves as input to the postmap(1) command. The result, an indexed file in dbm or db format, is used for fast searching by the mail system.

The canonical mapping affects both message header addresses (i.e. addresses that appear inside messages) and message envelope addresses (for example, the addresses that are used in SMTP protocol commands). Think Sendmail rule set `S3`, if you like.

Typically, one would use the canonical table to replace login names by `Firstname.Lastname`, or to clean up addresses produced by legacy mail systems.

The canonical mapping is not to be confused with virtual domain support. Use the virtual domain map for that purpose.

The canonical mapping is not to be confused with local aliasing. Use the mail aliases map for that purpose.

The format of the canonical mappings is as follows, mappings being tried in the order as listed:

- `user@domain` mapped to... `address`:
  `user@domain` is replaced by `address` This form has the highest precedence. This form useful to clean up addresses produced by legacy mail systems. It can also be used to produce `Firstname.Lastname` style addresses, but see below for a simpler solution.
- `user` mapped to...`address`:
  `user@site` is replaced by address when site is equal to `$myorigin`, when site is listed in `$mydestination`, or when it is listed in `$inet_interfaces`. This form is useful for replacing login names by `Firstname.Lastname`.
- `@domain` mapped to...`address`:
  Every address in domain is replaced by address. This form has the lowest precedence.

In all the above forms, when address has the form `@otherdomain`, the result is the same user in otherdomain.

ADDRESS EXTENSION: When table lookup fails, and the address localpart contains the optional recipient delimiter (e.g., `user+foo@domain`), the search is repeated for the unextended address (e.g. `user@domain`), and the unmatched extension is propagated to the result of table lookup. The matching order is: `user+foo@domain`, `user@domain`, `user+foo`, `user`, and `@domain`.