Lo ví algo por arriba, y no detecté errores en su mayor medida. Básicamente te fijás que sea un caracter o un número, y que si no es así, que sea un punto o un arroba.
Pero eso no te impide el poner más de un arroba, en cuyo caso estaría mal.
Yo diría que busques el arroba.. y desde ahí recorras hacia atrás. Debés encontrar caracteres, números o puntos.
Luego hacia adelante, debés encontrar caracteres, números y AL MENOS UN punto.
Y podría extenderse en detalle, pero realmente no vale la pena.
De paso, en lugar de fijarte si ord(cadena[contador]) > xx y si ord(cadena[contador]) < yy
podrías definir un conjunto de caracteres y letras
type
validos = ['0'..'9', 'a'..'z', 'A'..'Z']
var
conjunto_validos: validos;
Y verificás con
if cadena[contador] IN conjunto_validos ...
Espero que te sirva, saludos.