There might be a simpler way to do this, but here's what I did 3 years ago, and it carried forward into full Zimbra production.
Append zimbra.example.com to /etc/mail/local-host-names
Add Zimbra users to /etc/mail/virtusertable (/etc/aliases might also work). Run newaliases or makemap hash virtusertable < virtusertable unless you're sure your init script takes care of that.
Append the below to sendmail.mc, then m4 < sendmail.mc > sendmail.cf
Finally, restart sendmail.
Code:
LOCAL_CONFIG
LOCAL_RULE_0
R$+ < @zimbra.example.com. > $#esmtp $@ [zimbra.example.com.] $: $1 <@example.com>
Note: the whitespace between the > and the $ needs to be one or more tabs, not a run of spaces.
Any user whose account is in Zimbra rather than on the local machine gets an entry in /etc/mail/virtusertable to forward the mail there. But since zimbra.example.com is in /etc/mail/local-host-names, the mail isn't actually forwarded. We don't want it to forward, because the Zimbra namespace is example.com, not zimbra.example.com. We need to catch it in ruleset 0 by hostname and then route the mail from there.