PHP funkcja mail() na IIS WS2012


(mareczek_1988) #1

Witam. Mam problem z funkcją mail(). Mianowicie mam na stronie formularz kontaktowy (kod):

   <form name="sentMessage" id="contactForm" action="contact.php" method="post">
                            <div class="row control-group">
                                <div class="form-group col-xs-12 floating-label-form-group controls">
                                    <label for="name">Imię Nazwisko</label>
                                    <input type="text" class="form-control" placeholder="Imię Nazwisko*" id="name" name="name" required>
                                    <p class="help-block text-danger"></p>
                                </div>
                            </div>
                            <div class="row control-group">
                                <div class="form-group col-xs-12 floating-label-form-group controls">
                                    <label for="email">Email</label>
                                    <input type="email" class="form-control" placeholder="Email*" id="email" name="email" required>
                                    <p class="help-block text-danger"></p>
                                </div>
                            </div>
                            <div class="row control-group">
                                <div class="form-group col-xs-12 floating-label-form-group controls">
                                    <label for="inputPhone">Telefon</label>
                                    <input type="tel" class="form-control" placeholder="Telefon*" id="inputPhone" name="inputPhone" required>
                                    <p class="help-block text-danger"></p>
                                </div>
                            </div>
                            <div class="row control-group">
                                <div class="form-group col-xs-12 floating-label-form-group controls">
                                    <label for="content">Wiadomość</label>
                                    <textarea rows="2" class="form-control" placeholder="Wiadomość" id="content" name="content"></textarea>
                                    <p class="help-block text-danger"></p>
                                </div>
                            </div>
                            <br>
							<div class="g-recaptcha" data-sitekey="klucz capcha"></div>
							<br>
                            <div id="success"></div>
                            <div class="row">
                                <div class="form-group col-xs-12 text-center">
                                    <button type="submit" class="btn btn-success btn-lg">Wyślij</button>
                                </div>
                            </div>
                        </form>

i plik php: contact.php:

