2011-11-21 5 views
9

Quando eseguo il mio script di posta elettronica via browser viene restituito un errore fatale (a meno che non aumenti drasticamente il tempo di esecuzione, allora funzionerà bene, non la soluzione che sto cercando). L'e-mail viene inviata al, ma ci vuole sempre (5 minuti in media) per arrivare (nella mia casella di posta)!
(Considerando che tramite linea di comando che funziona perfettamente penso che SMTP in php.ini è certamente ben configurato.)mail() timeout issue

Quindi questo è il codice eseguito su richiesta del browser:

<?php 
mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>'); 
?> 

e quando corro questo stesso (? E 'davvero la stessa sto iniziando a dubitare di me stesso) codice tramite riga di comando:

php -r "mail('[email protected]', 'test subject', 'test body', 'From: Andre Matos <[email protected]>');" 

funziona perfettamente! Lo script viene eseguito, si ferma e l'email arriva istantaneamente (2/3 secondi).

Quindi, cosa può causare questa differenza e come risolverlo? Qualche idea?
Grazie in anticipo.


[modifica] qualche informazione in più:
- la macchina è Windows
- il server è localhost
- php.ini è la stessa sia per il browser e l'istanza cli


[edit2]
Grazie a tutti per aver cercato di indovinare quale era il problema. Ho posto la domanda saltando che qualcuno avesse il problema prima e sapesse qualcosa di specifico. Dato che non è stato mostrato nulla di specifico e nessuno dei suggerimenti ha funzionato, ho deciso di accettare quello che mi ha permesso di raggiungere più conclusioni sul problema ... +1 Per tutte le tue utili conoscenze/pensieri (/ ipotesi) :-)

+2

La riga di comando e il browser stanno attualmente utilizzando due diversi file php.ini. Potresti voler cercare php.ini e confrontare le tue impostazioni – Patrick

+1

Questo non ha senso per me; Quindi ho controllato: 'php --ini' restituisce lo stesso percorso per il file di configurazione del browser. – acm

+0

Presumo che sendmail_path sia lo stesso? – djdy

risposta

5

Ho ipotizzato alcuni couses, ma ho usato a Linux e su Windows posso olny indovinare:

  1. php_cli e mod_php sono 2 binari diversi, mod_php posso essere leggermente danneggiato
  2. php_cli e mod_php uso 2 utenti diversi, il profilo di rete dell'utente apache può essere il problema (dns, firewall, proxy ...)
  3. lo script php si trova in posizione "problematica" o contiene qualche carattere problematico, ma lo script cli è param, prova ad eseguire lo stesso script: php -fz: \ path \ to \ php \ mail.php
+0

Ciao, ho provato ad eseguire il file tramite CLI come hai dichiarato e ha funzionato come previsto, consegna immediata; Quindi il problema non dovrebbe essere il file di script. – acm

+0

@andrematos per verificare .1 puoi reinstallare mod_php e verificare .2 puoi fare dal sistema apache/html_page ("php -fz: \ path \ to \ php \ mail.php") –

+0

Ciao Ivan, ho provato .2 ed è stato sorpreso nel vedere che ci vuole tanto come eseguire mail() direttamente dal browser. È possibile che vengano utilizzati utenti diversi? Voglio dire, è stato tutto installato allo stesso modo, allo stesso tempo ... Non ha ancora senso ... Grazie comunque. – acm

2

Giusto per essere chiari: l'istanza php utilizzata dallo script è uguale a quella utilizzata dal codice della riga di comando?

Molti host Web utilizzano smtp-relay, che raccoglierà un sacco di e-mail e li invierà tutti in una volta, quindi non sarà strano se la tua posta è in ritardo. Tuttavia, il tempo di esecuzione lungo non è normale.

+0

Sto eseguendo questo dalla mia macchina, quindi sì, è lo stesso. – acm

3

Dato questa nota da http://php.net/manual/en/function.mail.php, sembra molto probabile che il problema è con la MTA e non php direttamente:

L'implementazione di Windows di mail() differisce in molti modi dalla implementazione di Unix.Innanzitutto, non utilizza un binario locale per comporre messaggi ma funziona solo su socket diretti, il che significa che è necessario un MTA in ascolto su un socket di rete (che può essere localhost o remoto).

