Sei que minha resposta não será apreciada por muitos, mas considere os pontos descritos aqui antes de fazer o polegar para baixo.
Qualquer coisa facilmente legível por máquina será facilmente legível por máquina pelos spammers. Embora suas ações nos pareçam estúpidas, elas não são pessoas estúpidas. Eles são inovadores e engenhosos. Eles não usam apenas robôs para coletar e-mails, eles têm uma infinidade de métodos à sua disposição e, além disso, eles simplesmente pagam por boas novas listas de e-mails. O que isso significa é que eles conseguiram milhares de hackers de chapéu preto em todo o mundo para executar seus trabalhos. Pessoas prontas para codificar malware que raspa as telas dos navegadores de outras pessoas, o que eventualmente torna inútil qualquer método que você está tentando obter. Este tópico já foi lido por mais de 10 pessoas e elas estão rindo de nós. Alguns deles podem até ficar entediados às lágrimas para descobrir que não podemos colocar um novo desafio para eles.
Lembre-se de que você não está tentando economizar seu tempo, mas o tempo dos outros. Por esse motivo, considere passar um tempo extra aqui. Não existe uma bala mágica fácil de executar que funcione. Se você trabalha em uma empresa que publica e-mails de 100 pessoas no site e pode reduzir 1 e-mail de spam por dia por pessoa, estamos falando de 36500 e-mails de spam por ano. Se a exclusão de um e-mail leva, em média, 5 segundos, estamos falando de 50 horas de trabalho por ano. Sem mencionar a quantidade reduzida de aborrecimento. Então, por que não passar algumas horas nisso?
Não são apenas você e as pessoas que recebem o email que consideram o tempo um ativo. Portanto, você deve encontrar uma maneira de ofuscar os endereços de e-mail dessa maneira, de modo que não compense em decifrá-lo. Se você usar algum método amplamente usado para ofuscar os e-mails, realmente vale a pena decifrá-lo. Como resultado, o cracker terá em mãos milhares, senão dezenas ou centenas de milhares de novos e-mails. E para eles, eles receberão dinheiro.
Então, vá em frente e codifique seu próprio método. Este é um caso raro em que a reinvenção da roda realmente compensa. Use um método que não seja legível por máquina e que, de preferência, exija alguma interação do usuário sem sacrificar a experiência do usuário.
Passei cerca de 20 minutos para codificar um exemplo do que quero dizer. No exemplo, usei o KnockoutJS simplesmente porque gosto e sei que você provavelmente não o usará. Mas é irrelevante de qualquer maneira. É uma solução personalizada que não é amplamente usada. Quebrá-lo não representará uma recompensa por fazê-lo, pois o método de fazê-lo funcionaria apenas em uma única página na vasta Internet.
Aqui está o violino: http://jsfiddle.net/hzaw6/
O código abaixo não pretende ser um exemplo de bom código. Mas apenas uma amostra rápida de código, que é muito difícil para a máquina descobrir, nós até lidamos com e-mails aqui. E mesmo que isso possa ser feito, não vai valer a pena executar em larga escala.
E sim, eu sei que ele não funciona no IE = lte8 por causa de 'Não é possível obter a propriedade' atributos 'de referência indefinida ou nula', mas simplesmente não me importo porque é apenas uma demonstração do método, não uma implementação real, e não se destina a ser usado na produção como é. Sinta-se livre para codificar o seu, que é mais legal, tecnicamente mais sólido etc.
Ah, e nunca nomeie algo como email ou email em html ou javascript. É muito fácil raspar o DOM e o objeto de janela para qualquer coisa chamada email ou email e verificar se ele contém algo que corresponda a um email. É por isso que você não deseja nenhuma variável que contenha email em seu formato completo e também é por isso que você deseja que o usuário interaja com a página antes de atribuir essas variáveis. Se o seu modelo de objeto javascript contiver algum endereço de email no estado pronto para DOM, você os estará expondo aos spammers.
O HTML:
<div data-bind="foreach: contacts">
<div class="contact">
<div>
<h5 data-bind="text: firstName + ' ' + lastName + ' / ' + department"></h5>
<ul>
<li>Phone: <span data-bind="text: phone"></span></li>
<li><a href="#999" data-bind="click:$root.reveal">E-mail</a> <span data-bind="visible: $root.msgMeToThis() != ''"><input class="merged" data-bind="value: mPrefix" readonly="readonly" /><span data-bind="text: '@' + domain"></span></span></li>
</ul>
</div>
</div>
</div>
O JS
function ViewModel(){
var self = this;
self.contacts = ko.observableArray([
{ firstName:'John', mPrefix: 'john.doe', domain: 'domain.com', lastName: 'Doe', department: 'Sales', phone: '+358 12 345 6789' },
{ firstName:'Joe', mPrefix: 'joe.w', domain: 'wonder.com', lastName: 'Wonder', department: 'Time wasting', phone: '+358 98 765 4321' },
{ firstName:'Mike', mPrefix: 'yo', domain: 'rappin.com', lastName: 'Rophone', department: 'Audio', phone: '+358 11 222 3333' }
]);
self.msgMeToThis = ko.observable('');
self.reveal = function(m, e){
var name = e.target.attributes.href.value;
name = name.replace('#', '');
self.msgMeToThis(name);
};
}
var viewModel = new ViewModel();
ko.applyBindings(viewModel);