2009-12-12 16 views
5

Alcuni giorni fa, quando si utilizza mail(), ho funzionato.La posta PHP ha smesso di funzionare

Ma ora non funziona. E non so quale sia il problema.

$to  = '[email protected]'; 
$subject = 'the subject'; 
$message = 'hello'; 
$headers = 'From: [email protected]' . "\r\n" . 
    'Reply-To: [email protected]' . "\r\n" . 
    'X-Mailer: PHP/' . phpversion(); 

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

$mail_sent = @mail($to, $subject, $message, $headers); 
echo $mail_sent ? "Mail sent" : "Mail failed"; 

Visualizza "Posta inviata".

Non ho toccato nulla in Apache o questo codice. Ho testato il codice in un file PHP vuoto con lo stesso risultato. Come posso eseguire il debug di questo problema?

+0

Suppongo che non invii effettivamente l'e-mail? –

+0

questo è il problema .. perché ha smesso di funzionare. come lo invio? =) – ajsie

+0

stesso codice non trattato, stessa configurazione, giorno diverso e ora non funziona? .. qual è il tuo motore di posta sendmail o .. ?? –

risposta

11

Potrebbe essere che Mail vengono inviati bene, ma sono catturati da un filtro spam? Se questo potrebbe essere, mi permetta di cross-post myself:


Alcuni punti di pallottola (Supponendo che la posta() restituisce vero e non ci sono errori nel log degli errori):

  • fa il mittente l'indirizzo ("Da") appartiene a un dominio sul tuo server? Altrimenti, fallo così.
  • Il server è su una lista nera (ad esempio, controlla IP su spamhaus.org)? Questa è una possibilità remota con hosting condiviso.
  • Le mail filtrate da un filtro antispam? Apri un account con un freemailer che ha una cartella spam e scoprilo. Inoltre, prova a inviare posta a un indirizzo senza filtro antispam.
  • Hai forse bisogno del quinto parametro "-f" di mail() per aggiungere un indirizzo mittente? (Vedi comando mail() nel manuale PHP)
  • Se hai accesso ai file di registro, controlla quelli, ovviamente, come suggerito sopra.
  • Controllate l'indirizzo "da:" per eventuali messaggi di rimbalzo ("Restituito al mittente")? Puoi anche impostare un indirizzo "errori-a" separato.

Per gli oratori tedeschi, ho scritto un "cosa fare" abbastanza esauriente su questo tema qualche tempo fa. Vedi here.

+1

Il primo punto elenco viene ovviamente violato (come sottolineato anche da mmsmatt). Non dire "Da: qualcuno @ gmail.com" quando il tuo server non è ovviamente Gmail. – philfreo

1

Beh, scommetto che si sta utilizzando server gratuito/commerciale che è gestito da alcuni altri ragazzi. Sfortunatamente a volte l'impostazione del server non è corretta, in modo che tu non possa ricevere l'e-mail anche se hai seguito la sintassi php corretta. Prova a contattare il centro di assistenza clienti e fagli fare il materiale diagnostico per te.

Questo succede al mio server per una volta (è da biasimare!), Quindi questo potrebbe esserti utile.

controllare questi attributi dal phpinfo(); (se ti permette di vederlo)

sendmail_from no value no value 
sendmail_path /usr/sbin/sendmail -t -i /usr/sbin/sendmail -t -i 

Le probabilità sono, questi attributi non sono configurati bene.

Non vedo nulla di male con la sua dichiarazione PHP :)

cura: è anche possibile caricare lo script di posta scritto da un altro linguaggio (Perl è la migliore in quanto la maggior parte dei server Linux averlo installato di default). Vedi se puoi inviare email da lì. Se è così, suppongo che sia l'errore di configurazione del server (problema php.ini?), Non il tuo. Se lo script Perl non è in grado di inviare e-mail, beh ... lascia che i ragazzi del centro di assistenza clienti sappiano e vedi se riesci a riavere i tuoi soldi :)

1

Il server SMTP che gestisce la tua posta potrebbe respingere il messaggio perché afferma che per venire da gmail.com.

Prova a modificare il campo "Da" in $headers in un indirizzo dal tuo dominio.

