• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czemu funckja mail() nie wysyła wiadomości

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,198 wizyt
pytanie zadane 30 sierpnia 2016 w PHP przez Mistrz0000000 Bywalec (2,780 p.)
edycja 30 sierpnia 2016 przez Mistrz0000000

WItam, mam probqem z wysyłaniem maili.

Formularz wygląda tak: Jeszcze tylko dodam że action jest puste bo w końcu wszystko jest includowane w index.php, a więc teoretycznie odbywa się w tym samym pliku.

		<form action="" method="post">
			<input type="text" name="Email" PLACEHOLDER="Email">
			<input type="text" name="Temat" PLACEHOLDER="Temat">
			<input type="text" name="Name" PLACEHOLDER="Nazwa użytkownika">
			<textarea rows=20 cols=100 name="email_text" placeholder="Treść twojej wiadomości dla nas."></textarea>
			<button type="submit" name="send_email">Wyślij</button>
			</form>

a kod w php tak:

if (isset($_POST['send_email']))
{
    if ($_POST['Email'] && $_POST['Temat'] && $_POST['Name'] && $_POST['email_text']) {
        $msg .= "Tekst:  " . $_POST['email_text'] . "\n\n<br><br>";
        $msg .= "Nazwa użytkownika: " . $_POST['Name'] . "\n\n<br>";
        $msg .= "E-Mail:  " . $_POST['Email'] . "\n\n";


        $to = "mistrz0000000@wp.pl";
        $subject = $_POST['Temat'];


        $mailheaders .= "From: " . $_POST['Email'] . "\n";
        $mailheaders .= "MIME-Version: 1.0\n";
        $mailheaders .= "Content-Type: text/html;\n";
        $mailheaders .= "\tcharset=\"UTF-8\"\n";
        $mailheaders .= "Content-Transfer-Encoding: 8bit\n\n";

        mail($to, $subject, $msg, $mailheaders);
    }else{
        $_SESSION['error'] = "Proszę wypełnić wszystkie pola!";
    }
}

 

2 odpowiedzi

+2 głosów
odpowiedź 30 sierpnia 2016 przez Ehlert Ekspert (214,270 p.)

Źle robisz... wszystko.

  1. Nie walidujesz formularza. (filter_var)
  2. Mieszasz wszystko ze wszystkim (HTML + PHP)
  3. Interpreter PHP jedzie jak Bash (OOP)
  4. Zamiast mail to PHPMailer / SwiftMailer
  5. W mailu wysłanym w taki sposób może być nawet bomba. devil
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
edycja 30 sierpnia 2016 przez Mistrz0000000
Ehh nie chciałem kożystać z phpmailera, no ale skoro tak to trz będzie grzebać ;-; ale jak tu użyć phpmailera bez composera. Narazie kurczowo trzymam się pure PHP, więc Composer jak najbardziej odpada
komentarz 30 sierpnia 2016 przez Ehlert Ekspert (214,270 p.)

więc zostaw pure PHP. A co do PHPmailer i Composera... Trzea trzea

komentarz 30 sierpnia 2016 przez Abel Mądrala (5,140 p.)

na moje oko ta linia jest nie taka jak być powinna 

$mailheaders .= "From: " . $_POST['Email'] . "\n";

powinno tam być 

$mailheaders .= "From: " adres e-mail administracyjny "\n";

to bym całkiem skasował

$mailheaders .= "Content-Transfer-Encoding: 8bit\n\n";

A tak ja robiłem 

$list = "treść twojego eMaila";
												  
							   $headers="From: <admin@strona.pl>".PHP_EOL;
							   $headers.= 'MIME-Version: 1.0' .PHP_EOL;
							   $headers.="Content-type: text/html; charset=utf-8".PHP_EOL;
							   $headers.="X-Mailer: PHP/". phpversion();
							   
							   if(mail($email, "Temat e-Maila", $list,$headers)){
                   	
                   	
								echo '<p>Jak wszystko ok ten komunikat</p>';
							   }
							   else {
								echo"Błąd!! - skontaktuj się z administratorami serwisu.";
							   }

 

komentarz 30 sierpnia 2016 przez maly Nałogowiec (37,190 p.)

If you're not using composer's autoloader, PHPMailer provides an SPL-compatible autoloader, and that is the preferred way of loading the library - just require '/path/to/PHPMailerAutoload.php'; and everything should work. The autoloader does not throw errors if it can't find classes so it prepends itself to the SPL list, allowing your own (or your framework's) autoloader to catch errors. SPL autoloading was introduced in PHP 5.1.0, so if you are using a version older than that you will need to require/include each class manually.

