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 」みたいな形でも適合するんですよね。addr-spec を調べるために使うのはちょっと牛刀かなぁと思います。