[PHP] Code na mail() werkt niet

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Mijn vraag

Ik heb momenteel een contactformulier gemaakt met de mail() functie in php. Deze topic is ook niet om een discussie te beginnen of dat de beste manier is of niet want ik weet dat er betere opties zijn ;).
Het probleem is dat ik na het versturen van het formulier met de mail() functie (Die gewoon werkt) nog een header(''Location: link.php?send=success"); regel gebruik.

Op mijn localhost wordt de mail niet verzonden uiteraard omdat ik dit niet heb ingesteld maar gaat hij na het verzenden van het formulier wel naar de link link.php?send=success.

Als ik de pagina upload naar mijn hosting wordt de e-mail keurig verzonden maar gaat de browser gewoon naar link.php en negeert hij de send=success regel.

Heeft iemand een idee in welke richting ik moet denken voor een oplossing?


Relevante software en hardware die ik gebruik
PHP, html, css, javascript

Wat ik al gevonden of geprobeerd heb
Googlen op bijvoorbeeld 'script after mail() does not run' leverd geen vergelijkbare problemen op helaas vandaar dat ik jullie tweakers om hulp vraag :)

Beste antwoord (via Jasper_S1985 op 14-02-2020 15:10)


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 12:56

AW_Bos

Liefhebber van nostalgie... 🕰️

Ik raad aan om je foutafhandeling even op maximaal te zetten.

Waarom laat je de gebruiker doorsturen? Met welke reden?
Je kan toch prima aan de hand van een if-else statement op mail() aangeven dat de mail verstuurd is? Bouw dan ook een afhandeling die aangeeft als het mail() false is, en dat de mail NIET verstuurd is vanwege technische problemen.

Overigens zou ik altijd na een header() met een Location een exit() gebruiken. Want je script moet wel stoppen.

Nog een topje van mij: Gebruik liever phpMailer. Die is veel makkelijk uit te breiden als je bijvoorbeeld via Gmail wilt mailen, of een andere SMTP-server, of als je bijzondere authenticatie-configuratie hebt.

[ Voor 25% gewijzigd door AW_Bos op 14-02-2020 13:57 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes

Alle reacties


Acties:
  • 0 Henk 'm!

  • DaFeliX
  • Registratie: December 2002
  • Laatst online: 02-10 13:41

DaFeliX

Tnet Devver
Als een header() functie genegeerd word, is het raadzaam om te kijken of er geen output plaatsvind voordat je deze functie aanroept. Output kan ook plaatsvinden in de vorm van een foutmelding oid.

Laat anders even de relevante code zien, dat maakt het wat makkelijker om te zien wat er aan de hand zou kunnen ziijn :)

Einstein: Mijn vrouw begrijpt me niet


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Dit is de code die de mail verzend

code:
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
$to = 'info@email.nl'; 
            $email2 = $email;
            $name = $name;
            // Subject
            $subject = 'Nieuw bericht via contactformulier webadres.nl';
            // Message
            $message = '
            <html>
            <head>
            <style>
            body {
            font-family: arial;
            font-size: 16px;
            }
            </style>
                <title>Nieuw bericht via contactformulier webadres.nl</title>
            </head>
            <body>
                <table>
                    <tr>
                        <td>Naam:</td>
                        <td>'.$name.'</td>
                    </tr>
                    <tr>
                        <td>E-mail:</td>
                        <td>'.$email2.'</td>
                    </tr>
                    <tr>
                        <td>Ordernummr:</td>
                        <td>'.$ordernr.'</td>
                    </tr>
                    <tr>
                        <td>Bericht:</td>
                        <td>'.$message.'</td>
                    </tr>
                </table>
            </body>
            </html>
            ';
            // To send HTML mail, the Content-type header must be set
            $headers[] = 'MIME-Version: 1.0';
            $headers[] = 'Content-type: text/html; charset=iso-8859-1';
            // Additional headers
            $headers[] = 'To: Ontvanger <info@webadres.nl>';
            $headers[] = 'From: '.$name.' <'.$email2.'>';
            // Mail it
            mail($to, $subject, $message, implode("\r\n", $headers));
            header('Location: contact.php?send=success');

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 12:56

