Hola,
El %40 es porque el formulario envia los datos codificados. Mira las funciones urlencode() (
www.php.net/urlencode) y urldecode() (
www.php.net/urldecode).
Flash muestra correctamente el @ donde recibe el %40 porque Flash entiende la codificacion UTF-8 (creo que es esa la del %40). Sin embargo, cuando PHP muestra el %40, realmente no es PHP el que lo muestra, es el navegador y el HTML. Asi que realmente no es un problema de PHP, sino de codificaciones.
Saludos.