GMail SMTP authentication bez PEAR (safe_mode On)
październik 27th, 2009. Brak komentarzy.
Kategorie: PHP, Zabawy z kodem.
Witam po krótkiej (huh…) przerwie. Niektórym może przydać się ten post, dlatego pojedziemy telegraficznym skrótem, bez szczególnego zagłębiania się detale.
Stanąłem ostatnio przed koniecznością wysyłania z poziomu PHP e-maili z uwierzytelnianiem SMTP, przez GMail. Pierwsza myśl – PEAR.
Bez problemu, utworzenie testowego skryptu, wysłanie maila – działa. Wrzucenie tego samego kodu do działającej aplikacji – nie działa. Dlaczego? Jak się okazało, nasza aplikacja musi pracować przy włączonym safe_mode, zaś PEAR przy wyłączonym :)
Metodą prób i błędów, a raczej komunikatów o błędach, dotarłem do sedna sprawy. Oczywiście przedstawiony tu sposób jest tylko jednym z wielu.
Po pierwsze, należy się zaopatrzyć w odpowiednie narzędzia, czyt. klasy PHP. Pisać od nowa nie ma najmniejszego sensu. W moim przypadku były to:
- smtp.php – klasa SMTP autorstwa Manuela Lemosa [mirror]
- sasl.php – klasa obsługująca SASL (Simple Authentication and Security Layer), ten sam autor [mirror]
- login_sasl_client.php – klasa pomocnicza do SASL, ten sam autor [mirror]
Mając to wszystko, wystarczy tylko kierować się zaleceniami ze skryptu testowego klasy smtp.php. W przypadku GMaila, kod będzie wyglądał mniej-więcej tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | require("smtp.php"); require("sasl.php"); $smtp=new smtp_class; $smtp->host_name = "gmail-smtp.l.google.com"; $smtp->host_port = 587; $smtp->start_tls = 1; $smtp->user = "!nazwa_uzytkownika!"; $smtp->password = "!haslo!"; // tu reszta ustawień, do znalezienia w skrypcie testowym // http://www.phpclasses.org/browse/file/31.html $from = "adres@mailowy.nadawcy"; $to = "adres@mailowy.odbiorcy"; $from_name = "Nazwa Nadawcy"; $to_name = "Nazwa Odbiorcy"; if($smtp->SendMessage( $from, array($to), // jak widac, mozna dodaj wiecej odbiorcow array( "From: $from_name <$from>", "To: $to_name <$to>", "Subject: $temat_maila", "Date: ".strftime("%a, %d %b %Y %H:%M:%S %Z") ), $body)) echo "Wiadomosc wyslana do $to.\n"; else echo "Nie mozna bylo wyslac wiadomosci do $to.\nOdpowiedz serwera: ".$smtp->error."\n"; |
DISCLAIMER, czy jakmutam: Podałem tylko te opcje konfiguracyjne, które wyróżniają GMaila. Resztę należy ustawić standardowo, według instrukcji z skryptu testowego. Nie chcę być posądzony o plagiat – nie chodziło mi o przedstawianie samego mechanizmu uwierzytelniania SMTP, czy wysyłania maili przez SMTP. Nie jestem autorem tych klas, zaś moja ingerencja w powyższy kod była znikoma.