AW_Bos

Liefhebber van nostalgie... 🕰️

Ik raad aan om je foutafhandeling even op maximaal te zetten.

Waarom laat je de gebruiker doorsturen? Met welke reden?
Je kan toch prima aan de hand van een if-else statement op mail() aangeven dat de mail verstuurd is? Bouw dan ook een afhandeling die aangeeft als het mail() false is, en dat de mail NIET verstuurd is vanwege technische problemen.

Overigens zou ik altijd na een header() met een Location een exit() gebruiken. Want je script moet wel stoppen.

Nog een topje van mij: Gebruik liever phpMailer. Die is veel makkelijk uit te breiden als je bijvoorbeeld via Gmail wilt mailen, of een andere SMTP-server, of als je bijzondere authenticatie-configuratie hebt.

[ Voor 25% gewijzigd door AW_Bos op 14-02-2020 13:57 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
AW_Bos schreef op vrijdag 14 februari 2020 @ 13:54:
Ik raad aan om je foutafhandeling even op maximaal te zetten.

Waarom laat je de gebruiker doorsturen? Met welke reden?
Je kan toch prima aan de hand van een if-else statement op mail() aangeven dat de mail verstuurd is? Bouw dan ook een afhandeling die aangeeft als het mail() false is, en dat de mail NIET verstuurd is vanwege technische problemen.

Overigens zou ik altijd na een header() met een Location een exit() gebruiken. Want je script moet wel stoppen.

Nog een topje van mij: Gebruik liever phpMailer. Die is veel makkelijk uit te breiden als je bijvoorbeeld via Gmail wilt mailen, of een andere SMTP-server, of als je bijzondere authenticatie-configuratie hebt.
Owja ik had niet eens aan een if else gedacht haha ik gebruik altijd deze manier :) Thx.
Ik weet het van phpmailer alleen daar heb ik me nog niet in verdiept en dit is een oplossing die hiervoor prima volstaat ;)

Acties:
  • +1 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 03-10 23:11

DataGhost

iPL dev

Je wil het niet horen maar hier alvast de waarschuwing: de opbouw van je code suggereert dat je verder helemaal niks doet met de user input, dus je script is vatbaar voor header injection. "Dat gebeurt mij niet", hoor ik je nu denken. Maar kijk er nog eens goed naar en bedenk je hoe blij je hoster gaat zijn als je script straks in het wilde weg staat te spammen. Er zijn zat botjes die heel het www afscannen op formulieren waar e-mailadressen in verwacht worden en volautomatisch proberen of die vatbaar zijn voor injection.

Laat het alsjeblieft afhandelen door een pakket waar veel mensen lange tijd aan bezig zijn geweest om juist alle simpele (zoals deze) en minder simpele valkuilen te vermijden. Op het moment dat iets werkt ben je nóg minder geneigd om het te vervangen door iets beters want "het werkt nu toch al".

[ Voor 7% gewijzigd door DataGhost op 14-02-2020 14:25 ]


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
De user input wordt hiervoor al gechecked maar dankje voor de input! :)

Heb het inmiddels werkend met een if else statement dus bedankt voor de hulp!

