Radni inurl sendmail php. Slanje e-pošte koristeći php

Nedavno sam postavio kućni poslužitelj i tamo sam trebao testirati slanje pošte. Ali evo problema: prilikom traženja stranice koja šalje poštu pojavila se pogreška 500.

Problem

Počeo sam vidjeti što se događa. Nema ničeg zanimljivog u php-fpm zapisima; u nginx zapisima možete vidjeti da se php-fpm uzvodno ruši zbog vremenskog ograničenja.

2013/04/18 15:28:01 6928#0: *1409 isteklo vrijeme uzvodnog toka (110: isteklo vrijeme veze) tijekom čitanja zaglavlja odgovora iz uzvodnog toka, klijent: xx.xx.xx.xx, poslužitelj: , zahtjev: "POST /page.php HTTP/1.1", uzvodno: "fastcgi://127.0.0.1:9010", host: "site.ru", referer: "http://site.ru"

A onda mi je pala na pamet ideja da pogledam syslog. Tamo sam vidio zanimljive retke:

9. rujna 18:53:20 mega sm-msp-queue: Moje nekvalificirano ime hosta (mega) nepoznato; spavanje za ponovni pokušaj 9. rujna 18:54:20 mega sm-msp-queue: ne mogu kvalificirati svoj naziv domene (mega) -- korištenje kratkog imena

Da, počeo sam griješiti u smjeru sendmaila. Pokušavam ga ponovno pokrenuti naredbom:

Ponovno pokretanje usluge Sudo sendmail

i vidim potvrdu svog nagađanja.

Andrey@mega:/home/andrey# sudoservice sendmail restart sudo: nije moguće riješiti host xyz.xyz * Ponovno pokretanje Mail Transport Agenta (MTA) sendmail andrey@mega:/home/andrey#

Riješenje

Ispostavilo se da je problem naziv poslužitelja. Nakon što sam ovako postavio naziv poslužitelja (s točkom), sve je radilo kako treba.

127.0.0.1 localhost localhost.localdomain mega mega.foobar

Hvala vam!

Ako vam je ovaj članak pomogao ili želite podržati moje istraživanje i blog, izvolite Najbolji način učini to:

Predstavljamo funkciju php mail() i najjednostavniji primjer koristeći ga za slanje e-pošte. Što je bolje ili Sendmail vs mail.

Funkcija PHP mail() omogućuje vam slanje e-pošte na određenu adresu e-pošte.

Sintaksa:

Bool pošta(niz $to,niz $predmet,niz $poruka[, niz $dodatna_zaglavlja[, niz $dodatni_parametri]]);

Mogućnosti:

  • do— adresa e-pošte primatelja pisma u skladu s RFC 2822 formatom. Na primjer:
  • subjekt— predmet poslanog pisma u skladu s RFC 2047 formatom
  • poruka— sadržaj poslanog pisma. Svaki red ne smije imati više od 70 znakova i završavati s nova linija(\n).

    Samo Windows: Kada PHP izravno pristupa SMTP poslužitelju, točka na početku retka se uklanja. Za borbu protiv ove nijanse, trebali biste koristiti dvostruku točku na početku retka.

    $message = str_replace("\n.", "\n..", $message);

  • dodatna_zaglavlja(neobavezno) – redak koji će biti dodan nakon zaglavlja pisma. Obično se koristi za dodavanje dodatnih zaglavlja (Šalje, Kopija i Bcc). Redovi moraju biti odvojeni s CRLF (\r\n).
  • dodatni_parametri(neobavezno) – dodatni parametri koje koristi program namijenjen za slanje pisama.

Povratak: PRAVI ako je pismo uspješno poslano ili NETOČNO ako ne. Treba napomenuti da ako je pismo uspješno u redu čekanja za slanje, to ne znači da će stići do primatelja.

Sada kada smo razumjeli teoriju, možemo početi vježbati. Ali prvo vam želim dati nekoliko korisnih funkcija koje će uvelike olakšati naš zadatak.

Primjer: php funkcija MIME base64 kodiranje, uzimajući u obzir kodiranje

Funkcija mime_base64($string, $charset="windows-1251") ( povratak "=?" . $charset . "?B?" . base64_encode(trim($string)) . "?="; )

Jedan od problema koji se javlja prilikom slanja pošte je formiranje zaglavlja pisma. Konkretno, zaglavlje, imena pošiljatelja i primatelja napisana ćirilicom klijent e-pošte primatelja može prepoznati u iskrivljenom obliku. Da biste izbjegli ovaj problem, možete upotrijebiti MIME base64 kodiranje, koje pretvara niz bajtova u niz ASCII znakova koji se mogu ispisati.

Funkcija is_email($string) ( return preg_match("/^()+([\.a-zA-Z0-9_-])*@()+(\.+)*\.((2,6)) $/", $string); )

Ovi su također razvrstani. A sada, zbog čega je ova bilješka napisana.

Primjer: slanje e-pošte pomoću php funkcije mail()