Forse ha qualcosa a che fare con il modo in cui il MTA risponde al particolare utente, o regole firewall specifiche per l'utente per le connessioni di posta in uscita sulla vostra macchina. Puoi eseguire la riga di comando come utente del web server piuttosto che te stesso? In tal caso, ricrea il problema dalla riga di comando?

Che ne dici se il server Web esegue il PHP da riga di comando anziché il file PHP analizzato? (Ad esempio, forse è possibile eseguire uno script batch tramite CGI.) Risolve il problema?

(Mi dispiace che questi sono più supposizioni che risposte definitive.)

+0

Trott, grazie per il tuo impegno, tuttavia, come ho spiegato a Sekar (vedi commenti), non penso che sto passando per MTA. Potrei avere l'idea sbagliata che ... – acm

+0

@andrematos MTA è un termine generico per qualcosa che gestisce il trasferimento della posta. Indipendentemente da ciò, continuerei a verificare la presenza di potenziali problemi relativi agli utenti e alle regole del firewall. – Trott

2

tenta di impostare nome utente e password per "Da" id mail. quindi può autenticarsi e inviare la posta velocemente.

Hai provato PHP mailer?

Nella mia osservazione invia messaggi in pochi secondi. Sotto l'esempio ti daremo un rapido sguardo su come usare php mailer class.

include "class.phpmailer.php"; 
$msg="Hello! This is a test..." 
$mail=new PHPMailer(); 
$email="[email protected]"; //person who receives your mail 
$mail->IsSMTP(); 
$mail->Host = "localhost"; 
$mail->SMTPAuth = true; 
$mail->Username = "[email protected]"; //your mail id 
$mail->Password = "sdfsd441"; //password for your mail id 
$mail->SetFrom('[email protected]', 'admin'); //from address 
$mail->AddAddress($email); 
$mail->Subject ="Test Mail"; 
$mail->Body = $msg; 
$mail->IsHTML(true); 
$mail->MsgHTML($msg); 
$mail->Send(); 

EDIT:
In PHP manuale hanno dichiarato come questo,

L'implementazione di Windows di mail() differisce in molti modi dal implementazione di Unix. Innanzitutto, non utilizza un binario locale per comporre messaggi ma funziona solo su socket diretti, il che significa che è necessario un MTA in ascolto su un socket di rete (che può essere localhost o remoto).

in modo che possa causare un ritardo? Penso che questo link potrebbe aiutarti.

+0

Ho provato sia PHPMailer che [Swift] (http://swiftmailer.org/) e il comportamento è esattamente lo stesso. – acm

+0

@andrematos controlla la sezione di modifica della mia risposta – VKGS

+0

Sekar, mi sto connettendo al SMTP di destinazione. Le mie impostazioni sono simili a: SMTP: mail.example.com; DA: [email protected]; A: [email protected]; Quindi penso che l'MTA non abbia alcun ruolo qui. – acm

2

Prima di inviare la posta nello script assicurarsi di stampare la ini_get() delle variabili SMTP, smtp_port e sendmail_from ed essere certi che questi sono i valori di lavoro. PHP in esecuzione su Windows non ha il vantaggio di inviare la posta via Sendmail, e qualsiasi cosa gli sviluppatori di PHP siano messi insieme per essere confusa al meglio.

mi piace sempre di testare la posta via telnet così posso vedere se il server sta dando un errore che non viene passato nuovamente correttamente da parte del cliente:

c:\> telnet smtp.domain.com 25 

220 smtp.domain.com ESMTP Postfix 
helo mailtest 
250 smtp.domain.com 
mail from: [email protected] 
250 2.1.0 Ok 
rcpt to: [email protected] 
250 2.1.5 Ok 
data 
354 End data with <CR><LF>.<CR><LF> 
from: [email protected] 
to: [email protected] 
subject: test mail 

this is a test message 
. 
250 2.0.0 Ok: queued as 42AD8364FE0E 
quit 
221 2.0.0 Bye 
2

La mia prima ipotesi è che la versione del browser del tuo mailing ha già un contesto o connessioni pronte per l'invio. Al contrario, l'esecuzione diretta (php -r) deve caricare il contesto di invio.

Per confermare questa idea, è possibile creare un ciclo per l'invio di 10 e-mail e verificare se i messaggi dopo il primo sono molto più veloci.