[PHP] Jak wysłać e-mail korzystając z gniazd (socket) zamiast funkcji mail()?

0x01 graphic

Chcesz wysłać list korzystając z gniazd w serwerze SMTP z pominięciem funkcji mail() dostępej w PHP.

0x01 graphic

Czasem nie można skorzystać z funkcji mail() do wysyłania poczty elektronicznej, więc jedynym rozwiązaniem jest połączenie się z serwerem SMTP i wysłanie poczty bezpośrednio przez ten serwer. Można to zrealizować wykorzystując gniazda, jak w przykładzie:

<?

function wyslij($serwer_smtp,$nadawca,$odbiorca,$tytul,$tresc_listu) {

$f = fsockopen($serwer_smtp, 25);

if ($f<=0) return 0;

fgets($f,1024);

fputs($f,"HELO $serwer_smtp\r\n");

fgets($f,1024);

fputs($f,"MAIL FROM: $nadawca\r\n");

fgets($f,1024);

fputs($f,"RCPT TO: $odbiorca\r\n");

fgets($f,1024);

fputs($f,"DATA\r\n");

fgets($f,1024);

fputs($f,"Subject: $tytul\r\n");

fputs($f,"To: $odbiorca\r\n");

fputs($f,"\r\n");

fputs($f,"$tresc_listu\r\n");

fputs($f,".\r\n");

fgets($f,1024);

fputs($f,"QUIT\r\n");

fclose($f);

}

$serwer_smtp="smtp.twojserwer.pl";

$nadawca="nadawca@serwer.pl";

$odbiorca="odbiorca@serwer.pl";

$tytul="Tytuł listu";

$tresc_listu=

"Dowolnie długa

treść naszego

listu...";

wyslij($serwer_smtp,$nadawca,$odbiorca,$tytul,$tresc_listu);

?>

Najważniejszą sprawą jest zdefiniowanie serwera SMTP, ponieważ nie może to być serwer przypadkowy. W zależności od tego u jakiego ISP masz konto lub trzymasz strony, taki serwer pocztowy musisz podać.

Oprócz serwera określ jeszcze adresy nadawcy i odbiorcy, tytuł listu i jego treść. Gdy wszystkie parametry są zadeklarowane poprawnie, wywołujemy funkcję wyslij().

Pobiera ona nasze dane i rozpoczyna połączenie z serwerem SMTP. Na początku otwiera połączenie z serwerem na porcie 25 (usługa SMTP pracuje na tym porcie), a następnie następuje faza wymiany informacji pomiędzy skryptem PHP i serwerem.

Za pomocą funkcji fputs() wysyłamy polecenia do serwera, a za pomocą fgets() pobieramy odpowiedzi. Możesz przed każdym fgets() wpisać polecenie echo aby zobaczyć co odpowiada serwer SMTP i ewentualnie zdiagnozować problem, jeżeli nie możesz wysłać listu:

echo fgets($f,1024);

Jeżeli wszystko przebiega zgodnie z planem witamy się z serwerem (HELO), podajemy adres nadawcy (MAIL FROM), odbiorcy (RCPT TO), następnie umieszczamy dodatkowe dane (DATA) gdzie wpisałem pole nagłówka Subject i To.

Gdy wystąpi pusta linijka, czyli podwójne \r\n można wpisać treść listu. List kończy się wpisaniem kropki w pustej linii, która od razu powoduje wysłanie listu. Teraz pozostało zakończyć pracę z serwerem (QUIT) i zamknąć połączenie.

Nie jest to może zbyt czytelne, ale właśnie tak przebiega komunikacja z serwerami SMTP. Modyfikując nagłówki można w ten sposób przesyłać także listy HTML i załączniki.