Tu único problema es que usas OR en lugar de AND.
Veamos el caso donde el valor es NULL:
CON.EMAILADDRESS IS NOT NULL
=> FALSOCON.EMAILADDRESS != ' '
=> NULO
FALSO O NULO => NULO. Como los criterios no dan como resultado VERDADERO, no seleccione NULL.
Y si el valor es una cadena vacía '', '', o cualquier longitud:
CON.EMAILADDRESS IS NOT NULL
=> VERDADEROCON.EMAILADDRESS != ' '
=> FALSO
VERDADERO O FALSO => VERDADERO. Seleccionas la cadena vacía.
Supongo que esto es lo que te confundió:a pesar de haber usado OR por error en lugar de AND, eliminaste algunas cadenas vacías, pero no todas.
Entonces:
WHERE CON.EMAILADDRESS IS NOT NULL AND CON.EMAILADDRESS != ' ';
O, como cualquier cadena != ''
no puede ser NULL (NULL != ''
=> NULO, no es VERDADERO), simplemente:
WHERE CON.EMAILADDRESS != '';