Seu único problema é que você usa OR em vez de AND.
Vejamos o caso em que o valor é NULL:
CON.EMAILADDRESS IS NOT NULL
=> FALSOCON.EMAILADDRESS != ' '
=> NULO
FALSO OU NULO => NULO. Como os critérios não resultam em TRUE, você não seleciona NULLs.
E se o valor for uma string vazia '', '', ou qualquer tamanho:
CON.EMAILADDRESS IS NOT NULL
=> VERDADEIROCON.EMAILADDRESS != ' '
=> FALSO
VERDADEIRO OU FALSO => VERDADEIRO. Você seleciona a string vazia.
Suponho que foi isso que o confundiu:apesar de ter usado erroneamente OR em vez de AND, você ainda removeu algumas strings vazias, mas não todas.
Então:
WHERE CON.EMAILADDRESS IS NOT NULL AND CON.EMAILADDRESS != ' ';
Ou, como qualquer string
!= ''
não pode ser NULL (NULL != ''
=> NULL, não TRUE), simplesmente:WHERE CON.EMAILADDRESS != '';