Probleem met contactformulier

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rob Valkenburg

Rob Valkenburg

20/10/2019 14:55:02
Quote Anchor link
Hallo,

Hoop dat ik dit op de juiste plek zet.

Ik ben bezig met een nieuw contactformulier voor de website van het werk van mijn vrouw, omdat de vorige pagina met Recaptha V3 niet goed werkte.

De nieuwe versie heb ik wel werkend, maar er duikt een probleem op met de optie "Stuur kopie".
Deze wordt wel afgehandeld, maar bij de bedanktekst blijft de optie (incl. verzenden / wis knoppen staan).
Van alles geprobeerd, maar ik zie het niet. Script heb ik niet zelf geschreven. Zo ervaren ben ik nu ook weer niet.

Of de Recaptcha nu wel werkt blijft even afwachten.

Hopelijk zien jullie het probleem. P.s. Testen mag... https://boefjesenelfjes.nl/contact_test6_-page.php
Mails zal ik verwijderen en zeker niet (mis)gebruiken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
<?php
define('SITE_KEY', '__SITEKEY__');
define('SECRET_KEY', '__SECRETKEY__');
?>


//in de head
    <title>ReCaptcha V3</title>
    <script src='https://www.google.com/recaptcha/api.js?render=<?php echo SITE_KEY; ?>'></script>
    <script>
function myFunction(x) { document.getElementById("mySidenav").classList.toggle("open");
    x.classList.toggle("change");
}
</script>


</header>
<?php

// Config Gedeelte
$cfg['url'] = "www.boefjesenelfjes.nl";// Site waarnaar je terug gaat als je een bericht hebt achtergelaten
$cfg['naam'] = "Rob";                // Webmaster naam
$cfg['email'] = "__mijn e-mail__";        // Webmaster E-mail
$cfg['spam'] = 0;                        // Anti Spam Tijd in Minuten ( Voer "0" om de Spam Beveiliging uit te zetten )
$cfg['text'] = TRUE;                    // Bij Fout Text Rood maken ( TRUE voor aan, FALSE voor uit )
$cfg['input'] = TRUE;                    // Bij Fout Border om Vakje Rood maken ( TRUE voor aan, FALSE voor uit )
$cfg['HTML'] = TRUE;                    // Een HTML email ( TRUE voor aan, FALSE voor uit )

// Hieronder niks meer veranderen
// E-mail Checker / Validator

function checkmail($email)
{

    if(preg_match("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$", $email))
    {

        return TRUE;
    }

    return FALSE;
}


$formulier = TRUE;

