[PHP] Jak wysłać ze strony WWW e-mail z dowolnym załącznikiem?
Chcesz wysłać ze strony WWW list za pomocą funkcji mail() ale powinien on zawierać nie tylko standardową treść lecz także dowolny załącznik lub wiele załączników, (grafikę, dokument Worda). Dzięki takiemu rozwiązaniu możesz stworzyć np. automat, który wyśle komuś list z wybranym przez formularz załącznikiem albo autoresponder wysyłający ofertą firmy.
Aby wysyłać listy z załącznikami należy zamieścić w nim stosowne nagłówki MIME, a same załączniki odpowiednio zakodować, np. za pomocą standardu base64. Oto gotowy kod programu wysyłającego listy z załącznikiem:
<?
srand((double)microtime()*1000000);
$znacznik = md5(uniqid(rand()));
// dane o odbiorcy, nadawcy i załączniku
$odbiorca="odbiorca@adres.pl";
$tytul="Masz list...";
$nadawca_imie = "Janko Nadawca";
$nadawca_email = "janko@nadawca.pl";
$plik = "logo.gif";
$typpliku = "image/gif";
$nazwapliku="mojelogo.gif";
// treść listu
$tresclistu = "
Witaj,
wysyłam Ci list z załącznikiem!
";
// definicja nagłówków
$naglowki = "From: $nadawca_imie <$nadawca_email>\n";
$naglowki .= "MIME-Version: 1.0\n";
$naglowki .= "Content-Type: multipart/mixed;\n";
$naglowki .= "\tboundary=\"___$znacznik==\"";
// nagłówki listu
$tresc="--___$znacznik==\n";
$tresc .="Content-Type: text/plain; charset=\"iso-8859-2\"\n";
$tresc .="Content-Transfer-Encoding: 8bit\n";
$tresc .="\n$tresclistu\n";
// nagłówki i obsługa załącznika
$tresc .="--___$znacznik==\n";
$tresc .="Content-Type: $typpliku\n";
$tresc .="Content-Disposition: attachment;\n";
$tresc .=" filename=\"$nazwapliku\"\n";
$tresc .="Content-Transfer-Encoding: base64\n\n";
$f = fopen($plik,"r");
$dane = fread($f,filesize($plik));
fclose($f);
$tresc .= chunk_split(base64_encode($dane));
$tresc .="--___$znacznik==--\n";
// wysłanie listu
mail($odbiorca,$tytul,$tresc,$naglowki);
?>
Na początek warto wygenerować znacznik, który pozwala oddzielić poszczególne części listu - tekst od załącznika. Może to być dowolny ciąg znaków, ja przyjąłem losową wartość. Musi się pojawić w liście ponieważ w ten sposób program pocztowy dowie się, gdzie zaczynają się i kończą poszczególne części listu (a może on zawierać wiele załączników).
Teraz trzeba wypełnić informacje o odbiorcy listu (konieczny jest adres e-mail), nadawcy (wpisz swoje dane) i załączniku. Załącznik składa się z trzech pól - $plik określa położenie pliku na dysku, $typpliku to typ MIME różny dla różnych aplikacji (dla GIFa będzie to właśnie image/gif, dla innych patrz na dole porady - jest link do artykułu o typach MIME) i $nazwapliku pod którą zobaczy plik odbiorca w załączniku.
Nagłówków dokładnie omawiać nie będę bo możnaby o nich napisać grubą książkę - stosowne RFC na ten temat również znajdziesz na dole porady. Ważne jest jednak aby określić typ listu multipart/mixed - czyli w wielkim skrócie ma to być tekst i załączniki, a następnie podać dla dwóch części listu ich typ i sposób kodowania.
Część tekstowa będzie typu text/plain a więc zawierać będzie czysty tekst w standardzie iso-8859-2 zakodowany za pomocą 8 bitów, czyli pełnego ASCII.
Część z załącznikiem będzie typu takiego jaki podajesz na początku programu, w tym przykładzie to image/gif. Określamy też, że jest to załącznik kodowany za pomocą standardu base64. Podczas tworzenia załącznika pobierany jest plik i kodowany właśnie do tego standardu.
Na samym końcu, gdy mamy już zbudowaną całą treść listu następuje wysyłka. Odbiorca otrzyma list z załączonym plikiem, tak jak chcieliśmy.
A oto wersja skryptu do wysyłania dowolnej ilości załączników. Wystarczy je umieścić w tablicy $pliki, gdzie znakiem | są oddzielone nazwy plików na dysku, ich typy MIME i nazwy plików wodoczne w mailu.
<?
srand((double)microtime()*1000000);
$znacznik = md5(uniqid(rand()));
// dane o odbiorcy, nadawcy i załączniku
$odbiorca="odbiorca@adres.pl";
$tytul="Masz list...";
$nadawca_imie = "Janko Nadawca";
$nadawca_email = "janko@nadawca.pl";
$pliki[]="1.gif|image/gif|obraz1.gif";
$pliki[]="2.gif|image/gif|obraz2.gif";
$pliki[]="3.gif|image/gif|obraz3.gif";
// treść listu
$tresclistu = "
Witaj,
wysyłam Ci list z załącznikami!
";
// definicja nagłówków
$naglowki = "From: $nadawca_imie <$nadawca_email>\n";
$naglowki .= "MIME-Version: 1.0\n";
$naglowki .= "Content-Type: multipart/mixed;\n";
$naglowki .= "\tboundary=\"___$znacznik==\"";
// nagłówki listu
$tresc="--___$znacznik==\n";
$tresc .="Content-Type: text/plain; charset=\"iso-8859-2\"\n";
$tresc .="Content-Transfer-Encoding: 8bit\n";
$tresc .="\n$tresclistu\n";
// nagłówki i obsługa załączników
foreach($pliki as $plik) {
$p = explode("|", $plik);
$tresc .="\n--___$znacznik==\n";
$tresc .="Content-Type: $p[1]\n";
$tresc .="Content-Disposition: attachment;\n";
$tresc .=" filename=\"$p[2]\"\n";
$tresc .="Content-Transfer-Encoding: base64\n\n";
$f = fopen($p[0],"r");
$dane = fread($f,filesize($p[0]));
fclose($f);
$tresc .= chunk_split(base64_encode($dane));
}
$tresc .="--___$znacznik==--\n";
// wysłanie listu
mail($odbiorca,$tytul,$tresc,$naglowki);
?>