$charset = "windows-1251"; $from = mime_base64("Ime pošiljatelja", $charset) . " "; $to = mime_base64("Ime primatelja", $charset) . " "; $subject = mime_base64("Predmet poruke koja se šalje", $charset); $message = "Sadržaj poruke koja se šalje."; $message = wordwrap($message, 70); $headers = "Od: " . $from . " \r\n" . "Reply-To: " . $from . "\r\n" . "X-Mailer: PHP/" . phpversion(). "\r\n" . " MIME-verzija: 1.0" . "\r\n" . "Vrsta sadržaja: text/plain; skup znakova="" . $charset. """; if (mail($to, $subject, $message, $headers)) ( echo "

Pismo je poslano.

";) else ( echo "

Došlo je do pogreške.

"; }

Mislim da su komentari nepotrebni, jer sam već dosta pažnje posvetio raznim detaljima. Opcije za skup RFC zaglavlja mogu se razlikovati, ali na lokalnom poslužitelju dobio sam sljedeće:

X-Sendmail-Cmdline: sendmail.pl -t -i Za: =?windows-1251?B?yOz/IO/u6/P36PLl6/w=?= Predmet: =?windows-1251?B?0uXs4CDu8u/w4OLr/+Xs7uPuIO/o8fzs4A==?= Od: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= Odgovor za: =?windows-1251?B?yOz/IO7y7/Dg4ujy5ev8?= X-Mailer: PHP/5.3.3 MIME-Verzija: 1.0 Vrsta sadržaja: text/plain; charset="windows-1251"

Sendmail protiv php mail()

Za kraj mali edukativni program. Sendmail je jedan od poslužitelja pošte (MTA), dok php funkcija mail() jednostavno implementira proces slanja e-pošte preko SMTP veze. Jasno je da je korištenje PHP funkcije zgodno, ali daleko od optimalnog rješenja. Obično se mail() koristi u slučajevima kada nisu uključene velike pošte.

Postavljanje sendmail mail servera (rješavanje problema sa slanjem maila iz skripti)

U nekim slučajevima se događa da Sendmail poslužitelj pošte ne šalje poštu, vraćajući pogrešku:

Feb 28 22:04:24 myhost sendmail: mATM4O8w58065806: Losing ./qfmATM4O8w58065806: savemail panic Feb 28 22:04:24 myhost sendmail: mATM4O8w58065806: SYSERR(www): savemail: ne može nigdje spremiti odbijenu e-poštu

U zapisnicima može biti i ovakva greška:

Stat=Pogreška formata podataka

Problem obično uzrokuje nepostojeći naziv hosta poslužitelja ili nepostojeća adresa e-pošte prilikom slanja.

U takvim slučajevima morate navesti postojeću poštansku adresu. U ISPmanageru se može registrirati u svojstvima WWW domene u polju "Administrator's E-Mail".

Prilikom navođenja adrese u konfiguraciji Apache web poslužitelja u opisu virtualnog hosta:

Php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f [e-mail zaštićen]"

Ako se PHP koristi u CGI ili FastCGI modu, unos se piše u datoteci ~/php-bin/php.ini

Sendmail_path = "/usr/sbin/sendmail -t -i -f [e-mail zaštićen]"

Onemogućavanje provjere točnosti adrese pošiljatelja prilikom slanja pošte

Sendmail se prema zadanim postavkama pokreće s programom za slanje poruka (MSP). Ovo je zaseban postupak za rukovanje redom pošte.

Razmotrimo ga onemogućiti na FreeBSD sustavu

Napišite redak u datoteci /etc/make.conf koji onemogućuje automatsko stvaranje datoteke submit.cf

SENDMAIL_SET_USER_ID=da

Nakon čega je potrebno obrisati submit.cf datoteku, promijeniti prava na sendmail izvršnu datoteku (staviti joj SUID bit umjesto SGID-a, odnosno postaviti prava na 4755 umjesto 2755) i restartovati Sendmail

Svaki put kad postavim lokalni web poslužitelj, naiđem na pitanje o stubu za Sendmail.

Postoji odlično rješenje za Windows: lažni sendmail za windows(sendmail.exe) http://glob.com.au/sendmail/
O ovom rješenju postoji članak na Habréu: PHP pošta za Windows http://habrahabr.ru/post/26518/
Još jedno rješenje za Windows: Testirajte alat poslužitelja pošte http://www.toolheap.com/test-mail-server-tool/
Tu je i članak za korisnike Linuxa: Sendmail stub za Linux http://habrahabr.ru/post/49665/

Osobno mi se više svidjelo rješenje u čistom PHP-u, o čemu će se dalje raspravljati.

Prednosti:

  • Nema usluga trećih strana
  • Višeplatformsko rješenje za OS na kojem je PHP instaliran
  • Minimalna veličina datoteke
  • Sva stub logika se može uređivati ​​u PHP-u
  • Spremanje poruke u datoteku

Od minusa:

  • Nema prosljeđivanja u pravi poštanski sandučić

Popis stub argumenata i mogućnosti:

  • --dir<Путь к папке> - Mapa s datotekama
  • --datoteka<имя файла> - Spremite svaku poruku u određenu zajedničku datoteku
  • --prethoditi- Dodajte novu poruku na početak dijeljene datoteke
  • --otvoren- Automatski otvori datoteku s porukom u Notepadu

Parametri za PHP.INI datoteku:

;SMTP = lokalni host ;smtp_port = 25 ;sendmail_from = [e-mail zaštićen] sendmail_path = "php.exe C:sendmail.php --dir C:mail --open"

Ako je put do php.exe naveden u PATH, tada ga ne morate navesti u PHP.INI, inače je preporučljivo promijeniti php.exe u<Путь к папке с PHP>php.exe

Sendmail_path = "C:serverbinphpphp.exe C:sendmail.php --dir C:mail --open"

Na Linuxu možete odmah odrediti stazu do datoteke, ne zaboravljajući da je prvo omogućite pokretanje: chmod 755 sendmail.php

Sendmail_path = "/home/someuser/sendmail.php --dir /tmp/mail"

Sama skripta sendmail.php:

#!/usr/local/bin/php

Bit će mi drago ako vam ovo bude korisno.



Učitavam...Učitavam...