php mail () funzione dolorosamente lenta sulla macchina di sviluppo locale


21

Contesto: se hai impostato un server Apache locale per scopi di sviluppo, potresti aver riscontrato il problema in cui sendmail impiega molto tempo (almeno un minuto) per inviare e-mail. Ciò è estremamente frustrante se stai cercando di eseguire il debug di un problema con un'email che hai generato.

Ci sono molti post sul forum su Internet che discutono di questo problema. Tuttavia, nessuno dei temi ha descritto cosa fare in modo sufficientemente dettagliato per la mia conoscenza limitata. Ecco i passaggi che hanno funzionato per me:

1) trova il tuo nome host (nel caso lo avessi dimenticato) usando questo comando:

:~$ cat /hosts/hostname

myhostname

2) modifica il file /etc/hostse assicurati che la prima riga sia la seguente:

127.0.0.1 localhost.localdomain localhost myhostname

3) modifica il file di configurazione di sendmail ( /etc/mail/sendmail.cfin Ubuntu) e Rimuovi il commento#O HostsFile=/etc/hosts

4) Riavvia il computer. Il computer dovrebbe avviarsi molto più velocemente ora e la funzione mail () dovrebbe tornare quasi immediatamente. TUTTAVIA, le e-mail non verranno effettivamente inviate se non segui il passaggio 5.

5) Devi usare di nuovo l'opzione '-f' di sendmail ogni volta che usi la funzione mail. Per esempio:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

La mia domanda per i miei compagni serverfaulters è:

Quali ulteriori modifiche possono essere apportate in modo da non dover utilizzare l'opzione sendmail -f? Anche se non è molto difficile aggiungere l'opzione -f, è un problema quando il tuo CMS (come Drupal) non usa l'opzione -f durante l'invio di posta. Dovresti hackerare un modulo principale per aggiungere questa opzione.


1
sul mio sistema Ubuntu il comando ècat /etc/hostname
zkent

Risposte:


6

Bene, so che questo non è ciò che stai chiedendo, ma perché non provi Postfix o Exim? Sono entrambi disponibili per Ubuntu (Postfix è persino il mta predefinito sui sistemi Ubuntu) ed entrambi forniscono un comando "sendmail" compatibile che funziona molto bene. Sendmail di IMHO è un po 'datato e avrai maggiori possibilità di supporto con MTA più moderno.


Anche se esistono sistemi di posta migliori di sendmail, il problema è mantenere un server di sviluppo che rispecchia il server di produzione. sendmail è l'agente di posta predefinito per php.
Michael B,

1
Intendi sendmail il software o sendmail il binario? Perché Exim e Postfix hanno anche il sendmailbinario che accetta le stesse opzioni dell'originale sendmail, per motivi di compatibilità.
coredump,

Non sono un grande fan di Exim per esperienza passata, ma ho provato Postfix e risolto w / e problemi che stiamo accadendo con Sendmail immediatamente!
cambio rapido il

2

Questo ha funzionato per me:

  • Installa postfix

Consulta le istruzioni qui su come eseguire questa operazione qui: https://help.ubuntu.com/community/Postfix (potrebbe essere già installato e il file binario "sendmail" potrebbe effettivamente essere un alias per postfix)

  • Segui le istruzioni qui:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Trova il sendmailprocesso

ps aux | grep mail

Uccidilo

kill <thepid>

Ricomincia postfix

/etc/init.d/postfix restart

Penso che puoi semplicemente impostare il parametro 'myorigin' su qualsiasi nome di dominio attivo come un nome di dominio che possiedi.


Perfezionare! Questo DOPO mi ha tormentato per due ore. =)
Hannes Schneidermayer,

1

Questa potrebbe o meno essere una soluzione per te: aggiungi mail.force_extra_parameters = "-fsender@somewhere.com"al tuo file php.ini . Rende PHP automaticamente aggiungere -fsender@somewhere.com come quinto parametro alla funzione mail () di PHP.

È un valore hardcoded e applicabile solo in php.ini, quindi non sarà molto flessibile, ma forse funziona per te nel tuo caso di sviluppo?


0

Osservando il traffico di rete (pensa tcpdump) o eseguendo un stracesui tuoi processi sendmail o apache, dovresti essere in grado di avere un'idea del perché quel ritardo è presente in modo da poter risolvere il problema di root.

Di solito i ritardi in tale intervallo sono dovuti a ricerche DNS non riuscite, ma non lo saprai finché non guarderai. A meno che tu non risolva il problema sottostante, probabilmente finirà per essere un problema, indipendentemente da come cerchi di aggirare il problema.


1
Il ritardo era causato dal fatto che il nome host era una singola parola anziché un nome di dominio completo (nome di dominio completo). Puntando sendmail su / etc / hosts e avendo localhost.domain come primo nome di dominio (che è un FQDN) non c'è ritardo. Ciò è stato risolto nei passaggi 1-4. Il problema rimanente è dover usare '-f' - ancora un grande miglioramento nel dover aspettare 2 minuti per inviare la posta.
Michael B,

0

Non ho mai riscontrato un problema usando mail () in PHP che non era il risultato di un problema sull'MTA.

Nel tuo file php.ini mostrerà quale comando esegue per inviare un'e-mail (impostazione predefinita: "sendmail -t -i"). Prova a inviare un'email dalla riga di comando usando questo: scommetto che è lento.

Le cose usuali da verificare sono se un server DNS è configurato correttamente sulla macchina (e può risolvere tutti gli indirizzi configurati nell'MTA) e che se uno smart relay è configurato, il nome è risolvibile in un indirizzo a cui il sistema può connettersi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.