Read the RFC dude, the @ symbol must be encoded lol. It sucks ass but it must be done. Last time I made a filter for special chars it was easiest to do a find on the index of the special chars, remove the char from the string array by index, and then inject the encoded value back into the array by index.
Cyberchef is a great resource for testing what right should fuzzily look like, you can also strip logic from them need be on capturing.