Wysyłanie wiadomości e-mail z załącznikiem

kopertaPrawie dwa miesiące temu pokazałem, jak w prosty sposób skompresować pliki z poziomu skryptu PHP. Nadmieniłem wtedy, że tak stworzony plik ZIP można wysłać e-mailem jako załącznik. Jeśli kogoś interesuje to zagadnienie, to na pewno dobrze zna funkcję mail(), służącą do wysyłania wiadomości z serwera. Można używając jej wysłać wiadomość z załączonym plikiem, lecz jest to dość skomplikowane. Zadanie znacznie ułatwia klasa o nazwie Swift Mailer. Dzięki niej zajmie to tylko kilka linijek kodu i niewiele czasu.

Pobieramy klasę

Najpierw należy pobrać potrzebne pliki z internetu. Najnowsza wersja Swift Mailera dostępna jest na oficjalnej stronie projektu. Pobieramy więc archiwum, a następnie rozpakowujemy pliki i z zachowaniem struktury folderów wysyłamy je na serwer.

Dołączamy Swift Mailer do skryptu

Na początku musimy dodać zawartość nowej klasy do treści pliku. Wpisujemy więc:

require('swiftmailer/swift_required.php');

Jak widać, w moim przypadku wszystkie pliki odpowiedzialne za wysyłkę maili umieszczone są w katalogu o nazwie swiftmailer.

Tworzymy obiekty

Teraz potrzebujemy trzech obiektów, których działanie możemy przyrównać do tzw. uchwytów pliku. Nie jest nam do niczego potrzebna wiedza na temat ich pracy, więc szczegóły pominę. Wklejamy kod:

$transport = Swift_MailTransport::newInstance();
$mailer = Swift_Mailer::newInstance($transport);
$mail = Swift_Message::newInstance();

Pokrótce opisać można to tak: $mailer wysyła wiadomość $mail za pomocą $transport. Opieramy się na domyślnych metodach, nie potrzeba więc dodatkowej konfiguracji. Nie wpisujemy żadnych dodatkowych atrybutów.

Dodajemy podstawowe dane

Czas na określenie adresata, odbiorcy, tematu itp.

// temat wiadomości
$mail->setSubject('Przykładowy temat');
// tablica z adresami nadawców (może być kilku)
$mail->setFrom(array('nadawca@localhost'));
// jak wyżej, lecz dotyczy odbiorców
$mail->setTo(array('klient1@serwer.xx', 'klient2@serwer.yy'));
// nasz e-mail ma postać zwykłego tekstu
$mail->setBody('Przykładowa wiadomość','text/plain');

Wysyłka załącznika

Czas na sedno tego poradnika – załącznik. Wystarczy, że znamy ścieżkę pliku.

$mail->attach(Swift_Attachment::fromPath('files/test.zip'));

Gdybyśmy chcieli wysłać ten plik przy pomocy “nieuzbrojonej” funkcji mail(), musielibyśmy siłować się z nagłówkami i kodowaniem pliku metodą base64. Zajęłoby to sporo czasu, a i o błąd nie trudno w takim wypadku. Uwierzcie mi na słowo, męczyłem się kiedyś tym sposobem niesamowicie, a na końcu i tak do skrzynki odbiorczej dochodziły krzaki. Zrezygnowany sięgnąłem po sprawdzone i niezawodne rozwiązanie. Jak widać, w tym przykładzie mamy to uproszczone do minimum, całą robotę bierze na siebie gotowa klasa. Pozostaje nam na koniec:

$mailer->send($mail);

i e-mail zostaje wysłany.

Zachęcam do przetestowania powyższego skryptu w działaniu. Nie odkryję Ameryki, jeśli napiszę, że warto korzystać z gotowych metod i nie bać się ich. Oszczędzamy czas i nerwy, a do tego w internecie mamy mnóstwo wskazówek, które pomogą nam w rozwiązaniu większości problemów.

komentarze 3 do “Wysyłanie wiadomości e-mail z załącznikiem”

  • Damian pisze:

    Mi nie do końca działa. Jak odebrać całą ścieżkę do pliku od użytkownika?
    Próbowałem jako ścieżkę do załącznika wstawić $_FILES[‘fileinput’][‘name’] oraz $_FILES[‘fileinput’][‘tmp_name’]- w pierwszym przypadku nie może otworzyć pliku w drugim wysyła mi jakiś śmieć.
    Co powinienem wstawić by odbierać pliki od użytkownika?

  • Używałem źródłowego skrypciku w kilku projektach i zdecydowanie fajnie to działa.

  • Piotr pisze:

    Jest to bardzo wygodne 🙂 ze można sobie załączać pliki

Skomentuj

CommentLuv