[ Voor 36% gewijzigd door Jasper_S1985 op 14-02-2020 15:11 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13:10

Creepy

Tactical Espionage Splatterer

Wat voor checks praten we dan over? Want als je niet stricte checks in je PHP code hebt zitten op $name en $email dan is het echt een kleine moeite om je code te gebruiken voor het versturen van willekeurige mail aan willekeurige e-mailadressen....

En qua aflevering kan je ook issues krijgen omdat je het FROM adres zet op de gegevens van de invuller waarmee je volledig voorbij kan gaan aan SPF/DMARC bijv. Dus haal dat gewoon weg en maak van de from een hardcoded iets.

[ Voor 31% gewijzigd door Creepy op 14-02-2020 16:35 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Ik gebruik htmlspecialchars en stripslashes en daarna word er gechecked of er alleen maar letters en getallen gebruikt worden met preg_match

Acties:
  • +2 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
De $additional_headers arg van mail() kan een array zijn en biedt dan een beetje extra bescherming. Met je implode() draai je die feature de nek om.

Niet dat het uitmaakt, de getoonde code is zo lastig veilig te krijgen, dat ik er vanuit ga dat dat het niet is.
Kom maar op met je preg_match() regels.

Hoe dan ook: Beste toekomstig lezer van dit topic, gebruik aub niet de gedeeltelijke code uit topicstart als begin voor je eigen mailfunctionaliteit.

{signature}


Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
Ff een vraagje dan... Het formulier heeft totaal geen connectie met een database oid. Wat zou dan het ergste zijn dat ze kunnen doen met zon formulier? Mochten ze de site platgooien kan ik namelijk gewoon de versie van gisteren terug laten zetten.

Acties:
  • 0 Henk 'm!

  • X_lawl_X
  • Registratie: September 2009
  • Laatst online: 03-10 14:13
Jasper_S1985 schreef op zaterdag 15 februari 2020 @ 10:01:
Ff een vraagje dan... Het formulier heeft totaal geen connectie met een database oid. Wat zou dan het ergste zijn dat ze kunnen doen met zon formulier? Mochten ze de site platgooien kan ik namelijk gewoon de versie van gisteren terug laten zetten.
Bijvoorbeeld via header injection mailtjes vanuit jouw server versturen.

Acties:
  • +2 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 13:10

Creepy

Tactical Espionage Splatterer

Spam versturen inderdaad. Als je de mail headers kan beinvloeden, en dat lijkt hier het geval, dan is het vrij simpel om bijv een extra To of CC header in te voegen zodat je mail kan versturen naar wie je ook maar wilt. Vervolgens voeg je in plaats van een header nog een stukje HTML en of text in. Dat staat dan vooraan wat jij in $message hebt gestopt.

Als ik in $email iets krijg als
code:
1
spamemail\r\nCC: mailadreshier\r\nSubject: Dit is spam\r\n\r\nEn hier mijn mailcontent ipv die van jou\r\n\\r\n"

Dan komt er een mail uit die er als volgt uitziet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
MIME-Version: 1.0
Content-type: text/html; charset=iso-8859-1
To: Ontvanger <info@webadres.nl>
From: spamemail
CC: mailadreshier
Subject: Dit is spam

En hier mijn mailcontent ipv die van jou

Subject: Nieuw bericht via contactformulier webadres.nl'

En hier jouw mail content

En dat kan uiteraard nog veel slimmer door mime content goed in te zetten zodat jouw content volledig verdwijnt.

Je zal vervolgens vrij snel op blacklists komen te staan en ik gok dat je hoster ook vrij snel het formulier offline zal halen als ze merken dat het misbruikt wordt voor het versturen van spam.

TLDR: Gebruik aub een fatsoenlijke mail library ipv direct de PHP mail functie. Daar bespaar je jezelf erg veel ellende mee.

[ Voor 14% gewijzigd door Creepy op 15-02-2020 11:31 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

En dingen als $name = $name zijn natuurlijk ook overbodig.

Acties:
  • 0 Henk 'm!

  • Jasper_S1985
  • Registratie: Februari 2015
  • Laatst online: 03-10 17:50
CH4OS schreef op zaterdag 15 februari 2020 @ 11:36:
En dingen als $name = $name zijn natuurlijk ook overbodig.
Ik had wat dingen gewijzigd om herkenbaarheid te voorkomen ;)
Pagina: 1