Formularz generujący wiadomość Mail

0

Witam serdecznie,
Na stronie www.mirvanos.org dostępny jest bezpłatny skrypt PHP/xHTML o funkcji generowania wiadomości Mail na podstawie wpisanych wartości w Formularzu na stronie WWW.

Oczywiście w swojej prostocie skrypt działa i ma się dobrze. Po mojej stronie również serwer puszcza takowego maila i wszystko jest OK, ale mam pytanie:

Otóż chciałbym poszerzyć ilość zapytań jakie trzeba w Formularzu wypełnić i chciałbym, żeby takowe spłynęły również na skrzynkę mailową. Problem jest tego typu, że kombinuję już drugi dzień i nie jestem w stanie tego ogarnąć.

Wklejam oryginalny KOD Skryptu:

<?php

class mirvanosContact {
var $content = '';
var $template = '';
var $mail_email = '';
var $mail_name = '';
var $mail_content = '';

public function __construct() {
    if(!file_exists('mirvanos_contact_config.php')) {
        $m = 'Brak pliku konfiguracyjnego mirvanos_contact_config.php !';
        echo $this->errorMessage($m);
        echo $this->alertMessage($m);
        exit;
        }
    require_once('mirvanos_contact_config.php');
    if(!file_exists('mirvanos_contact_template.html')) {
        $m = 'Brak pliku szablonu mirvanos_contact_template.html !';
        echo $this->errorMessage($m);
        echo $this->alertMessage($m);
        exit;
        }
    $this->template = file_get_contents('mirvanos_contact_template.html');
    if(defined('USE_CAPTCHA') AND USE_CAPTCHA) {
        $captcha = file_get_contents('mirvanos_contact_captcha.html');
        $this->template = str_replace('<!--CAPTCHA-->', $captcha, $this->template);
        }
    // Uwaga !
    $this->template = "\n".'<!-- Skrypt kontaktu by mirvanos.org -->'."\n".$this->template;
    if(defined('INCLUDE_CSS') AND strlen(INCLUDE_CSS)>0)
        echo '<style type="text/css">'."\n".file_get_contents(INCLUDE_CSS)."\n".'</style>';

    if(isset($_POST['mirvanos_content']) AND !empty($_POST['mirvanos_content']))
        $this->parse();
    else
        $this->content .= $this->template;
    }

private function parse() {
    if(!isset($_POST['mirvanos_email']) OR empty($_POST['mirvanos_email']) OR !$this->checkEmail(trim($_POST['mirvanos_email']))) {
        $m = 'Proszę podać swój prawidłowy adres email';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_email = trim($_POST['mirvanos_email']);

    if(!isset($_POST['mirvanos_name']) OR empty($_POST['mirvanos_name'])) {
        $m = 'Proszę się przedstawić (imię i nazwisko)';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_name = strip_tags(trim($_POST['mirvanos_name']));

    if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
        if(!isset($_POST['mirvanos_antibot']) OR !$this->checkCode($_POST['mirvanos_antibot'])) {
            $m = 'Proszę dokładnie przepisać kod z obrazka';
            $this->content .= $this->errorMessage($m);
            $this->content .= $this->alertMessage($m);
            $this->content .= $this->template;
            return false;
            }

    $this->mail_content = 'Nowa wiadomość od <b> '.$this->mail_name.' </b> <br />'."\n";
        $this->mail_content .= 'Adres email <a href="'.$this->mail_email.'">'.$this->mail_email.' </a> <br />'."\n";
        $this->mail_content .= 'Adres IP <b> '.$_SERVER["REMOTE_ADDR"].' </b> <br />'."\n\n";
        $this->mail_content .= " <br /><br />\n\n ";
        $this->mail_content .= trim( $_POST['mirvanos_content'] );

    if(USE_ICONV_CONVERT) {
        $this->mail_content = iconv('UTF-8', 'ISO-8859-2', $this->mail_content);
        $this->mail_name = iconv('UTF-8', 'ISO-8859-2', $this->mail_name);
        }

    if($this->sendMail()) {
        $this->mail_email = '';
        $this->mail_name = '';
        $this->mail_content = '';
        $this->template = '';
        if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
            unset($_SESSION['AntitokenID']);
        }
    }

private function checkEmail($email='') {
    return eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$" , $email );
    }

private function checkCode($code='')
    {
    if(empty($code)) return false;
    @ session_start();
    if(!isset($_SESSION['AntitokenID']) OR empty($_SESSION['AntitokenID']))
        return false;
    if($_SESSION['AntitokenID']!=$code)
        return false;
    return true;
    }

private function sendMail() {
    require_once(CLASS_PHPMAILER);
    $mail = new PHPMailerLite();
    $mail->isMail();
    $mail->setFrom($this->mail_email, $this->mail_name);
    $mail->CharSet = 'iso-8859-2';
    if(USE_ICONV_CONVERT)
        {
        $mail->Subject = iconv('UTF-8', 'ISO-8859-2', MAIL_SUBJECT);
        }
    else
        $mail->Subject = MAIL_SUBJECT;
    $mail->MsgHTML( $this->mail_content );
    $mail->AddAddress(ADRES_EMAIL, TWOJA_NAZWA);

    if(!$mail->Send()) {
            $m = 'Wystąpił błąd w wysyłce maila :( '.$mail->ErrorInfo." <br /> \n";
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        return false;
        }
    // Clear all addresses and attachments
    $mail->ClearAddresses();
    $mail->ClearAttachments();
    $m = WIADOMOSC_ZOSTALA_WYSLANA;
    $this->content .= $this->errorMessage($m);
    $this->content .= $this->alertMessage($m);
    return true;
    }

private function alertMessage($message='') {
    return '<script type="text/javascript">
    alert(\''.$message.'\');
</script>'."\n";
    }
private function errorMessage($message='') {
    return '<b class="mirvanos_error">'.$message.'</b>';
    }

public function getHtml() {
    return $this->content;
    }

public function getMailName() {
    return $this->mail_name;
    }
public function getMailEmail() {
    return $this->mail_email;
    }
public function getMailContent() {
    return $this->mail_content;
    }


}

W sekcji CLASS deklaruję VAR $mail_nazwauzytkownika = ''; oraz w kodzie kopiuję pętlę IF:

    if(!isset($_POST['mirvanos_email']) OR empty($_POST['mirvanos_email']) OR !$this->checkEmail(trim($_POST['mirvanos_email']))) {
        $m = 'Proszę podać swój prawidłowy adres email';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_email = trim($_POST['mirvanos_email']);

zmieniając mirvanos_email na mirvanos_nazwauzytkownika potem w sekcji generowania maila dodaję również:

if($this->sendMail()) {
        $this->mail_email = '';
        $this->mail_name = '';
        $this->mail_content = '';
$this->mail_nazwauzytkownika ='';
        $this->template = '';
        if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
            unset($_SESSION['AntitokenID']);

ale albo mi nie działa program albo korzysta z tej samej CLASS i wysyła maila z ominięcie IMIE I NAZWISKO a w miejsce tego wstawia NAZWA UZYTKOWNIKA...

Czy ktoś z Was mógłby mi na tym przykładzie KODU wyjaśnić co i jak robię źle bo nie mam pojęcia jak rozbudować ten KOD o nowe atrybuty wprowadzane z poziomu przeglądarki WWW, żeby zostały ujęte w treści generowanego i dostarczonego maila...

1

Nie ma czegoś takiego jak pętla IF. Pętla to pętla, a if to warunek.

Nie uzywa się już var w polach klasy, to było w PHP4.

if(!isset($_POST['mirvanos_email']) OR empty($_POST['mirvanos_email']) OR !$this->checkEmail(trim($_POST['mirvanos_email']))) {

To jest jakiś overkill wystarczy, że sprawdzisz empty. Tak samo funkcji ergi juz sie nie używa. Nawet w maualu php o tym pisza.

if($this->sendMail()) {
        $this->mail_email = '';
        $this->mail_name = '';
        $this->mail_content = '';
        $this->mail_nazwauzytkownika ='';
        $this->template = '';
        if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
            unset($_SESSION['AntitokenID']);

Czytałeś ten kod? Metoda sendMail wysyła Ci maila i ustawia pola klasy na pusty string, jeżeli mail został wysłany. Dopisanie tu czegokolwiek nie ma wpływu na wysyłanie maila. W metodzie parse linijka odpowiedzialna za wrzucenie tego do pol klasy to

$this->mail_email = trim($_POST['mirvanos_email']);

Musisz to analogicznie zrobić tam.

if(empty($_POST['nazwauzytkownika']) || !$this->checkEmail(trim($_POST['nazwauzytkownika']))) { // cokolwiek robi ta druga metoda oO
    $m = 'Proszę podać nazwę użytkownika'; 
    $this->content .= $this->errorMessage($m);
    $this->content .= $this->alertMessage($m);
    $this->content .= $this->template;
    return false;
}
$this->mail_nazwauzytkownika = trim($_POST['nazwauzytkownika']);

Pola tam ustawione są wykorzysytwane w metodzie sendMail, m.in. w tym miejscu:

$mail->isMail();
$mail->setFrom($this->mail_email, $this->mail_name);

Coś mi się wydaje, że jesteś niedzielnym programistą :P

Polecam skorzystanie z tego https://github.com/PHPMailer/PHPMailer

0

Mój kod po dodaniu CLASS o nazwie VAR $mail_firma wygląda następująco:

<?php

class mirvanosContact {
var $content = '';
var $template = '';
var $mail_email = '';
var $mail_name = '';
var $mail_content = '';
var $mail_firma = '';

public function __construct() {
    if(!file_exists('mirvanos_contact_config.php')) {
        $m = 'Brak pliku konfiguracyjnego mirvanos_contact_config.php !';
        echo $this->errorMessage($m);
        echo $this->alertMessage($m);
        exit;
        }
    require_once('mirvanos_contact_config.php');
    if(!file_exists('mirvanos_contact_template.html')) {
        $m = 'Brak pliku szablonu mirvanos_contact_template.html !';
        echo $this->errorMessage($m);
        echo $this->alertMessage($m);
        exit;
        }
    $this->template = file_get_contents('mirvanos_contact_template.html');
    if(defined('USE_CAPTCHA') AND USE_CAPTCHA) {
        $captcha = file_get_contents('mirvanos_contact_captcha.html');
        $this->template = str_replace('<!--CAPTCHA-->', $captcha, $this->template);
        }
    // Uwaga !
    $this->template = "\n".'<!-- Skrypt kontaktu by mirvanos.org -->'."\n".$this->template;
    if(defined('INCLUDE_CSS') AND strlen(INCLUDE_CSS)>0)
        echo '<style type="text/css">'."\n".file_get_contents(INCLUDE_CSS)."\n".'</style>';

    if(isset($_POST['mirvanos_content']) AND !empty($_POST['mirvanos_content']))
        $this->parse();
    else
        $this->content .= $this->template;
    }

private function parse() {
    if(!isset($_POST['mirvanos_email']) OR empty($_POST['mirvanos_email']) OR !$this->checkEmail(trim($_POST['mirvanos_email']))) {
        $m = 'Proszę podać swój prawidłowy adres email';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_email = trim($_POST['mirvanos_email']);

    if(!isset($_POST['mirvanos_name']) OR empty($_POST['mirvanos_name'])) {
        $m = 'Proszę się przedstawić (imię i nazwisko)';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_name = strip_tags(trim($_POST['mirvanos_name']));
    
        if(!isset($_POST['mirvanos_name']) OR empty($_POST['mirvanos_name'])) {
        $m = 'Proszę podać nazwę Firmy';
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        $this->content .= $this->template;
        return false;
        }
    $this->mail_firma = strip_tags(trim($_POST['mirvanos_name']));

    if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
        if(!isset($_POST['mirvanos_antibot']) OR !$this->checkCode($_POST['mirvanos_antibot'])) {
            $m = 'Proszę dokładnie przepisać kod z obrazka';
            $this->content .= $this->errorMessage($m);
            $this->content .= $this->alertMessage($m);
            $this->content .= $this->template;
            return false;
            }

    $this->mail_content = 'Nowa wiadomość od <b> '.$this->mail_name.' </b> <br />'."\n";
        $this->mail_content .= 'Adres email <a href="'.$this->mail_email.'">'.$this->mail_email.' </a> <br />'."\n";
        $this->mail_content .= 'Adres IP <b> '.$_SERVER["REMOTE_ADDR"].' </b> <br />'."\n\n";
        $this->mail_content = 'Nazwa Firmy <b> '.$this->mail_firma.' </b> <br />'."\n";
        $this->mail_content .= " <br /><br />\n\n ";
        $this->mail_content .= trim( $_POST['mirvanos_content'] );

    if(USE_ICONV_CONVERT) {
        $this->mail_content = iconv('UTF-8', 'ISO-8859-2', $this->mail_content);
        $this->mail_name = iconv('UTF-8', 'ISO-8859-2', $this->mail_name);
        $this->mail_firma = iconv('UTF-8', 'ISO-8859-2', $this->mail_firma);
        }

    if($this->sendMail()) {
        $this->mail_email = '';
        $this->mail_name = '';
        $this->mail_content = '';
        $this->mail_firma = '';
        $this->template = '';
        if(defined('USE_CAPTCHA') AND USE_CAPTCHA)
            unset($_SESSION['AntitokenID']);
        }
    }

private function checkEmail($email='') {
    return eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,4}$" , $email );
    }

private function checkCode($code='')
    {
    if(empty($code)) return false;
    @ session_start();
    if(!isset($_SESSION['AntitokenID']) OR empty($_SESSION['AntitokenID']))
        return false;
    if($_SESSION['AntitokenID']!=$code)
        return false;
    return true;
    }

private function sendMail() {
    require_once(CLASS_PHPMAILER);
    $mail = new PHPMailerLite();
    $mail->isMail();
    $mail->setFrom($this->mail_email, $this->mail_name, $this->mail_firma);
    $mail->CharSet = 'iso-8859-2';
    if(USE_ICONV_CONVERT)
        {
        $mail->Subject = iconv('UTF-8', 'ISO-8859-2', MAIL_SUBJECT);
        }
    else
        $mail->Subject = MAIL_SUBJECT;
    $mail->MsgHTML( $this->mail_content );
    $mail->AddAddress(ADRES_EMAIL, TWOJA_NAZWA);

    if(!$mail->Send()) {
            $m = 'Wystąpił błąd w wysyłce maila :( '.$mail->ErrorInfo." <br /> \n";
        $this->content .= $this->errorMessage($m);
        $this->content .= $this->alertMessage($m);
        return false;
        }
    // Clear all addresses and attachments
    $mail->ClearAddresses();
    $mail->ClearAttachments();
    $m = WIADOMOSC_ZOSTALA_WYSLANA;
    $this->content .= $this->errorMessage($m);
    $this->content .= $this->alertMessage($m);
    return true;
    }

private function alertMessage($message='') {
    return '<script type="text/javascript">
    alert(\''.$message.'\');
</script>'."\n";
    }
private function errorMessage($message='') {
    return '<b class="mirvanos_error">'.$message.'</b>';
    }

public function getHtml() {
    return $this->content;
    }

public function getMailName() {
    return $this->mail_name;
    }
public function getMailEmail() {
    return $this->mail_email;
    }
public function getMailContent() {
    return $this->mail_content;
    }
 public function getMailfirma() {
    return $this->mail_firma;
    }


}

1

No i w czym problem?

0

Znaczy deklarując VAR mail_firma oraz kopiując warunek IF zmieniając w nim odwołania do mail_firma a także dopisując w pozostałych miejscach wywołanie nadal mam problem że nie generuje mi tego nowego rekordu pod dotychczasowymi tylko zastępuje wszystkie tym nowym mail_firma

Czyli jak do tej pory w oryginalnym, nietykanym kodzie dostawałem wiadomość mail o treści:

**Nowa wiadomość od Jan Kowalski
Adres email [email protected]
Adres IP 1XX.1XX.1XX.1XX

TEST 01010101010**

to teraz otrzymuję wiadomość o takiej treści:

**Nazwa Firmy TEST

TEST 01010101010**

1
$this->mail_content = 'Nazwa Firmy <b> '.$this->mail_firma.' </b> <br />'."\n";

Tutaj jest błąd. Brakuje kropki... Wiesz co robi .=, a co samo =?

0

Ok testuję tą Twoją pierwszą metodę - teraz mam pytanie odnośnie drugiego pliku odpowiedzialnego za wyświetlanie w Formularzu xHTML:


<form action="" method="post" id="form-send-contact">
<dl>

    <dt><label>Twoje imię i nazwisko</label></dt>
    <dd><input type="text" name="mirvanos_name" value="" /></dd>

    <dt><label>Podaj swój adres email</label></dt>
    <dd><input type="text" name="mirvanos_email" value="" /></dd>

    <dt><label>Treść wiadomości</label></dt>
    <dd><textarea name="mirvanos_content" rows="6" cols="35"></textarea></dd>

    <!--CAPTCHA-->

    <dd><input type="submit" value="WYŚLIJ" class="buttony" /></dd>

</dl>
</form>

Chcę dodać nową rubrykę to po prostu wpisuję:

    <dt><label>Twoje wpisz nazwę Firmy</label></dt>
    <dd><input type="text" name="mirvanos_name" value="" /></dd>

czy muszę zmienić również i name ?

1

Musisz zmienić name, bo to trafia później do globalnej zmiennej $_POST. Rozumiem, że nie zajmujesz się programowaniem? Bo xHTML to hmm.. tego..

0

Desu - ta Twoja metoda z pierwszego posta na czystym kodzie spowodowała w ogóle nie wyświetlenie żadnej strony WWW ale po dodaniu kropki do tego mojego moda DZIAŁA !
Dziękuję Ci bardzo za pomoc !

0

Desu nie , nie zajmuję się programowaniem zawodowo ani nawet amatorsko ale dumny z siebie jestem, że to jakoś dodałem i że to działa :)

Mam teraz tylko problem z tym drugim plikiem jakbyś mi mógł wytłumaczyć o co chodzi ze zmianą NAME.

P.S.: Plusy już rozdzielone, bo naprawdę pomogłeś !!!!!!!!!

1

OK już poradziłem sobie ze wszystkim :) Działa i hula po prostu zmieniłem wartość NAME na "mirvanos_firma" i tym samym nie dubluje mi wpisów a pokazuje nowy :)

1

Dla Twojej informacji:

Skrypt jest OHYDNY. Okropnie stary, korzystający z niepoprawnych, przestarzałych wzorców (takich jak kodowanie ISO-8859-2, a w oczy rzuca się dużo rzeczy na raz), napisane pod megastarą wersję PHP.

Generalnie te "strony ze skryptami" to w większości relikt historii, pozostały z czasów modemowych, trzymany dla reklam, bo dobrze wypozycjonowany - natomiast kod tam zawarty to porażka, dziury i zerowa kompatybilność z dzisiejszym oprogramowaniem. Zdecydowanie odradzam korzystanie z tego, co znalazłeś, nawet jeżeli udało Ci się to uruchomić - za pół roku zaktualizują Ci php na serwerze (lepsze firmy odpuszczają sobie już wspieranie czegoś poniżej PHP 5.4) i przestanie działać.

0

No tak ale wiesz bez znajomości języka to i tak fajnie sobie poradziłem z tematem i uruchomiłem to w pełni działająco. Jak się wysypie to będę myślał o zmianie, na razie działa i wystarcza :)

0

OK apetyt rośnie w miarę jedzenia.
Chciałbym żeby po wygenerowanym mailu dane owszem były wysyłane na skrzynkę @ ale i również generował się dla użytkownika wypełniającego formularz plik w .PDF - trudne to jest do zrobienia przy tym kodzie ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1