if(!isset($_COOKIE['formulier']))
{

    if(isset($_POST['wis']) && ($_SERVER['REQUEST_METHOD'] == "POST"))
    {

        foreach($_POST as $key => $value)
        {

            unset($value);
        }

        header("Location: ".$_SERVER['PHP_SELF']."");
    }

        
    if(isset($_POST['verzenden']) && ($_SERVER['REQUEST_METHOD'] == "POST"))
    {

        $aFout = array();
        
        $naam = trim($_POST['naam']);
        $email = trim($_POST['email']);
        $onderwerp = trim($_POST['onderwerp']);
        $bericht = trim($_POST['bericht']);
        
       if(empty($naam) || (strlen($naam) < 3) || ( preg_match("[<>]", $naam) ) )
        {

            $aFout[] = "Er is geen naam ingevuld.";
            unset($naam);
            $fout['text']['naam'] = TRUE;
            $fout['input']['naam'] = TRUE;
        }

        if(empty($email))
        {

            $aFout[] = "Er is geen e-mail adres ingevuld.";
            unset($email);
            $fout['text']['email'] = TRUE;
            $fout['input']['email'] = TRUE;
        }

        elseif(!filter_var($email, FILTER_VALIDATE_EMAIL))
        {

            $aFout[] = "Er is geen correct e-mail adres ingevuld.";
            unset($email);
            $fout['text']['email'] = TRUE;
            $fout['input']['email'] = TRUE;
        }

        if(empty($onderwerp))
        {

            $aFout[] = "Er is geen onderwerp ingevuld.";
            unset($onderwerp);
            $fout['text']['onderwerp'] = TRUE;
            $fout['input']['onderwerp'] = TRUE;
        }

        if(empty($bericht))
        {

            $aFout[] = "Er is geen bericht ingevuld.";
            unset($bericht);
            $fout['text']['bericht'] = TRUE;
            $fout['input']['bericht'] = TRUE;
        }

        if(!$cfg['text'])
        {

            unset($fout['text']);
        }

        if(!$cfg['input'])
        {

            unset($fout['input']);
        }

        if(!empty( $aFout ))
        {

            $errors = '
            <div id="errors">
            <ul>'
;
            foreach($aFout as $sFout)

            {

                $errors .= "    <li>".$sFout."</li>\n";
            }

            $errors .= "</ul>
            </div>"
;
        }

        else
        {
            $formulier = FALSE;
            
            
            if($cfg['HTML'])
            {

                // Headers
                $headers = "From: \"Contact Formulier\" <".$cfg['email'].">\r\n";
                $headers .= "Reply-To: \"".$naam."\" <".$email.">\n";
                $headers .= "Return-Path: Mail-Error <".$cfg['email'].">\n";
                $headers .= "MIME-Version: 1.0\n";
                $headers .= "Content-Transfer-Encoding: 8bit\n";
                $headers .= "Content-type: text/html; charset=iso-8859-1\n";
                
                
                $bericht = '
                <br />
                <b>Naam:</b> '
.$naam.'<br />
                <b>Email:</b> <a href=\"mailto:'
.$email.'\">'.$email.'</a><br />
                <br />
                <b>Bericht:</b><br />
                '
.$bericht.'
                <br />
                <br />
                <br />
                --------------------------------------------------------------------------<br />
                <b>Datum:</b> '
.date("d-m-Y @ H:i:s").'<br />
                <b>IP:</b> <a href=\"http://sunny.nic.com/cgi-bin/whois?domain='
.$_SERVER['REMOTE_ADDR'].'\">'.$_SERVER['REMOTE_ADDR'].'</a><br />
                <b>Host:</b> '
.gethostbyaddr($_SERVER['REMOTE_ADDR']).'<br />
                </body>
                </html>'
;
            }

            else
            {
                $bericht_wrap = wordwrap ($bericht, 40, "\n", 1);
                // Headers
 //tijdelijk uit  $headers = "From: \"Contact Formulier\" <".$cfg['email'].">\n";
 //               $headers .= "MIME-Version: 1.0\n";
 //               $headers .= "Content-type: text/plain; charset='iso-8859-1'\n";
            
                // Bericht

                $message = "Naam: ".$naam."        \n";
                $message .= "E-mail: ".$email."     \n";
                $message .= "Bericht:\n".$bericht_wrap."     \n ";
                $message .= "               \n ";
                $message .= "Datum: ".date("d-m-Y H:i:s")." \n";
                $message .= "------------------------------------------------------- \n ";
                $message .= "IP: ".$_SERVER['REMOTE_ADDR']."                    \n ";
                $message .= "Host: ".gethostbyaddr($_SERVER['REMOTE_ADDR'])."                \n ";
            
            }

        
            if(mail($cfg['email'], "[Contact] ".$onderwerp, $bericht, $headers))
            {

                if(isset($_POST['stuurkopie']))
                {

 //tijdelijk uit      $headers = "From: \"Contact Formulier\" <".$email.">\r\n";
 //                   $headers .= "Reply-To: \"".$naam."\" <".$email.">\n";
 //                   $headers .= "Return-Path: Mail-Error <".$email.">\n";
 //                   $headers .= "MIME-Version: 1.0\n";
 //                   $headers .= "Content-Transfer-Encoding: 8bit\n";
 //                   $headers .= "Content-type: text/html; charset=iso-8859-1\n";

                    
                    mail($email, "[Contact] ".$onderwerp, $bericht, $headers );
                
                }

                
                unset($naam, $email, $onderwerp, $bericht);
//tijdelijk uit                setcookie("formulier", 1, time() + ( $cfg['spam'] * 60 ) );
        
                echo "
                <p>
                Uw bericht is succesvol verzonden, er word zo snel mogelijk gereageerd.<br />
                <br />
                Met vriendelijke groeten,<br />
                <b>"
.$cfg['naam']."</b>
                </p>
                "
;    
            }

            else
            {
                echo "Er is een fout opgetreden bij het verzenden van de email";
            }

//tijdelijk uit            header("refresh:3;url=".$cfg['url']."");
        }
    }

    if($formulier)
    {

    ?>

    <body>
    <div id="container">  
    <?php
    if(isset($errors)) {
        echo $errors;
    }

    ?>


        <form method="post" action="<?php $_SERVER['PHP_SELF']; ?>">
        <p>
        <label <?php if(isset($fout['text']['naam'])) { echo 'class="fout"'; } ?>>Naam:</label>
        <input type="text" id="naam" name="naam" maxlength="30" <?php if(isset($fout['input']['naam'])) { echo 'class="fout"'; } ?> value="<?php if (!empty($naam)) { echo stripslashes($naam); } ?>" /><b>
        
        <label <?php if(isset($fout['text']['email'])) { echo 'class="fout"'; } ?>>Email:</label>
        <input type="text" id="email" name="email" maxlength="255" <?php if(isset($fout['input']['email'])) { echo 'class="fout"'; } ?> value="<?php if (!empty($email)) { echo stripslashes($email); } ?>" /><br />
        
        <label <?php if(isset($fout['text']['onderwerp'])) { echo 'class="fout"'; } ?>>Onderwerp:</label>
        <input type="text" id="onderwerp" name="onderwerp" maxlength="40" <?php if(isset($fout['input']['onderwerp'])) { echo 'class="fout'; } ?> value="<?php if (!empty($onderwerp)) { echo stripslashes($onderwerp); } ?>" /><br />
        
        <label <?php if(isset($fout['text']['bericht'])) { echo 'class="fout"'; } ?>>Bericht:</label>
        <textarea id="bericht" name="bericht" <?php if(isset($fout['input']['bericht'])) { echo 'class="fout"'; } ?> cols="35" rows="6"><?php if (!empty($bericht)) { echo stripslashes($bericht); } ?></textarea><br />

        <?php
        }
        ?>

        <label for="stuurkopie">Stuur mij een kopie</label><input type="checkbox" id="stuurkopie" name="stuurkopie" value="1" /><br />
        
        <label></label>
        <input type="submit" id="verzenden" name="verzenden" value="verzenden" />
        <input type="submit" id="wis" name="wis" value="Wis velden" />
        </p>
        </form>
    </div>
    <?php
    }