11

Quando si invia una e-mail di posta elettronica() mani php i dati verso l'applicazione è stata configurata in sendmail_path, vale a dire si genera un nuovo processo per la <sendmail_path> e passa alcuni parametri ei dati di posta elettronica. Questa applicazione dovrebbe iniettare l'e-mail nella coda di un Mail Transfer Agent (MTA).
Il valore restituito dalla funzione php's mail() "only" riflette se php è stato in grado di generare il processo, eseguire il flusso dei dati su di esso e il processo termina senza un codice di errore. Cioè mail() == true ti dice solo che l'email è stata (presumibilmente) iniettata nella coda del primo MTA sulla rotta.

Il MTA decide quindi cosa fare con l'e-mail. Probabilmente non stai lavorando per google e il tuo MTA non è "all'interno" di gmail.com. Quindi il tuo MTA deve inviarlo al prossimo MTA sul percorso di gmail.com (percorso in avanti). Questo può funzionare o meno, ma mail() === true non ti dice nulla a riguardo.
L'inoltro della posta da MTA a MTA potrebbe non riuscire in nessuno dei passaggi. E quando la posta arriva finalmente "a" gmail.com l'ultimo MTA o Mail Delivery Agent (MDA) potrebbe anche rifiutarlo per vari motivi.

Se si verifica un errore, il MTA "corrente" può (in realtà deve, ma si presume che tutto sia configurato correttamente ;-)) restituire un rapporto di errore. Questo rapporto di errore segue il percorso in avanti ma in ordine inverso (percorso inverso) e infine (o "si spera") il mittente riceve un'e-mail "posta non recapitabile".

(e questa è la versione corta. E 'probabilmente inesatto e Non sono né un amministratore né un/esperto smtp e-mail ;-))

Quindi ... cosa si può fare?

  1. Dicci di più sul tuo server. È il tuo server (casa/test)? Quale sistema operativo. Sai quale "sistema di posta" è stato installato (sendmail, qmail, ...)? Chi l'ha configurato?

  2. Chiedi a Server Fault come configurare il sistema di posta del tuo server, come potrebbe provare a dirti se qualcosa è andato storto e come convincere Google ad accettare le tue email.

  3. Eliminare il primo MTA o più al punto lasciare che lo script php stesso diventi il ​​primo MTA. Puoi farlo utilizzando, ad es. Swiftmailer (utilizzando il suo modulo di trasporto smtp) invece di mail(). In questo modo il sistema di posta locale del tuo server non deve funzionare correttamente. Lo script "direttamente" contatta il server SMTP di google, autentica "tu" e consegna la posta a google. Ancora non garantisce che la posta verrà consegnata, ma è molto più probabile che venga segnalato immediatamente un errore al tuo script, ad esempio se swiftmailer segnala "Ok" è molto più probabile che sia davvero ok che mail() restituisca "true".

1

Se hai ragione, e il codice utilizzato per funzionare non funziona più, qualcosa fuori dal tuo codice deve essere cambiato. Ci sono almeno 2 MTA (uno locale e uno remoto) che potrebbero interferire con la tua email. Se controlli quello locale, controlla la coda e i log per vedere se è stato inoltrato.

Sfortunatamente, a causa del volume e della natura dello spam, molte persone inventano metodi non standardizzati per gestirlo: RBL, RMX, chiavi di dominio, id del mittente, filtri bayesiani .... non c'è nulla di intrinsecamente sbagliato in questi approcci ma per il fatto che sono applicati unilateralmente dai fornitori di servizi spesso all'insaputa, per non parlare del consenso degli utenti del servizio. E i fornitori di solito sono molto riservati sulle disposizioni che hanno messo in atto. Ma se stai inviando a Gmail, probabilmente saranno i sistemi di filtraggio bayesiano che usano: HAI CONTROLLATO LO SPAM FOLDER?

Quindi è molto probabile che anche se la modifica è stata applicata da qualche parte oltre la sfera di influenza, potrebbe non essere un blocco assoluto, tuttavia il routing della posta attraverso il server di posta potrebbe richiedere un sacco di sperimentazione.

C.

Problemi correlati