Witam. Czy ktoś z was kiedyś używał funkcji mail() w PHP ? Mam taki problem: zaprojektowałem maila jaki ma zostać wysłany do użytkownika (w HTML) kiedy ten mail przychodzi na skrzynkę to widać cały kod HTML a nie widać samego właściwego tekstu oraz jednego przycisku. Co zrobić aby np. Gmail odbierał pocztę jako kod HTML ? Dla ułatwienia przesyłam fragmenty kodów.
To jest kod PHP który pobiera wartości z pliku HTML przedstawionego poniżej.
<h5>Witaj [login]!</h5>
<p>Założyłeś konto w serwisie **********. Jeżeli to nie Ty zakładałeś to konto, proszę o zignorowanie tej wiadomości.</p>
<p>Specjalnie dla Ciebie wygenerowany został klucz aktywacyjny dzięki któremu możesz w pełni aktywować swoje konto. Kliknij w poniższy link aby aktywować.</p>
<a href="[url]?acitave=[key]">
<button>Aktywacja</button>
</a>
<p>Dziękujemy za skorzystanie z naszych usług. Zespół ********** </p>
<pre>Email jest generowany automatycznie i prosimy na niego nie odpowiadać.</pre>
W miejsce ********** jest wstawiony adres którego nie będę tutaj przedstawiał.
czy dodanie “MIME-Version: 1.0” do nagłówków pomoże,
czy skonstruowanie poprawnego HTMLa (przynajmniej z <html> i <body>) pomoże,
jakie są nagłówki otrzymanej wiadomości (np. czy wciąż ma content-type text/html),
czy serwer, przez który to leci, jest poprawnie skonfigurowany (mail nie komunikuje się z serwerem SMTP, który wykonuje właściwą pracę - jeśli Ty go nie kontrolujesz, to możliwe, że konfiguracja uniemożliwia wysłanie HTMLa).
Po dodaniu “MIME-Version: 1.0” nie chce w ogóle wysłać maila. POPRAWKA: Mail przychodzi ale nadal ze wszystkimi znacznikami.
Poprawne skonstruowanie HTML też nie pomaga, wyświetla cały dokument razem z <html> <head> <body>
Mail jaki przychodzi do mnie po dodaniu HTML’a wygląda tak:
Witaj Login!
Założyłeś konto w serwisie ************. Jeżeli to nie Ty zakładałeś to konto, proszę o zignorowanie tej wiadomości.
Specjalnie dla Ciebie wygenerowany został klucz aktywacyjny dzięki któremu możesz w pełni aktywować swoje konto. Kliknij w poniższy link aby aktywować.
Ad 3. Chodzi nie o mail, a o nagłówki. To co wrzuciłeś, to treść maila. Większość programów (także interfejsów webowych) pozwala Ci na eksport do pliku, a większość formatów eksportu zapisze z nagłówkami do postaci, którą będziesz mógł otworzyć w edytorze tekstowym (nawet w notatniku powinno się dać). Wyeksportuj swoją wiadomość i jakąś inną, która jest w HTML i wygląda poprawnie (pewnie masz coś takiego w skrzynce odbiorczej) i porównaj nagłówki.
Ad 4. No właśnie, dlatego może nigdy nie działać. Zerknij na dokumentację cba.pl - może jest info o konfiguracji lokalnego serwera mail. Jak masz dużo szczęścia to może jest nawet jakiś wpis w FAQ “nie działa mi PHPowy mail() w HTML”. ;]
mail przyjmuje po kolei: adres, temat, wiadomość, dodatkowe_nagłówki, dodatkowe_parametry.
U Ciebie byłoby odpowiednio:
adres = $login
temat = “Aktywacja konta”
wiadomość = $login
dodatkowe_nagłówki = $wiadomosc
dodatkowe_parametry = $headers
Czyli twoje nagłówki trafiają jako dodatkowe parametry do programu rozsyłającego pocztę, który prawdopodobnie je zignoruje, bo nie zrozumie o co Ci chodzi.
Natomiast do nagłówków trafia treść wiadomości, którą chcesz wysłać; a jako treść idzie $login, co by się nawet zgadzało z wklejoną przez Ciebie odebraną wiadomością
Hasło: takie, jakie wybierzesz przy dodawaniu konta
Tylko jak to teraz zastosować to już nie mam pojęcia :P Tzn. Wiem, że to jest do tego jeżeli chcemy używać tej poczty na jakimś programie np outlook albo coś podobnego.
@Rolek0: kolejność nagłówków nie powinna mieć znaczenia. OP musi w pierwszej kolejności sprawdzić co do niego dochodzi.
@Strugaczka: nie chodzi o konfigurację klienta poczty, tylko jak jest skonfigurowany serwer poczty. Na to, prawdopodobnie, nie masz wpływu.
Powtórzę się: sprawdź jakie są nagłówki wiadomości, którą otrzymałeś. Jeśli testowo wysyłasz sobie na maila, to użyj tego:
Popatrz z jakimi nagłówkami wiadomość przyszła (np. czy wciąż jest content type odpowiedni). Podejrzyj też wiadomość w skrzynce, która przyszła skądś tam i jest w HTML i wyświetla się poprawnie. Porównaj nagłówki (i treść) obu wiadomości i kombinuj.
U mnie nie widać Content’ów to po pierwsze. Nie wiem dlaczego. Po drugie no to cała zawartość jest w div’ach itd. ale to nie powinno mieć wpływu. Coś jeszcze ?
Yup, nie ma nagłówka Content-Type ani “MIME-Version: 1.0” - musisz zatem znaleźć przyczynę braku (szczególnie content type). Jedna rzecz, której nigdy nie pamiętam, to czy klucze nagłówków są case sensitive. W kodzie, który podawałeś, miałeś “type” małą literą. Zacząłbym od tego. A później zrobił to, o czym mówiłem: poczytać w FAQ firmy hostingowej, może jest jakaś informacja o możliwości używania mail() do wysyłania HTMLi.
Jeszcze zauważyłem, że instrukcja, która wypełnia zmienną $headers, nie jest zakończona średnikiem, tylko kropką, czyli zamiast dwóch instrukcji (przypisania tekstu do $headers oraz wywołania mail()), masz jedną instrukcję (przypisania do $headers podanego tekstu połączonego z wartością zwracaną przez mail()).
Nie wiem jak PHP interpretuje ten kod, ale podejrzewam, że w chwili wywołania mail(), zmienna $headers nie istnieje albo jest pusta.
Zamień tę kropkę przed mail na średnik.
Zobacz czy działają u Ciebie przykładowe kody ze stron, do których linki podałem w moim poprzednim poście.
Ok, działa Faktycznie problem był w średniku oraz w skopanych parametrach w funkcji mail. Dodatkowo zauważyłem że kolejność nagłówków ma znaczenie Teraz muszę jeszcze podpiąć link do aktywacji konta pod przycisk Dziękuję Wam bardzo za pomoc
To interesująca rzecz. W RFC 2822 widnieje wyraźnie (a 5322 to podtrzymuje), że “It is important to note that the header fields are not guaranteed to be in a particular order. They may appear in any order, and they have been known to be reordered occasionally when transported over the Internet”, czyli wygląda to na zbędne IMO ograniczenie PHP.