Из глубины веков:
#!/usr/bin/perl
# Usage (SSI):
# <!--#include virtual="this_file.cgi?email=realemail@domain.tld&fakedemail=fakedemail@domain.tld&text=Some text (may contain e-mails)" -->
#
print "Content-type: text/html\n\n";
&ParseInput;
$JSEMailArray = '\\\''. join ('\\\',\\\'',(split('',$email))) .'\\\'';
$JSTextArray = '\''. join ('\',\'',(split('',$text))) .'\'';
$JSOut = q|<script language=javascript>document.write('<a href="mailto:%%fakedemail%%" onmouseover="email = new Array(%%JSEMailArray%%);this.href=\'mailto:\';for(i=0;i<email.length;i++){this.href+=email[i]}">')</script><script language=javascript>text=new Array(%%JSTextArray%%);for(i=0;i<text.length;i++){document.write(text[i])}</script><script language=javascript>document.write('</a>')</script>|;
$JSOut =~ s|%%(.*?)%%|$$1|ge;
print $JSOut;
exit;
sub ParseInput { #GET only
@allowednames=('email','text','fakedemail');
if ($ENV{'REQUEST_METHOD'} =~ m/^get$/i){@pairs=split(/&/,$ENV{'QUERY_STRING'})}
else {print ''; exit}
foreach $pair (@pairs) {
local($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
$name =~ tr/\0//d;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg;
$value =~ tr/\0//d;
$value =~ s/<!--(.|\n)*-->//g;
$found = '';
foreach $allowedname(@allowednames){if($allowedname eq $name){$found='OK';last}}
unless ($found){print '';exit}
$$name = $value;
}
}