else
{
    echo "
    <p>
    U kunt maar eens in de "
.$cfg['spam']." minuten een e-mail versturen!<br />
    U wordt nu automatisch doorgestuurd.
    </p>"
;
    header("refresh:3;url=".$cfg['url']."");
}

?>

<script>
    grecaptcha.ready(function() {
    grecaptcha.execute('<?php echo SITE_KEY; ?>', {action: 'homepage'})
    .then(function(token) {
        //console.log(token);
        document.getElementById('g-recaptcha-response').value=token;
    });
    });
    </script>
<?php
if($_POST){
    function
getCaptcha($SecretKey){
        $Response = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=".SECRET_KEY."&response={$SecretKey}");
        $Return = json_decode($Response);
        return $Return;
    }

    $Return = getCaptcha($_POST['g-recaptcha-response']);
    //var_dump($Return);
    if($Return->success == true && $Return->score > 0.5){
        echo "Succes!";
    }
else{
        echo "You are a Robot!!";
    }
}

?>


    
</body>
</html>
Gewijzigd op 20/10/2019 15:39:06 door - Ariën -
 
PHP hulp

PHP hulp

25/11/2024 04:11:02
 
- Ariën  -
Beheerder

- Ariën -

20/10/2019 15:11:57
Quote Anchor link
Kan je het script beperken tot relevante code, en deze tussen code-tags zetten? Zie ook de Veelgestelde Vragen.
Gewijzigd op 20/10/2019 15:13:58 door - Ariën -
 