header(‘Content-Type: text/html; charset=utf-8’);
$email;$comment;$captcha;
if(isset($_POST[‘email’])){
$email=$_POST[‘email’];
}if(isset($_POST[‘comment’])){
$email=$_POST[‘comment’];
}if(isset($_POST[‘g-recaptcha-response’])){
$captcha=$_POST[‘g-recaptcha-response’];
}
if(!$captcha){
echo (“”);
}
$adresat = ‘mojmail@mojadomena.com’;
@$email = $_POST[‘email’];
@$name = $_POST[‘name’];
@$phone = $_POST[‘inputPhone’];
@$content = $_POST[‘content’];
$header = “From: “.$email.” \nContent-Type:”.
’ text/plain;charset=“UTF-8”’.
"\nContent-Transfer-Encoding: 8bit";
$a= "Od " . $name . “\xA” . "Telefon: " . $phone . “\xA” . "Wiadomość: ".$content;

    $secretKey = "klucz capcha";
    $ip = $_SERVER['REMOTE_ADDR'];
    $response=file_get_contents("ares do capcha".$secretKey."&response=".$captcha."&remoteip=".$ip);
    $responseKeys = json_decode($response,true);
    if(intval($responseKeys["success"]) !== 1) {
      echo '<h2>Spam detected!</h2>';
    } else {
      if (mail($adresat, 'Kontakt ze strony.', $a, $header))
				  {
						echo ("<SCRIPT LANGUAGE='JavaScript'>
					window.alert('Wiadomość została wysłana.')
					window.location.href='adresstron.pl';
					</SCRIPT>");
				  }
					else 
					{
						echo ("<SCRIPT LANGUAGE='JavaScript'>
					window.alert('Błąd serwera. Prosimy spróbować później.')
					window.location.href='adresstron.pl';
					</SCRIPT>");
					}
    }

I kod za każdym razem zwraca błąd (z ostatniego if’a)… Mail się nie wysyła. Poczta jest na exchangu na ws2012 r2.

Ktoś ma pomysł jak to poprawić? Zainstalowany php w wersji 5.3.

Potrzebne jeszcze jakieś informacje?


(hindus) #2

Nie chcesz przejść na jakąś bibliotekę do maili pod php zamiast trzymać się mail()'a?


(mareczek_1988) #3

Jestem otwarty na wszelkie propozycje.

To na czym mi zależy to capcha i żeby szły maile :).

Jest to chyba mój pierwszy formularz kontaktowy na stronie, tak więc jak coś poproszę łopatologicznie. Z php też nie mam za dużo doświadczenia.


(hindus) #4

Może PHPMailer ? Captcha nie ma nic do gadania, chodzi tylko o zastąpienie tej linii:


(ziggurad) #5

To ja od razu proponuję skorzystać z:

Capcha to osobny temat tak na prawdę, nie związany z samą wysyłką maila tylko z walidacją formularza, ta od googla chyba jest najlepsza ale dawno się nią nie bawiłem :wink:


(kowgli) #6

Podejrzewam, że problemem jest, że ta funkcja mail próbuje kontaktować się z serwerem SMTP anonimowo, po domyślnym porcie.
Znajdź jakąś bardziej wyrafinowaną bibliotekę do wysyłania maili w PHP. Polecony wyżej PHPMailer wydaje się oferować bardziej zaawansowane opcje. Musisz użyć identycznych ustawień jak gdybyś konfigurował skrzynkę z jakiegoś programu pocztowego. Może być szyfrowanie, autoryzacja, niestandardowe porty itp. Wszystko zależy od ustawień konkretnej skrzynki / serwera. Najlepiej skonfiguruj sobie tą skrzynkę w Outlooku / Thunderbirdzie itp., a później odtwórz wszystkie opcje w kodzie.


(Fizyda) #7

Ponieważ nikt nie odpowiedział na temat samego problemu to już tłumacze z czym jest problem.
Masz błąd ponieważ system na którym stoi serwer WWW i PHP to Windows. Linux w przeciwieństwie do Windowsa ma preinstalowany program do wysyłki maili (sendmail) z którego domyślnie korzysta PHP w wersji na linuksa. W przypadku jeśli chcesz używać funkcji mail w PHP pod Windowsem, musisz doinstalować program do wysyłki maili na Windowsie, a następnie skonfigurować PHP’a tak by z niego korzystał.

Drugą opcją jest skorzystanie z bardziej rozbudowanych bibliotek tak jak proponowali inni wyżej. Osobiście nie korzystałbym z phpmailer bo obecnie chyba nie jest już za bardzo rozwijany, dostaje jedynie łatki na dziury których w ostatnich 2 latach troszkę było. Osobiście wybrałbym swiftmailer który jest cały czas rozwijany i jest zgodny z php7. Swiftmailer jest używany w Symfony więc to już o czymś świadczy, dodatkowo zapewnia że ta biblioteka będzie dalej rozwijana.


(ziggurad) #8

Zwracam honor, +1 za swiftmailer’a :wink:


(mareczek_1988) #9

Próbuję uruchomić wysyłkę na PHPMailer, ale wywala błąd “ta strona nie działa”

tak jak by nie odpalał się skrypt php tylko przeglądarka próbowała wczytać stronę “send.php”

co robię nie tak? na serwerze php 5.3


(hindus) #10

Podejrzewam, że odpowiedź jest w logach serwera.


(mareczek_1988) #11

Już mi odpala PHP.

Tylko wywala błąd serwera… Może ktoś podać jak powinna wyglądać konfiguracja dla maila z interii?
Najlepiej konkretny kod tylko ustawień serwera…

Bo żadnego dodatkowego oprogramowania dla PHPMailer nie potrzebuje?

EDIT:

Jak poprawnie zainstalować PHPMailer?
Bo chyba mi nie działa ta klasa. Moge z linkami prosić?

jak wywale linijkę:

$mail->IsSMTP();

to wyświetla mi się błąd:

 Could not instantiate mail function

A jak ta linijka jest w kodzie, to otwiera się strona php zamiast wykonywać się skrypt.

Ktos coś? Zaczynam mieć dosyć…;/


(hindus) #12

Rozwiń myśl, że otwiera się strona php, bo totalnie nie rozumiem o co chodzi.


(Fizyda) #13

Przecież tutaj masz wszystko opisane: https://github.com/PHPMailer/PHPMailer. Począwszy od instalacji, poprzez opis poszczególnych metod, aż po przykładowe zastosowania …


(mareczek_1988) #14

Mam na mysli, ze jak jest ta linijka to sie wyswietla blad ze nie mozna zaladowac strony, po kliknieciu “ok” wyswietla sie w przegladarce adres “mojadomema.pl/contact.php

A jak jej nie ma to blad z mojego poprzedniego postu, z ktorego wnooskuje ze skrypt chce wyslac za wiadomosc za pomoca funkcji mail().


(Fizyda) #15

Mi to się nie chce w takich sytuacjach odpisywać a co dopiero pomagać, ale niech stracę ten jeden raz.

Czego Ty w ogóle oczekujesz? Zadałeś tyle pytań, że nawet nie da się stwierdzić na jakim etapie konkretnie możesz mieć błąd, bo pytasz od instalacji po używanie biblioteki, więc ani nie wiadomo czy ją dobrze zainstalowałeś, ani czy ją dobrze dodałeś do swojego projektu, ani czy dobrze jej używasz.
Piszesz o jakiś plikach, tylko że nie wiem czy ktokolwiek poza Tobą wie do czego one Ci służą i co w nich się znajduje. Piszesz też o jakiś linijkach w kodzie którego nawet nie dałeś i oczekujesz, że ktoś powie Ci co robisz źle.
Piszesz że

tylko pytanie co to w ogóle znaczy i co według Ciebie oznacza, że otwiera się strona? To jak skrypt się wykonuje to strona już się nie otwiera? Jeśli tak to dla mnie nowość.

Tak? A a na jakiej podstawie wnioskujesz? Bo w opisie błędu masz słowo mail?

Ostatnia rzecz? Czy w ogóle przeczytałeś co pobierasz i używasz? Bo wydaje mi się że w ciemno kopiujesz kod z przykładów i liczysz, że może zadziała. Mam też wrażenie, że nie przeczytałeś nawet opisu tej biblioteki bo jest tam wyraźnie napisane:

Compatible with PHP 5.5 and later

A Ty masz 5.3, być może zadziała bo niewiele te wersje się różnią między sobą, ale niekoniecznie musi wszystko działać. Jednak bez kodu nie da się wykluczyć, że czegoś Ty nie pomieszałeś lub, że źle nie dodałeś biblioteki.
Dodatkowo w ogóle zlałeś mój pierwszy post w którym wspominałem, że PHP pod Windowsem by w pełni działał wymaga konfiguracji, zwłaszcza jeśli chodzi o wysyłkę maili. Niestety, ale Windows to tak “wspaniały” system że nie nadaje się do developmentu - chyba że piszemy aplikacje na .net. Do tego jeszcze niewiele narzędzi czy rzeczy w ogóle działa na nim OOTB.


(mareczek_1988) #17

Masz rację, bez kodu ciężko…

<?php
header('Content-Type: text/html; charset=utf-8');
        $email;$comment;$captcha;
        if(isset($_POST['email'])){
          $email=$_POST['email'];
        }if(isset($_POST['comment'])){
          $email=$_POST['comment'];
        }if(isset($_POST['g-recaptcha-response'])){
          $captcha=$_POST['g-recaptcha-response'];
        }
        if(!$captcha){
          echo ("<SCRIPT LANGUAGE='JavaScript'>
						window.alert('Proszę zaznaczyć Captcha TEST.')
						window.location.href='http://www.linkdostrony.pl';
						</SCRIPT>");
        }
//wysyłamy więc maila
require_once('phpmailer/class.phpmailer.php');
$mail             = new PHPMailer();
//<h1>//$mail->IsSMTP(); </h1>                          // telling the class to use SMTP
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Host       = "poczta.interia.pl"; // set the SMTP server
$mail->Port       = 465;                    // set the SMTP port
$mail->Username   = "mój_mail@poczta.fm"; // SMTP account username
$mail->Password   = "hasło";        // SMTP account password
//budujemy treśc maila
$bodyHtml = 'Email:'.$_POST['email'].'<br />';
$bodyHtml.= 'Od kogo:'.$_POST['name'].'<br />';
$bodyHtml.= 'Telefon:'.$_POST['inputPhone'].'<br />';
$bodyHtml.= 'Trść:'.$_POST['content'].'<br />';
$mail->Subject    = 'Wiadomość ze strony';
$mail->AltBody    = strip_tags($bodyHtml); // treść tekstowa
$mail->MsgHTML($bodyHtml);
        $secretKey = "klucz";
        $ip = $_SERVER['REMOTE_ADDR'];
        $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".$secretKey."&response=".$captcha."&remoteip=".$ip);
        $responseKeys = json_decode($response,true);
        if(intval($responseKeys["success"]) !== 1) {
          echo 'Spam detected!';
        } else {
			//do kogo wysyłamy
$mail->AddAddress("mój_mail@poczta.fm");
if($mail->Send()) {
            echo ("<SCRIPT LANGUAGE='JavaScript'>
						window.alert('Wiadomość została wysłana.')
						window.location.href='http://www.linkdostrony.pl';
						</SCRIPT>");
} else {
  echo ("błąd" . $mail->ErrorInfo); //zmieniłem błąd, żebym wiedział co mu nie pasuje....
}
		}
?>

Kod na stronie w zasadzie nie uległ zmianie.
Jeżeli chodzi o instalację php mailer:
Wypakowałem zawartość paczki do folderu “phpmailer” i wrzuciłem naserwer do folderu ze stroną. Zawartość poniżej:
zawartosc phpmailer

A Ty masz 5.3, być może zadziała bo niewiele te wersje się różnią między sobą, ale niekoniecznie musi wszystko działać. Jednak bez kodu nie da się wykluczyć, że czegoś Ty nie pomieszałeś lub, że źle nie dodałeś biblioteki.

Nie pamiętam gdzie ale znalazłem że phpmailer jest kompatybilny z wersją 5.x, czyli 5.3 też… Ale to na jakimś forum, więc mógł ktoś źle napisać.

Tak? A a na jakiej podstawie wnioskujesz? Bo w opisie błędu masz słowo mail?

Też, ale przede wszystkim dlatego, że po wklejeniu treści błędu w google trafiłem na stronę, gdzie gość wytłumaczył, że php domyślnie chce wysyłać wiadomości za pomocą funkcji mail() i kazał dopisać właśnie tą “problematyczną” (u mnie) linijkę, żeby kazać mu korzystać z klasy phpmailer.

Tzn, że strona się zachowuje tak jak wtedy kiedy nie miałem zainstalowanego na serwerze php. nie wyrzuca żadnych komunikatów, tylko pustą stronę “…/contact.php”.

Z tego wywnioskowałem, że jeżeli chce korzystać z funkcji mail() muszę mieć zainstalowany program do wysyłania maili. A drugą opcją jest korzystanie z biblioteki…

Myślę, że teraz udzieliłem wyczerpujących informacji… Liczę na pomoc, bo jak mówiłem nie mam doświadczenia z php, ani ze stawianiem strony na IIS w WS2012. Jeżeli brakuje jakichś informacji z mojej strony to pytajcie…

Jeśli potrzebny jest program do wysyłania maili, to co polecacie? Dodam, że na tym serwerze jest też serwer poczty Exchange… Może można wykorzystać? I jak powinna wyglądać konfiguracja w php.ini? bo tutaj też nie mam pojęcia…

Mam jakieś błędy w kodzie? Coś zrobiłem nie tak?

Proszę o pomoc :slight_smile:

P.S.
W kodzie zaznaczyłem tą problematyczną linijkę. Aktualnie mam ją w komentarzu w pliku.
Korzystam w zasadzie z dwóch pilków:

  1. index.html w którym znajduje się kod strony wraz z formularzem (kod formularza w pierwszym poście)
  2. contact.php - zawiera skrypt php który ma sprawdzić capche i wysłać maila.

(Fizyda) #18

Mała uwaga, to że widzisz białą stronę nie oznacza że jest pusta. Aby stwierdzić, że strona jest faktycznie pusta musisz zajrzeć w jej kod. To co wyświetla przeglądarka to tylko zinterpretowany html i css, a gdy go nie ma to różnie może się zachować.

Oczywiście, że tak jest. Tylko jeśli miałbyś poprawnie skonfigurowanego php i działaby Ci funkcja mail to nie musiałbyś używać dodatkowej biblioteki, a tą używasz po to by wysyłać maile poprzez inny zewnętrzy serwer smtp. Więc siłą rzeczy jeśli używasz biblioteki tak by nie wysyłała maile przez zewnętrzny serwer smtp to używa standardowej funkcji mail i tym sposobem zataczasz koło.

A skąd pobierałeś phpmailera? Bo raczej nie ze strony projektu (https://github.com/PHPMailer/PHPMailer/tree/master) więc zgaduję, że masz jakąś starą wersję. Tym oto sposobem masz dziurę dzięki w której o ile dobrze pamiętam można wstrzyknąć i wykonać zdalny kod na Twoim serwerze. Dodatkowo jak pobierałeś z jakiegoś dziwnego źródła nie wiadomo czy pliki są “czyste”.
W sumie to już po samych nazwach plików widzę, że nie jest to najnowsza wersja biblioteki.
Nie jestem też pewny co do poprawności konfiguracji serwera SMTP bo zwyczajnie nie używam interi.

Dodatkowo możesz mieć tak skonfigurowany serwer, że nie wyświetlają Ci się błędy na stronie. Dlatego możesz nie otrzymywać informacji o ewentualnych błędach. Jeśli kody błędów i ich opisy nie są całkowicie wyłączone to powinieneś mieć plik z logami błędów jakie zwraca PHP.


(mareczek_1988) #19

Jutro wrzuce nowa wersje phpmailer na serwer, bo w domu mam internet do niczego i zobacze czy cos ruszy…

Pomożesz mi to ogarnac jutro? Z php jestem noga, a potrzebuje ten formularz kontaktowy…

Jezeli chodzi o poczte, to obojetnie mi na czym odpale. Chce zobaczyc ze dziala a jak bedzie dzialac to kwestia pozniej tylko konfiguracji pod odpowoedni serwer pocztowy… chyba sie nie myle:stuck_out_tongue:

Mam jeszcze pocztowe konto na outlooku, onecie, gmailu. Obojetnie mi raczej na czym uda sie to odpalic…

Czyli tak, klasa php mailer sprawia ze nie musze konfigurowac php.ini? Tylko puszczam maila przez zewnetrzny serwer? Ale potrzebuje jakis program zeby tego maila wyslac? A jezeli bym chcial skorzystac z funkcji mail() to musze php.ini skonfigurowac i dodatkowo doinstalowac program do wysylki pod windowsa?

Dobrze rozumuje? Popraw mnie jesli sie myle.
Dzieki za chec pomocy:)


(Fizyda) #20

Sprawia że masz wybór jak wysyłasz maile. Takie klasy ułatwiają wysyłkę bardziej skomplikowanych maili bo nie trzeba ustawiać samemu nagłówków tylko używasz odpowiednich metod i mail sam się “buduje”. Funkcja mail jest po prostu w swojej prostocie bardziej skomplikowana w obsłudze niż tego typu biblioteki.

Tak. Nie nie potrzebujesz żadnego programu, a serwer SMTP (do wysyłki maili). “Program” o którym wspominane było wcześniej to właśnie taka lokalna usługa do wysyłki maili.

Nie program tylko jak wyżej usługę (chociaż jedno leży blisko drugiego). Możesz też w php.ini skonfigurować PHP w taki sposób, że funkcja mail będzie używała zewnętrznego serwera SMTP - np interii, ale w tedy wszystkie maile z całego serwera będą tak wysyłane.

Nie ma znaczenia gdzie masz pocztę, ważne byś miał poprawnie skonfigurowane konto oraz skrypt do wysyłki. Korzystanie z gotowych kont pocztowych ma jednak ten minus, że jako autor maila musi być taki do jakiego masz dostęp, czyli jak masz maila j.kowalski@jakaspoczta.x to nie możesz wysłać maila jako, np. no-reply@mojadomena.x. Do tego musisz użyć swojego serwera pocztowego - który musi być też poprawnie skonfigurowany.

Jak mam chwilę to wchodzę tutaj, więc możliwe że tak. Jednak obiecać nic nie mogę. Pamiętaj też, że wiele osób na forach (w tym ja) nie odwala za kogoś roboty lecz podpowiada czy naprowadza na rozwiązanie. Ty masz jeszcze ten problem, że używasz IIS i Exchange lub darmowych kont pocztowych, a tutaj problemem największym będzie konfiguracja jednego z wymienionych. Niestety w żadnym przypadku Ci za bardzo nie pomogę, jedynie powiem czego masz szukać bo nie używam IIS ani Exchange a tym bardziej kont pocztowych do wysyłki maili na swoich stronach. Używam Nginx lub Apache w połączeniu z własnym serwerem SMTP (postfix) a to wszystko na Linuxie. Owszem zasada konfiguracji będzie taka sama, ale jak dokładnie to się robi to nie powiem bez pogrzebania w plikach i dokumentacji, a na to możesz sam poświęcić czas.


(hindus) #21

Ja jeszcze zadam (dość przewrotne zapewne) pytanie.
Czemu IIS? Czy to świadomy wybór “bo już hostujesz aplikację w ASP.NET” czy może “już było zainstalowane” albo “podobno jak serwer na Windowsie to tylko IIS”? Bo może wystarczy zainstalować XAMPPa i wszystko będzie śmigać out-of-the-box?