integro il codice:

invia.htm

Codice PHP:
<form action="#">
<
input accesskey="B" name="_nome" tabindex="10" type="text" size="40" maxlength="40" title="AccessKey B, TabIndex 10 || Inserire il nome" />
<
textarea accesskey="Q" name="_testo" tabindex="15" rows="10" cols="60" title="AccessKey Q, TabIndex 15 || Inserire il testo dell'email"></textarea>
......
</
form
invia.js

Codice PHP:
for (var i=0;i<datiEmail.length;i++)
{
        var 
dato=encodeURIComponent(datiEmail[i]);
        
dato+="=";
        
dato+=encodeURIComponent(datiEmail[i].value);
        
body.push(dato);
        
}
return 
body.join("&");
.....
var 
xmlhttp=creaOggettoXMLHttp();
xmlhttp.open("post","invia.php",true);
xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xmlhttp.onreadystatechange=function()
{
    if (
xmlhttp.readyState==4)
    {
        if (
xmlhttp.status==200)
        {
            
alert(xmlhttp.responseText);
        }
        else
        {
                
alert("Errore durante l'invio del messaggio(" xmlhttp.statusText ").";
                         
        }
    }
};
xmlhttp.send(body); 
invia.php

Codice PHP:
header("Content-Type: text/plain;");
.....
recupero i dati da $_POST[]
.....
mail("$destinatario","$oggetto","$messaggio","$headers");
...... 
aggiungo che ho forzato il funzionamento in questo modo:
lato client, dopo aver codificato con encodeURIComponent() i dati, tramite string.replace, ho sostituito la codifica del ritorno a capo, "%0A" con una stringa di mia invenzione "#acapo".
lato server chiaramente ho sostituito dalle variabili post la stringa "#acapo" con il ritorno a capo "\r\n". così funziona, il che conferma che è quel dannato "%0A" che crea l'errore.