You should use grep with perl regular expression (-P option) which supports lookahead assertions like (?: ). Also curly braces shouldn't be escaped.
Try:
grep -P '\w*(?:\.\w*)*@\w*(?:\.\w*)*\w{2,5}'
Since perl expressions are experimental feature in GNU grep you may want to change (?: ) to ( ) and user extended expressions (-E):
grep -E '\w*(\.\w*)*@\w*(\.\w*)*\w{2,5}'
Some of the extended expression implementations do not support curly braces { and }. For portability you can use basic regular expressions.
To use basic regular expressions escape ( and ) and leave also { and } escaped.
grep '\w*\(\.\w*\)*@\w*\(\.\w*\)*\w\{2,5\}'
\word characters are permitted in an e-mail address. See en.wikipedia.org/wiki/Email_address#Syntax. – Mechanical snail Aug 3 '11 at 11:38