Rob Valkenburg

Rob Valkenburg

20/10/2019 15:22:57
Quote Anchor link
- Ariën - op 20/10/2019 15:11:57:
Kan je het script beperken tot relevante code, en deze tussen code-tags zetten? Zie ook de Veelgestelde Vragen.


Ik zie dat mijn code niet helemaal overgekomen zoals ik wilde. Excuus.

@ariën : Had het hele script tussen code en /code tags gezet, echter alle ?php automatisch gescheiden. Hoe pas ik dit aan?
Gewijzigd op 20/10/2019 15:35:20 door Rob Valkenburg
 
- Ariën  -
Beheerder

- Ariën -

20/10/2019 15:39:32
Quote Anchor link
Fixxed, je mistte een php-starttag.

Oplossing voor je probleem:
Zet die formuliervelden in het if-statement erboven, waar ook de andere velden staan.

Toevoeging op 21/10/2019 13:28:02:

Nog iets: Ik zie net dat de mail die ik kreeg in mijn spambox terecht is gekomen. Blijkbaar omdat je headers uitstaan, als dat ook in je code zo is?

Veder kan je het beste met filter_var controleren of een mail-adres correct is. Nu sluit je lange extenties, zoals bijvoorbeeld: [email protected] al uit.

Ook raad ik aan om bij location-headers een exit() erna te plaatsen. Je wilt immers je script stoppen.
Gewijzigd op 20/10/2019 15:47:15 door - Ariën -
 
Rob Valkenburg

Rob Valkenburg

24/10/2019 21:39:08
Quote Anchor link
- Ariën - op 20/10/2019 15:39:32:
Oplossing voor je probleem:
Zet die formuliervelden in het if-statement erboven, waar ook de andere velden staan.

Opgelost.
- Ariën - op 20/10/2019 15:39:32:
Nog iets: Ik zie net dat de mail die ik kreeg in mijn spambox terecht is gekomen. Blijkbaar omdat je headers uitstaan, als dat ook in je code zo is?

Headers stonden uit, vanwege foutmeldingen. Kwam erachter dat het formulier zich voordeed dat de mail via je eigen adres werd verzonden. Script aangepast en headers weer aangezet.
- Ariën - op 20/10/2019 15:39:32:
Veder kan je het beste met filter_var controleren of een mail-adres correct is. Nu sluit je lange extenties, zoals bijvoorbeeld: [email protected] al uit.

Neem aan dat de meeste gewoon met een .nl, .com adres mailen.
Volgens mij zijn adressen met een lange extentie niet echt meer van deze tijd of is dat nog steeds hip?

- Ariën - op 20/10/2019 15:39:32:
Ook raad ik aan om bij location-headers een exit() erna te plaatsen. Je wilt immers je script stoppen.

Opgelost. Location headers verwijderd.

Bedankt voor de hulp.
De testpagina is offline.

Toevoeging op 24/10/2019 21:41:46:

Rob Valkenburg op 20/10/2019 14:55:02:


Testpagina bestaat inmiddels niet meer.
 
- Ariën  -
Beheerder

- Ariën -