komentarz 30 sierpnia 2016 przez Arkadiusz Waluk Ekspert (289,230 p.)

Jak już tak cytujemy to i ja coś zacytuję:

While installing the entire package manually or with composer is simple, convenient and reliable, you may want to include only vital files in your project. At the very least you will need class.phpmailer.php. If you're using SMTP, you'll needclass.smtp.php, and if you're using POP-before SMTP, you'll need class.pop3.php. For all of these, we recommend you usethe autoloader too as otherwise you will either have to require all classes manually or use some other autoloader.

https://github.com/PHPMailer/PHPMailer#minimal-installation

Jeśli więc ktoś się uprze to może dołączyć ręcznie plik class.phpmailer.php i np. class.smtp.php i też powinno działać. Żeby nie było to oczywiście też polecam composera, sam korzystam przeważnie ze SwiftMailera, ale jak ktoś bardzo nie chce to się da.

A jak ktoś się naprawdę upiera na skorzystanie z funkcji mail() to tutaj na samym dole jest przykład z odpowiednimi nagłówkami (trzeba tylko poprawić kodowanie z ISO na UTF-8 i reply-to w zasadzie nie jest potrzebne), z tego co się orientuje powinien działać. Ale mail() absolutnie nie polecam.

komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
A wytłumaczysz dlaczego nie mail ?
1
komentarz 30 sierpnia 2016 przez Arkadiusz Waluk Ekspert (289,230 p.)
Nawet przez te nagłówki - trzeba ręcznie ustalać i wpisywać wszystko, a jak się coś źle wpisze to maile nie dochodzą albo mogą wpaść do spamu.

Inna sprawa to taka, że można łatwo dzięki takiej bibliotece wysyłać przez SMTP. Przykładowo ja na swoim VPSie nie mam zainstalowanego ani skonfigurowanego serwera poczty i pojawia się problem (coś tam w php.ini pewnie się da skonfigurować, ale nawet nie wiem, nigdy nie szukałem). W przypadku korzystania z jednej z podanych bibliotek podaję dane konta SMTP i gotowe. Z całą pewnością na większości hostingów nie będzie z tym żadnego problemu bo takie rzeczy powinny być skonfigurowane, ale nie zmienia to faktu że mail() nie wspiera SMTP więc wysyłanie z innego serwera poczty odpada.

Poza tym taka biblioteka jest obiektowa, można to łatwo powiązać z projektem i jakoś sensownie wbudować. Osobno wprowadza się wszystko poprzez kolejne funkcje, a mail() to po prostu jedno wywołanie do którego trzeba podać kolejne argumenty.

Pewnie można znaleźć jeszcze więcej argumentów za, ale to takie które mi osobiście się rzucają.
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
no ok to mam pytanie co do PHPMailera. Bo do SMTP trzeba podać hasło z którego jest wysyłana wiadomość, a aj chcę zrobić tak że user podaje swój email i wiadomość jest wysyłana na mojego maila i pisze że nadawcą jest email, który podał user. Jak to zrobić, bo w koncu user nie poda swojich danych do poczty
komentarz 30 sierpnia 2016 przez Arkadiusz Waluk Ekspert (289,230 p.)

Zwróć uwagę chociażby na przykład podany na Githubie:

...
$mail->Username = 'user@example.com';                 // SMTP username
$mail->Password = 'secret';                           // SMTP password
...
$mail->setFrom('from@example.com', 'Mailer');

Dwie pierwsze dane które podajesz mają posłużyć do zalogowania się na serwer SMTP. I to musi być faktycznie istniejąca skrzynka z poprawnymi danymi. A ustawienie od kogo jest zupełnie inną rzeczą, możesz tam ustawić całkowicie inny adres e-mail.

komentarz 30 sierpnia 2016 przez Boshi VIP (100,240 p.)

Arek, a jak rozwiążesz w tym wypadku obsługę formularza wiedząc, że smtp nie możesz użyć, bo przecież klient nie będzie przesyłał ci danych do swojej poczty?

w sumie nigdy się nad tym nie zastanawiałem, ale teraz tak myślę.. wszędzie na necie są przykłady phpmailer-a i swifta ale na podstawie smtp.

Chyba, że setFrom przekazuje emaila skąd, a logowanie jest tylko po to by mail doszedł.

komentarz 30 sierpnia 2016 przez Arkadiusz Waluk Ekspert (289,230 p.)
Jeśli nie skorzystamy z SMTP to prawdopodobnie PHPMailer skorzysta z funkcji mail(), tak przynajmniej wnioskuje patrząc na to: https://github.com/PHPMailer/PHPMailer/blob/master/examples/mail.phps

