[PHP] Funkcja mail()

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.

$email_template = "email_activation_template.html";
$wiadomosc = file_get_contents($email_template);
$wiadomosc = str_replace("[login]", $login, $wiadomosc);
$wiadomosc = str_replace("[key]", $klucz, $wiadomosc);
$wiadomosc = str_replace("[url]", "http://" . $SERVER['HTTP_HOST'] .$SERVER['PHP_SELF'], $wiadomosc );
$headers = 'From: aktywacja@ **********' ."\r\n".
		 	'Reply-To: aktywacja@ **********' . "\r\n".
		 	'Content-type: text/html; charset=utf-8' ."\r\n".
mail($login, "Aktywacja konta", $login, $wiadomosc, $headers);

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ł.

Sprawdź cztery rzeczy:

  1. czy dodanie “MIME-Version: 1.0” do nagłówków pomoże,

  2. czy skonstruowanie poprawnego HTMLa (przynajmniej z <html> i <body>) pomoże,

  3. jakie są nagłówki otrzymanej wiadomości (np. czy wciąż ma content-type text/html),

  4. 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).

  1. Po dodaniu “MIME-Version: 1.0” nie chce w ogóle wysłać maila. POPRAWKA: Mail przychodzi ale nadal ze wszystkimi znacznikami.

  2. Poprawne skonstruowanie HTML też nie pomaga, wyświetla cały dokument razem z <html> <head> <body>

  3. 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ć.

    Aktywacja

    Dziękujemy za skorzystanie z naszych usług. Zespół ************

    Email jest generowany automatycznie i prosimy na niego nie odpowiadać.

    Login

  4. Co do konfiguracji to nic nie konfigurowałem. Hosting na jakim jest to postawione to cba.pl

Ad 3. Chodzi nie o mail, a o nagłówki. To co wrzuciłeś, to treść maila. :slight_smile: 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ć. :slight_smile: 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”. ;]

Dawno nie pisałem w PHP, więc mój post może się okazać bezużyteczny, ale spróbuję :mrgreen:

A jak wyglądają nagłówki? (czy nie ma nagłówków?)

Jakiej wersji PHP używasz i z jakiej dokumentacji korzystasz?

Według tych stron: http://php.net/manual/en/function.mail.php, http://www.w3schools.com/php/func_mail_mail.asp, http://pl.wikibooks.org/wiki/PHP/Wysy%C5%82anie_e-maili, http://wiki.dreamhost.com/PHP_mail(),

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ą

 

Tzn ja na maila dostałem wiadomość odnośnie poczty:

 

