I've done a proof-of-concept implementation that works as documented below the signature.
This retains the old recipient_delimiter parameter because that parameter has been in use since 19981029 in the forward_path default parameter value, and I can't have a multi-character value there. To support users that have .forward+foo and .forward-foo, you'd have to spell the file names explicitly: /etc/postfix/main.cf: recipient_delimiters = +- forward_path = $home/.forward+${extension}, $home/.forward-${extension}, $home/.forward This works regardless of what the delimiter in the email address was; Postfix does not use that when it searches forward_path. Wietse recipient_delimiters (default: $recipient_delimiter) The set of characters that can separate user names and address extensions (user+foo). See canonical(5), local(8), relocated(5) and virtual(5) for the effects this has on aliases, canonical, virtual, and relocated lookups. Basically, the software tries user+foo before trying user. When the recipient_delimiters set contains multiple characters, user names and address extensions are separated at the first character that matches the recipient_delimiters set. The implementation recognizes only one delimiter character per email address. By default, the recipient_delimiter (note: singular) value equals the first character of the recipient_delimiters parameter value. The recipient_delimiter parameter is used in the default forward_path value, where the software tries .forward+foo before trying .forward. When the recipient_delimiters parameter is not specified, its value defaults to the recipient_delimiter value. Example: # Handle both Postfix and qmail extensions. recipient_delimiters = +-