2012-08-04 11 views
31

di PHP mail sembra consegnare la posta su un sistema pulito, senza alcuna configurazione apparente fatto dall'amministratore o webmaster (nessuna configurazione SMTP in php.ini, etc.). In che modo la funzione mail consegna la posta a un server remoto?Come funziona `mail` di PHP? la funzione

+0

Perché questa configurazione è stata eseguita? A meno che non intenda consegnare la posta al webmaster, non ha senso che il webmaster configuri le cose. – 11684

+0

Stai facendo la domanda sbagliata - non c'è niente di sbagliato nella funzione mail() in PHP - non è inaffidabile. Il problema è il contenuto e la distribuzione delle tue mail. Una domanda migliore potrebbe essere "come posso evitare che le mie mail finiscano nella cartella spam?". – Repox

+0

ha detto "affidabile" ma questa non è davvero una domanda per ... qui – Alex

risposta

22

Su * nix si invoca il sendmail binario, che poi utilizza la configurazione della posta per instradare la posta elettronica. Su Windows, invia a un server SMTP. In entrambi i casi, l'amministratore di sistema imposta il sistema di posta.

+2

Grazie per aver risposto alla domanda che ho posto. Non ero sicuro che PHP stesse contattando il server remoto stesso e gestendo l'SMTP, o se avesse trasferito quell'attività al MTA sul server locale. Inoltre, sai perché questa domanda è stata downvoted? Penso che molte persone semplicemente lo abbiano frainteso. Sembra adattarsi allo scopo del sito (come definito da [le FAQ] (http://stackoverflow.com/faq)). –

+5

@ Tom: le persone si sono fissate sulla formulazione piuttosto che sulla domanda. –

+0

Ho modificato la domanda per aiutare a correggere il problema. Non capisco cosa sia "ambiguo, vago, incompleto, eccessivamente ampio o retorico" a riguardo. Ho provato a chiedere nella chatroom di PHP ma nessun moderatore era lì o nessuno di loro ha risposto. C'è un posto migliore per conoscere il sito? –

4

non è poi così affidabile, in realtà, a meno che il sottostante sendmail o qualcosa sia configurato correttamente.

Amazon SES ha server migliori di qualsiasi server che si sta utilizzando e riceve posta lì più volte rispetto a mail().

La vera ragione per cui non si dovrebbe usare mail() è perché l'indirizzo IP del proprio server è probabilmente completamente sconosciuto ai servizi di posta come GMail, Yahoo, ecc. Perché viene contrassegnato come spam? Perché mail() è molto facile e semplice da sfruttare a scopi di spam.

+2

Questo non è proprio rispondere alla domanda, che è come funziona. Io uso SES per altre cose. Semplicemente volevo sapere come funziona su un'installazione pulita senza configurazione, non perché viene contrassegnata come spam o cosa invece dovrei usare. Grazie per la risposta, però. –

+0

sendmail. /conversazione. – David

4

mail() usa sendmail, che utilizza DNS per trovare MX record di dominio di destinazione e fornisce direttamente. questo è tutto.

e dal server di destinazione, probabilmente non conosce l'indirizzo IP, soprattutto se è NATed può essere contrassegnato come spam.

è possibile modificare la configurazione per utilizzare diversi server smtp (noto ad legit) ad agire da intermediario.

7

È possibile rilevare come funziona come di seguito.

Primo metodo

$ ltrace php -r "mail('[email protected]', 'Test', 'Hello world');" 2>&1 | grep sendmail 
memcpy(0x095ea168, "sendmail_from", 14)   = 0x095ea168 
memcpy(0x095ea1e0, "sendmail_path", 14)   = 0x095ea1e0 
popen("/usr/sbin/sendmail -t -i ", "w")   = 0x0977c7c0 

Dai risultati del comando precedente può essere visto che la funzione popen() apre il processo di /usr/sbin/sendmail -t -i.

$ ls -l /usr/sbin/sendmail 
... /usr/sbin/sendmail -> exim4 

Così sendmail è il link simbolico a exim4 e quindi sendmail -t -i invoca exim4 -t -i.

E nella pagina di manuale di exim4 si può leggere su queste opzioni -t -i:

$ man exim4 | grep ' -t -i' 
-ti  This option is exactly equivalent to -t -i. It is provided for compatibility with Sendmail. 

Secondo metodo

Installare snoopy ed eseguire:

# grep snoopy /var/log/auth.log | tail 
... php -r mail('[email protected]', 'Test', 'Hello world'); 
... /usr/sbin/sendmail -t -i 
... /usr/sbin/exim4 -Mc 1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -t -oem -oi -f <> -E1YxxYn-0006a7-Nw 
... /usr/sbin/exim4 -Mc 1YxxYn-0006aB-Oj 

I risultati del comando precedente mostra la sequenza dei comandi che sono stati eseguiti.

Problemi correlati