Też nigdy się nad tym nie zastanawiałem bo lecę zawsze przez SMTP.
komentarz 30 sierpnia 2016 przez Boshi VIP (100,240 p.)
No dobra, ale co w przypadku prostego formularza?  wtedy to mail idzie przez funkcję mail? przecież to bez sens.
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Skoro ma skorzystać z funckji mail() to po co wtedy wgl phpmailer
komentarz 31 sierpnia 2016 przez Arkadiusz Waluk Ekspert (289,230 p.)
Jest na pewno o tyle prościej, że nie trzeba ręcznie wpisywać tych nagłówków tylko korzysta się z funkcji na obiekcie maila.

A co w takim przypadku nie wiem, szczerze mówiąc jak mówiłem zawsze wysyłam przez SMTP i nigdy się nad tym nie zastanawiałem.
komentarz 31 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
No wiesz ja wysłam z emaila hostingu i tylko do mnie więc no. I odkryłem że na hostingerze działa jak usunę nagłówki, a na cba.pl to działa już cały mój skrypt
–2 głosów
odpowiedź 30 sierpnia 2016 przez niezalogowany
edycja 30 sierpnia 2016

Jak chciałbyś zrobić to w pure PHP to proponuję coś takiego:

<?php

	//SMTP server settings	
	$host = "some_domain.com";
    $port = "XXX";
    $username = "";
    $password = "";
	
	
	$messageBody = "";
	
	if($_POST['name']!='false'){
		$messageBody .= '<p>Visitor: ' . $_POST["name"] . '</p>' . "\n";
		$messageBody .= '<br>' . "\n";
	}
	if($_POST['email']!='false'){
		$messageBody .= '<p>Email Address: ' . $_POST['email'] . '</p>' . "\n";
		$messageBody .= '<br>' . "\n";
	}else{
		$headers = '';
	}
	if($_POST['phone']!='false'){		
		$messageBody .= '<p>Phone Number: ' . $_POST['phone'] . '</p>' . "\n";
		$messageBody .= '<br>' . "\n";
	}	
	if($_POST['message']!='false'){
		$messageBody .= '<p>Message: ' . $_POST['message'] . '</p>' . "\n";
	}
	
	if($_POST["stripHTML"] == 'true'){
		$messageBody = strip_tags($messageBody);
	}
	
	if($host=="" or $username=="" or $password==""){
		$owner_email = $_POST["owner_email"];
		$headers = 'From:' . $_POST["email"] . "\r\n" . 'Content-Type: text/plain; charset=UTF-8' . "\r\n";
		$subject = 'A message from your site visitor ' . $_POST["name"];
		
		try{
			if(!mail($owner_email, $subject, $messageBody, $headers)){
				throw new Exception('mail failed');
				}else{
				echo 'mail sent';
			}
			}catch(Exception $e){
			echo $e->getMessage() ."\n";
		}
	}
?>

Do tego musiał byś ładować od razu owner email przez js (radzę w tym samym pliku co sprawdzanie poprawności labeli z html i przesyłanie danych z formularza po udanej walidacji do php ;)

JQuery:

$(window).load(function(){
      $('#form').YourForm({
          ownerEmail:'yourEmail@mail.com'
      })
    })

Jak chciałbyś sprawdzać poprawność labeli w HTML przez jQuery to polecam wtyczkę REGULA SNAPSHOT od Vivin Paliath ;) Bardzo przyspiesza pracę

Stefan

komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Ale ja nie jestem na local hoscie, tylko na hostingerze, a tam pisze że obsługują funkcję mail()
komentarz 30 sierpnia 2016 przez niezalogowany
Wstaw pełen kod, może coś znajdę ;)
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
tzn cały kod czego ? index.php gdzie są sprawdzane wszystkie przyciski, czy może cały kod pomoc.php gdzie jest ten formularz
komentarz 30 sierpnia 2016 przez niezalogowany
Cały kod -> html z którego pobierasz dane, JS+JQ przekazujące je do PHP i wreszcie PHP ;)
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
u mnie nie ma czegoś takiego jak przekazywanie danych z htmla do php poprzez js+jq

Podobne pytania

0 głosów
1 odpowiedź 184 wizyt
pytanie zadane 25 marca 2020 w PHP przez Pico Obywatel (1,330 p.)
0 głosów
1 odpowiedź 495 wizyt
pytanie zadane 26 kwietnia 2018 w PHP przez smokolisz Mądrala (6,340 p.)
0 głosów
1 odpowiedź 190 wizyt
pytanie zadane 20 lipca 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

93,109 zapytań

142,088 odpowiedzi

321,611 komentarzy

62,450 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...