Email::Valid に 内部 utf8 文字列を渡すとはまる
use utf8; use Email::Valid; print Email::Valid->address('日本語@ドメイン.です') ? 'OK' : 'NG', "\n";
の結果は「OK」となります。Email::Valid::Loose でもそうなります。
国際化ドメインとして考えるのならいいのですかね?でもその場合でも local-part(@ より前の部分)が ALNUM 等じゃないのは RFC 2822 でもまだ違反な気がします(識者の方教えてください)。
原因は以下のようなことだと思います。
Email::Valid で利用されている $RFC822PAT という正規表現は Jeffrey Friedl の Mastering Regular Expressions を引用したみたいなのですが,こちらをご覧いただくとわかるとおり,NonAscii が [\x80-\xff] と定義されているのです。内部 utf8 フラグが立っていると,漢字等では \xff を越えますから,「NonAscii ではない」と判断され,atom-char として使えることになってしまうのです。
対策としては,utf8 フラグが立っている場合は encode する…というか utf8 フラグが立っている時点でアウトの気もします。
追記
Email::Valid は,RFC822 に適合しているかテストするんですけど,これは「RECIPIENT NAME