Dane do poczty dostępnej z Twojego klienta pocztowego lub menedżera poczty ( http://www.cba.pl/roundcubemail/ ):

Serwer SMTP: mail.cba.pl

Port SMTP: 587

Serwer POP3: mail.cba.pl

Port POP3: 110

Login: taki_jaki_wybierzesz_przy_dodawaniu@***.cba.pl

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. :slight_smile:

@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:

x1pbdEJ.png

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.

A tak wygląda przykładowa wiadomość w HTMLu (odrobinę pokrojona).

 

Delivered-To: xxx@gmail.com
Received: by 10.27.0.0 with SMTP id xxx;
        Fri, 19 Dec 2014 15:12:53 -0800 (PST)
X-Received: by 10.70.131.78 with SMTP id xxx.xxx;
        Fri, 19 Dec 2014 15:12:52 -0800 (PST)
Return-Path: <xxx=gmail.com@email.bandcamp.com>
Received: from o3.email.bandcamp.com (o3.email.bandcamp.com. [198.21.0.0])
        by mx.google.com with ESMTPS id xxx.xxx
        for <xxx@gmail.com>
        (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Fri, 19 Dec 2014 15:12:52 -0800 (PST)
Received-SPF: pass (google.com: domain of xxx=gmail.com@email.bandcamp.com designates 198.21.0.0 as permitted sender) client-ip=198.21.0.215;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of xxx=gmail.com@email.bandcamp.com designates 198.21.0.0 as permitted sender) smtp.mail=xxx=gmail.com@email.bandcamp.com;
       dkim=pass header.i=@email.bandcamp.com
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=email.bandcamp.com; 
	h=from:to:subject:reply-to:mime-version:content-type; s=smtpapi; 

	GXHhOKd9Nxu5U8=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sendgrid.info; 
	h=from:to:subject:reply-to:mime-version:content-type:x-feedback-id; 

	Qa2e78PDiL8s7Cjop4L4COl40=
Received: by filter-353.sjc1.sendgrid.net with SMTP id filter-xxx.xxx.xxx
        2014-12-19 23:12:50.233406972 +0000 UTC
Received: from bandcamp.com (50.23.209.91-static.reverse.softlayer.com [50.23.0.0])
	by ismtpd-085 (SG) with ESMTP id xxx.xxx.xxx
	for <xxx@gmail.com>; Fri, 19 Dec 2014 23:12:50 +0000 (UTC)
From: Bandcamp <noreply@bandcamp.com>
To: xxx <xxx@gmail.com>
Subject: New release from Sellorekt/LA Dreams
Reply-To: <noreply@bandcamp.com>
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="this_internet_stuff_is_wild"
Message-ID: <xxx.xxx.xxx@ismtpd-085>
Date: Fri, 19 Dec 2014 23:12:50 +0000 (UTC)
X-SG-EID: xxx2iZ2xADfI4cfcss=
X-Feedback-ID: xxx

This is a multi-part message in MIME format.
--this_internet_stuff_is_wild
Content-Type: text/plain; charset=utf-8
content-transfer-encoding: quoted-printable

Greetings xxx,=0D

--this_internet_stuff_is_wild
Content-Type: multipart/related;
 boundary="greetings_from_sunny_sea_ranch"

--greetings_from_sunny_sea_ranch
Content-Type: text/html; charset=utf-8
content-transfer-encoding: quoted-printable

<div id=3D"msg" style=3D"color:#595959;font-family: 'Helvetica Neue',arial,=
verdana,sans-serif;line-height:150%;padding:0;font-size:14px">=0D
=0D
<div style=3D"width:210px;min-height:210px;margin-bottom: 20px;">=0D
</div>=0D
=0D
Greetings xxx,=0D
<br>=0D
<br><br>=0D
Enjoy!=0D
<br><br>=0D
<a href=3D"http://bandcamp.com"><img src=3D"http://bandcamp.com/img/email/b=
c-logo-small-2.gif" width=3D"105" height=3D"19" border=3D"0" alt=3D"bandcam=
p logo"></a><br/>=0D
<br>=0D
<span style=3D"font-size:11px;border-top:1px dotted #ccc;width:95%;display:=
block;padding:1em 0;margin:1em 0 0;"><a href=3D"aaa">Unfollow</a></span>=0D
<br>&nbsp;=0D
</div>=0D


--greetings_from_sunny_sea_ranch--

--this_internet_stuff_is_wild--

Jakie widzisz różnice?

 

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.

Nie chodziło mi o kolejność nagłówków, tylko o znaczenie kolejnych argumentów _mail_a, co może mieć znaczenie :squarewink:

Próbowałeś

mail($login, "Aktywacja konta", $wiadomosc, $headers);

czy inaczej?

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.

Rzeczywiście parametry mail() są z bańki. :slight_smile:

Ok, działa :slight_smile: Faktycznie problem był w średniku oraz w skopanych parametrach w funkcji mail. Dodatkowo zauważyłem że kolejność nagłówków ma znaczenie :stuck_out_tongue: Teraz muszę jeszcze podpiąć link do aktywacji konta pod przycisk :slight_smile: Dziękuję Wam bardzo za pomoc :slight_smile:

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.

 

Możliwe :)