There are a number of ways in which virtual domains can be handled in Exim.
As this seems to be quite a common requirement, some ways of doing this are
described here. These are not the only possibilities.

Simply sending all mail for a domain to a given host isn't really a virtual
domain; it is just a routing operation that can be handled by a `domainlist'
router.

To send all mail for a domain to a particular local part at a given host,
define the domain as local, then process it with a `smartuser' director that
sets the new delivery address and passes the message to an `smtp' transport
which specifies the host.
Alternatively, use a `forwardfile' director pointing to a fixed file name; the
file can contain any number of addresses to which each message is forwarded.

A virtual domain that does not preserve the envelope information when
delivering can be handled by an alias file defined for a local domain.
If you are handling a large number of local domains, you can define them as a
file lookup. For example:

local_domains = "your.normal.domain:\
dbm;/customer/domains"

Where `/customer/domains' is a DBM file built from a source file that
contains just a list of domains:

You can then set up a director (see below) to handle the customer domains,
arranging a separate alias file for each domain. A single director can handle
all of them if the names follow a fixed pattern. Permissions can be arranged so
that appropriate people can edit the alias files. The `domains' option ensures
that this director is used only for the customer domains. The DBM file lookup
is cached, so it isn't too inefficient to do this. The `no_more' setting
ensures that if the lookup fails, Exim gives up on the address without trying
any subsequent directors.

and the messages get delivered with RCPT TO (the envelope) containing the
original destination address (for example, `postmaster@customer1.domain'). In
fact, you could use the same file for `/virtual/routes' and
`/customer/domains', since the lookup on the latter doesn't make any use of the
data -- it's just checking that the file contains the key.