2012-04-03 7 views
8

Ho uno script PHP molto semplice, qualcosa di simile:funzione PHP mail aggiunge casualmente uno spazio per il messaggio di testo

while ($condition){ 
    echo "<a href="thanks.php?id=".$id."> THANKS </a>"; 
} 

Naturalmente, ho un codice di po 'di più, ma non importa. Una volta creato questo pezzo di codice, lo script invia un'email all'utente.

NELLA CASELLA DELLA POSTA

I collegamenti sono a posto in ogni singola riga, tranne la ULTIMO mostra il link in questo modo:

tha nks.php?id..... 

Si aggiunge uno spazio tra il codice.

Questo succede solo con hotmail. Gmail, yahoo e tutto il resto funzionano bene.

+3

Suoni come hotmail è "proteggere" l'utente da (semi) offuscamento dei collegamenti. Se è solo una situazione, dubito che sia qualcosa che stai facendo. - EDIT: Inoltre, FYIW, la tua sintassi è disattivata nel codice sopra (citazione-disallineamento) ma dato che il link funziona nel 90% delle altre situazioni, sto _assunzione_ è un errore quando sei andato a postare questo. Altrimenti, cercherò di fare in modo che entrambi sfuggano "" all'interno dell'ancora, e assicurati di avere una chiusura '" 'dopo il' $ id') –

+0

sì, questo è quello che pensavo, riguardo l'errore di battitura, ho scritto questo come esempio, questo non è il vero codice. D'altra parte .. se si tratta di un problema di hotmail perché non rende la stessa "protezione" a tutti i link! è appena successo con l'ultimo! hotmail mi fa venire voglia di prendere le pillole per farmi impazzire! – Andy

+0

Un'altra buona discussione sull'argomento: http://www.jeremytunnell.com/posts/really-hairy-problem-with-seemingly-random-crlf-and-spaces-inserted-in-emails – toto21

risposta

0

Ho visto sendmail inserire caratteri quando le righe sono troppo lunghe. Questo non è il caso qui (come gli altri client stanno gestendo bene), ma mi chiedo se hotmail ha un limite di lunghezza della linea che stai colpendo.

Se la soluzione sia differenza se si inserisce una nuova riga nel vostro echo, cioè

while ($condition){ 

    echo "<a href=\"thanks.php?id=".$id."\"> THANKS </a>\n"; 

} 
+0

no, nessuna differenza a tutto, inoltre, sono solo 10 miniature con collegamenti a thanks.php .. le prime 9 miniature sono PERFETTE (anche in hotmail) il problema è l'ultimo .. e l'url ha esattamente la stessa lunghezza per ognuna di loro. = ( – Andy

11

So che questo è in ritardo, ma c'è una soluzione alternativa che ha funzionato per me:

utilizzare questa linea alla codificare i intere Base64 messaggio usando:

$message = chunk_split(base64_encode($message)); 

Poi, aggiungi la tua intestazione:

$headers .= "Content-Transfer-Encoding: base64\r\n\r\n"; 

Ciò dirà al client di posta che il tuo messaggio è codificato in base64.

+1

Questo ha funzionato anche per me –

+1

Grazie @karancan, la tua risposta è fantastica :) Avevo un problema con gli spazi rundom nei link nelle e-mail html - sono spariti. Ottimo lavoro!! –

+0

Ha funzionato per me, grazie amico. Saluti. – user3636476

10

La soluzione di karancan probabilmente funziona, ma la causa principale è ciò che stava dicendo Hobo. La funzione mail inserisce un'interruzione di riga ogni 900 caratteri (credo). Pertanto, se crei il tuo $ message con un numero di $message .= "more text";, questo errore si verifica quando la riga supera i 900 caratteri. È confuso però perché gli spazi sembrano essere intermittenti, in particolare se si sta costruendo un messaggio HTML perché a volte le interruzioni di riga appariranno in posizioni perfettamente benigne.

La soluzione semplice è aggiungere \r\n\ alla fine delle righe.

È interessante notare che queste forme di lavoro:

$message .= "<tr><td>1</td><td>2</td>\r\n"; 
$message .= '<tr><td>1</td><td>2</td>'."\r\n"; 

ma questo non significa:

$message .= '<tr><td>1</td><td>2</td>\r\n'; 

Il \r\n deve essere circondati da virgolette, altrimenti i personaggi saranno solo ottenere aggiunto al testo, invece di creando un ritorno a capo/interruzione di riga.

+1

Sei sicuro che questa sia la funzione di posta PHP e non il server SMTP? Se è PHP -> C'è qualche bug PHP segnalato per quello? Non ho trovato nulla, ma questo comportamento dovrebbe essere cambiato (cioè omettere questo comportamento o almeno un avviso se RFC si aspetta linee corte). –

+0

Sono passati due anni da quando mi sono imbattuto in questo, ma sembra ragionevole/probabile che possa essere il server SMTP e non la funzione di posta. – Mordred

6

Stavo affrontando lo stesso problema e provato la maggior parte di queste soluzioni ma non ha funzionato per me. Sembra che quando la linea sembra troppo lunga per la funzione mail, aggiunge spazio a circa 900 caratteri. Quindi la seguente soluzione di aggiunta di wordwrap ha funzionato per me.

mail ($ to, $ subject, wordwrap ($ message), $ headers);

+0

Soluzione abbastanza semplice, anche se questo potrebbe sparpagliare il testo del contenuto attuale con inutili '
' s. Se questo non ti interessa, o non puoi garantire che i posti in cui inserire '\ r \ n's a causa del testo variabile, allora questa è una soluzione accettabile. – Mordred

Problemi correlati