24/10/2019 21:50:00
Quote Anchor link
Mailadressen met lange extenties (TLD's) zie je niet vaak, maar ze zijn er wel. Dus het is een kleine moeite om er rekening mee te houden :-)

je hebt ook .musea, .website .hosting en nog een hele hoop.
Gewijzigd op 26/10/2019 15:09:28 door - Ariën -
 
Rob Valkenburg

Rob Valkenburg

25/10/2019 19:51:46
Quote Anchor link
- Ariën - op 24/10/2019 21:50:00:
Mailadressen met lange extenties (TLS's) zie je niet vaak, maar ze zijn er wel. Dus het is een kleine moeite om er rekening mee te houden :-)

je hebt ook .musea, .website .hosting en nog een hele hoop.


Hoe zou ik dit eventueel kunnen aanpassen?
 
- Ariën  -
Beheerder

- Ariën -

25/10/2019 20:01:23
Quote Anchor link
Door filter_var() te gebruiken, waar ik eerder naar heen linkte.
Deze zal per PHP-versie wel een update krijgen als het nodig is. Dan hoef je niet steeds zelf een reg-ex te zoeken of te maken die in de meeste gevallen niet voldoet aan de voorgeschreven RFC :-P
Gewijzigd op 25/10/2019 20:02:13 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

25/10/2019 21:24:49
Quote Anchor link
Moet wel gezegd worden dat filter_var() -in zijn algemeenheid- geen wondermiddel is *kuch*unicode*kuch*. Desalniettemin zal deze filter (FILTER_VALIDATE_EMAIL) voor de meeste gevallen (waarschijnlijk) wel voldoen.

Dat gezegd hebbende, misschien is een alternatieve of aanvullende controle misschien ook interessant: je zou kunnen controleren of het domein een MX record heeft. Een e-mail adres kan namelijk volgens filter_var() wel een syntactisch valide e-mailadres zijn, maar deze kan nog steeds onzin bevatten.

filter_var() kan dus nog steeds "false positives" opleveren, maar met een extra check wordt de kans dat iemand een onzin-adres invult weer kleiner.

Bijvoorbeeld dus zoiets:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
// @note have to add a dot at the end to make it a Fully Qualified Domain Name, otherwise it might check a relative domain?
// @see https://www.php.net/manual/en/function.checkdnsrr.php#119969

$domain = substr($emailAddress, strpos($emailAddress, '@') + 1).'.'; // @todo UTF-8 compatibiliteit
$test = checkdnsrr($domain, 'MX');
if ($test === false) {
    // verzamel foutmeldingen op een of andere manier
    $errors[] = 'no MX record found for domain of e-mail address';
}

?>


En de ultieme check is natuurlijk een bevestigingsconstructie via het desbetreffende e-mailadres.
Gewijzigd op 25/10/2019 21:31:20 door Thomas van den Heuvel
 
Rob Valkenburg

Rob Valkenburg

26/10/2019 11:29:51
Quote Anchor link
Oké, bedankt voor jullie toelichting.

Ga erna kijken. :)
 
Thomas van den Heuvel

Thomas van den Heuvel

27/10/2019 22:31:04
Quote Anchor link
Potentiële verbetering (betere UTF-8 support):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$domain
= idn_to_ascii(mb_substr($emailAddress, mb_strpos($emailAddress, '@') + 1).'.');
$test = checkdnsrr($domain, 'MX');
if ($test === false) {
    $errors[] = 'no MX record found for domain of e-mail address';
}

?>
Gewijzigd op 27/10/2019 22:31:29 door Thomas van den Heuvel
 
Ivo P

Ivo P

28/10/2019 16:07:43
Quote Anchor link
maar als phphulp.nl geen MX record zou hebben, wordt de mail aangeboden aan het A record voor phphulp.nl.

Is was slordiger qua dns-beheer, maar wel een standaard.
 
Thomas van den Heuvel

Thomas van den Heuvel

28/10/2019 16:49:17
Quote Anchor link
Ah, dus je wilt eigenlijk zeggen dat de afwezigheid van een MX-record niet hoeft in te houden dat het domein géén mailserver heeft. Mja, lekker duidelijk :p.

In dat geval zou je de test wat kunnen versoepelen door aan $test een case toe te voegen. Ingeval de MX-check slaagt dan zal de A-check niet uitgevoerd worden als je een logische OR (||) gebruikt vanwege lazy evaluation.

Of enkel op een A-record controleren? Of zijn er ook domeinen die wel een MX-record hebben maar geen A-record? Dat zou misschien theoretisch ook kunnen?

Deze test is specifiek bedoeld om (verder) aannemelijk te maken dat een e-mailadres valide is. Idealiter is dit een controle die alles of ten minste zoveel mogelijk gevallen dekt. En de ultieme test is nog steeds een bevestiging per mail natuurlijk.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.