[PHP] Jak wysłać e-mail korzystając z gniazd (socket) zamiast funkcji mail()?
Chcesz wysłać list korzystając z gniazd w serwerze SMTP z pominięciem funkcji mail() dostępej w PHP.
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.