• 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

VPS Starter Arubacloud
0 głosów
1,151 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,200 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 Arkadiusz Waluk Ekspert (289,150 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,150 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 chcem żeby ta wiadomość była wysyłana do mnie a nie do usera. I żeby w nadawcy emaila był email usera
komentarz 30 sierpnia 2016 przez niezalogowany

1. chcesz wiadomość do siebie - wpisz swój mail pod "owner email"

2. w tytule wiadomości JEST nazwa nadawcy ;)

3. chcę a nie chcem...

komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
edycja 30 sierpnia 2016 przez Mistrz0000000
No, ale masz tu pliki index.php i pomoc.php http://speedy.sh/rzyr5/pliki.rar

daję tak bo mi na forum pokazuje że za dużo znaków ma
komentarz 30 sierpnia 2016 przez niezalogowany

1. Hasło do poczty jest Ci niepotrzebne (password odnosi się do serwera mailowego który zazwyczaj nie wymaga hasła), ale poczytaj sobie o hostingu maili ;)

2. PHP które ci podałem (mailHandler.php) wraz z jQuery i HTML'em rozwiązuje wszystkie Twoje problemy, nie potrzebujesz niczego więcej

3. poczty a nie pcozty. Pisz trochę wolniej, ale tak, by wszyscy zrozumieli -> pisanie na forum to nie wyścigi ;)

komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)

Przecież tam jest coś takiego jak require_once 'Mail.php'; no to raczej bezt tego nie zadziała

komentarz 30 sierpnia 2016 przez niezalogowany
Dobra już wiem o co chodzi :)

Zauważ, że if od którego else wymaga mail.php jest zawsze prawdziwy (ten else jest dodany jak by ktoś po mnie chciał coś ze skryptem robić lecz nie wiedział jak (tam na sztywno jest inny host)). Dziękuję za wypointowanie i wybacz za nieuściślenie, zapomniałem.
komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)

Mam taki kod:

if (isset($_POST['send_email'])) {
//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['message'] != 'false') {
        $messageBody .= '<p>Message: ' . $_POST['email_text'] . '</p>' . "\n";
    }
    

    if ($host == "" or $username == "" or $password == "") {
        $owner_email = "polygonlombard@gmail.com";
        $headers = 'From:' . $_POST["email"] . "\r\n" . 'Content-Type: text/plain; charset=UTF-8' . "\r\n";
        $subject = $_POST['Temat'];

        try {
            if (!mail($owner_email, $subject, $messageBody, $headers)) {
                throw new Exception('mail failed');
            } else {
                echo 'mail sent';
            }
        } catch (Exception $e) {
            echo $e->getMessage() . "\n";
        }
    }
}

i nie działa

komentarz 30 sierpnia 2016 przez niezalogowany
isset($_POST['send_email']

1. Podłączyłeś wcześniej sesję by mieć z czego zczytywać? ;)

2. Nie wiem czy ustawiłeś hosta i port na działający //Pan mirosław mówił w jednym z poradników php jak to zrobić na localhost (username = root, host = localhost)

3. Jeżeli to nie zadziałało w twoim przypadku to zacznij debugowanie (komentuj kod i wstawiaj echa zamiast tego) i zobacz na jakim if'ie Ci stopuje. Kod nigdy nie działa za pierwszym razem.

komentarz 30 sierpnia 2016 przez Mistrz0000000 Bywalec (2,780 p.)
Przecież wyświetla mi się mail sent
komentarz 30 sierpnia 2016 przez niezalogowany
napisałeś "nie działa" -> nie jestem wróżką, więc założyłem że nie działa kod, a nie host...

Kod który dostałeś działa na moim host i password, lecz z oczywistych przyczyn nie mogę Ci ich podać. Nie wiem jak localhost ogarnia wysyłanie maili, ale na normalnym host'ującym serwisie wszystko działa więc teraz pozostało Ci już tylko zarejestrować domenę i wysyłać maile :)
komentarz 30 sierpnia 2016 przez niezalogowany

Identyczne pytanie jest z odpowiedzią na stack'u:

http://stackoverflow.com/questions/15267423/php-send-mail-in-localhost

Mam nadzieję, że pomogłem :)

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ź 169 wizyt
pytanie zadane 25 marca 2020 w PHP przez Pico Obywatel (1,330 p.)
0 głosów
1 odpowiedź 493 wizyt
pytanie zadane 26 kwietnia 2018 w PHP przez smokolisz Mądrala (6,340 p.)
0 głosów
1 odpowiedź 183 wizyt
pytanie zadane 20 lipca 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)

93,018 zapytań

141,988 odpowiedzi

321,281 komentarzy

62,364 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 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...