use Data::Dumper;
my $re = '^' . '([^@]*)@'x4 . '(.*)@([^@]*)$';
for my $line (
'2012-05-29@joedoe@example.com@AB99-5@440 4.4.1 Some error occurred@XYZ35',
'2012-05-29@foobar@invalid.com@ZZ88-6@550 5.1.1 <foobar@invalid.com>... User Unknow@GGH93',
'2012-05-29@barfoo@invalid.com@YY88-0@550 5.1.1 barfoo@invalid.com no such user@GGH93',
) {
my @fields = $line =~ /$re/ or die "can't parse '$line'";
print Data::Dumper->Dump([@fields])."\n";
}