Contactform php html site werkt niet meer

Status
Niet open voor verdere reacties.

damnsharp

Terugkerende gebruiker
Lid geworden
6 jan 2012
Berichten
1.394
Hoi,
Bij een html website van klant komen de berichten ingevuld op het contactform niet meer aan.
Dit gebeurde na verplaatsing site naar andere server bij webhosting bedrijf.
Geen idee waarom ze niet meer aankomen. Het contactform inclusief Google v2 captcha lijken goed te werken. Krijg ook netjes bericht dat mail verzonden is (bestandje src\autoload.php wordt aangeroepen).
Een test php bestandje dat mail verstuurd komt wel aan.

Wat kan ik het beste doen om de fout op te sporen?
Bedankt! :thumb:

php code test mail wat werkt:
PHP:
<?php 
    ini_set( 'display_errors', 1 );
    error_reporting( E_ALL );
    $from = "emailtest@bedrijfsnaam.nl";
    $to = "info@mijnmailadres.nl";
    $subject = "PHP Mail Test script";
    $message = "This is a test to check the PHP Mail functionality";
    $headers = "From:" . $from;
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>

php code contactform:
PHP:
<?php
date_default_timezone_set('Europe/Amsterdam');

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

    // Hieronder zelf invullen voor email
    $website_naam = 'BEDRIJFSNAAM BV';
    $emailkruse = "info@MIJNMAILADRES.nl";     // Emailadres waarnaar de mail verzonden wordt
    $onderwerp  = "Bericht van de website BEDRIJFSNAAM"; // Onderwerp van de email
    $nextpage   = "verzonden.php";          // Laat deze pagina als de mail verzonden is
    $faultpage = "niet-verzonden.php"; //Laat deze pagina als de mail verzonden is.
    $emailreply = "noreply@BEDRIJFSNAAM.nl";     // Van emailadres + Beantwoorden aan emailadres
    $from = $_POST['email'];
    // Hieronder zelf invullen voor reCaptcha v2 
    $siteKey    = "xxxxxxxx";
    $secret     = "xxxxxxxx";
    $lang       = "nl";

    
    // De headers samenstellen
    $headers     = 'From: ' . $website_naam . ' <' . $from . '>' . "\r\n";
    $headers    .= 'Reply-To: ' . $website_naam . ' <' . $from . '>' . "\r\n";
    $headers    .= 'Return-Path: Mail-Error <' . $from . '>' . "\r\n";
    $headers    .= ($bcc_emailadres != '') ? 'Bcc: ' . $bcc_emailadres . "\r\n" : '';
    $headers    .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
    $headers    .= 'X-Priority: Normal' . "\r\n";
    $headers    .= ($html) ? 'MIME-Version: 1.0' . "\r\n" : '';
    $headers    .= ($html) ? 'Content-type: text/html; charset=iso-8859-1' . "\r\n" : '';
    
    // hier je bercicht samenstellen
    $postcode = $_POST['pc1'] . " " . strtoupper($_POST['pc2']);
    $bericht  = "Het volgende bericht is binnengekomen op de website op ".date("d-m-Y H:i:s")."\r\n".
				"\r\n".
				"Bedrijf:         ".$_POST['bedrijf']."\r\n".
				"Contactpersoon:  ".$_POST['aanhef']." ".$_POST['naam']."\r\n".
				"Adres:           ".$_POST['adres']."\r\n".
				"                 ".$postcode." ".strtoupper($_POST['plaats'])."\r\n".
				"                 ".$_POST['land']."\r\n".
				"Telefoonnummer:  ".$_POST['telnr']."\r\n".
				"Emailadres:      ".$_POST['email']."\r\n".
				"\r\n".
				"Zoek contact ".strtolower($_POST['contact'])."\r\n".
				"\r\n".
				"*****************************************************************************\r\n".
				"Opmerkingen:\r\n".
				"\r\n".
				$_POST['opmerkingen']."\r\n".
				"*****************************************************************************"; // laatste regel geen \r\n

    // reCaptcha token uit formulier
    $capInput = (isset($_POST['g-recaptcha-response'])) ? $_POST['g-recaptcha-response'] : '';
    $hasToken = (strlen($capInput) == 0) ? false : true;

    // reCaptcha library
    require_once __DIR__ . '/src/autoload.php';

    // Nieuwe instance van de ReCaptcha service
    $recaptcha = new \ReCaptcha\ReCaptcha($secret);

    // Mogelijk is file_get_contents('url') geblokkeerd bij jouw provider.
    // Een alsternatief is fsockopen(). Haal bovenstaande $recaptcha = ... weg en gebruik volgende regel.
    //$recaptcha = new \ReCaptcha\ReCaptcha($secret, new \ReCaptcha\RequestMethod\SocketPost());

    // Verificatie van de response waarbij ook de bezoekers IP wordt gecontroleerd
    $resp = $recaptcha->setExpectedHostname($_SERVER['SERVER_NAME'])
                      ->verify($_POST['g-recaptcha-response'], $_SERVER['REMOTE_ADDR']);
    
    // Controleer de response van $recaptcha->verify
    if ($resp->isSuccess()) {
        $capVerify = true;  // Verificatie gelukt
    } else {
        $capVerify = false; // Verificatie is niet gelukt
    }

    $mailsuccess = false;
    if ($hasToken === true && $capVerify === true) {
        $mailsuccess = mail($emailkruse, $onderwerp, $bericht, $headers);
    }
    // $nextpage is bedankpagina. $faultpage is bericht 'email niet verstuurd'
    if ($mailsuccess) include($nextpage); else include($faultpage);
    

} else {
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title>BEDRIJFSNAAM | Contactformulier Nederlands</title>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

  <!-- **** layout stylesheet **** -->
  <link rel="stylesheet" type="text/css" href="css/style/style.css" />

  <!-- **** colour scheme stylesheet **** -->
  <link rel="stylesheet" type="text/css" href="css/style/colour.css" />
</head>

<body>
  <div id="main">
    <div id="logo">
    </div>
    <div id="menu">
      <ul>
        <li><a href="index_nl3.php">Home</a></li>
        <li><a href="technischadvies.php">Technisch advies</a></li>
        <li><a id="selected" href="contact_nl.php">Contact</a></li>
        <li><a href="route.php">Route</a></li>
		</ul>
    </div>
    <div id="content">
      <div id="column1">
	    <?php include("include/vlag.php"); ?>
        <?php include("nieuws/laatste.php"); ?>
        <?php include("nieuws/archief.php"); ?>
        <?php include("nieuws/links.php"); ?>
        <?php include("nieuws/beursbericht.php"); ?>
      </div>
      <div id="column2">
                
        <div><p></p>
          <p><span class="left"><img src="images/LOGO.png" alt="Logo" width="193" height="107" /></span></p>
          <h2>BEDRIJFSNAAM BV</h2>
	          
        </div>
        <!-- **** INSERT PAGE CONTENT HERE **** -->
       
       <form name="form1" id="form1" method="post" action="">
		<table border=0 bordercolor=#ffffff>
 			<tr>
  				<td width="138"><span class="story">Bedrijfsnaam</span></td>
  				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="bedrijf" /></td>
 			</tr>
 			<tr>
   				<td><span class="story">Aanhef</span></td>
  				<td width="15">:</td>
  				<td><select name="aanhef">
                  <option value="Dhr.">De Heer</option>
                  <option value="Mevr.">Mevrouw</option>
                </select></td>
		  </tr>
			<tr>
  				<td><span class="story">Naam Contactpersoon</span></td>
  				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="naam" /></td>
 			</tr>
 			<tr>
  				<td><span class="story">Adres</span></td>
  				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="adres" /></td>
		 	</tr>
		 	<tr>
  				<td><span class="story">Postcode</span></td>
				<td width="15">:</td>
  				<td>
					<input type="text" maxlength="4" size="8" name="pc1" />
					<input type="text" maxlength="2" size="4" name="pc2" />				</td>
 			</tr>
 			<tr>
				<td><span class="story">Plaats</span></td>
				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="plaats" /></td>
 			</tr>
 			<tr>
  				<td><span class="story">Land</span></td>
				<td width="15">:</td>
  				<td> 
					<select name="land">
     				<?php
						include("include/inc.landen.php");
						foreach($countries as $land){
							echo "<option value=\"".$land."\">".$land."</option>\n";
						}
					?>
   					</select>				</td>
 			</tr>
 			<tr>
  				<td><span class="story">Telefoonnummer</span></td>
				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="telnr" /></td>
 			</tr>
 			<tr>
  				<td><span class="story">E-mail adres</span></td>
				<td width="15">:</td>
  				<td><input type="text" maxlength="50" size="45" name="email" /></td>
 			</tr>
 			<tr>
   				<td valign="top"><span class="story">A.u.b. neem contact</span></td>
  				<td width="15" valign="top">:</td> 
   				<td><input type="radio" name="contact" value="Via email" id="mail" checked /><span class="story"><label for="mail">via email<br>
</label>
			    </span><input type="radio" name="contact" value="Via telefoon" id="tel" /><span class="story"><label for="tel">via telefoon </label>
			    </span></td>
		   	</tr>
			<tr>
  				<td valign=top><span class="story">Opmerkingen</span></td>
				<td valign=top width="15">:</td>
 				<td><textarea name="opmerkingen" cols="47" rows="5"></textarea></td>
 			</tr>
 			<tr>
  				<td colspan="2"></td>
				<td>
                <!--google recaptcha toegevoegd door DV-->
                <div class="g-recaptcha" data-sitekey="XXXXXXXXX"></div>
                <script src='https://www.google.com/recaptcha/api.js?hl=nl'></script>
                    
					<input name="submit" type="submit" value="Verstuur">&nbsp;
					<input type="reset" value="Reset">				</td>
 			</tr>
		</table>
	  <br/>
 	</form>
          
        <blockquote>
        </blockquote>
      </div>
    </div>
    <div id="footer">
    </div>
  </div>

</body>
</html>

<?php
}
?>
 
PHP:
<?php
    mail($to,$subject,$message, $headers);
    echo "Test email sent";
?>
Misschien moet je maar niet zomaar gokken dat het gelukt is, maar controleren of het true/false is.
Voor hetzelde geldt triggert dit een error, die in de configuratie ingesteld is op: Laat geen errors zien.

Trouwens hoort 'from' je eigen mailadres te zijn. En vaak eentje die bij je webhosting bekend is.
Ik vermoed dat je hosting daar nu scherper op zal letten, en waardoor het nu dus fout gaat.
 
Laatst bewerkt:
Hoi @php4u, bedankt voor je snelle reactie. Fijn.
Ik begrijp dat het goed is om niet te gokken, maar ik meen juist dat er een check in staat. Klopt die niet?
Wat moet ik veranderen?
 
Ik zie geen controle met een if-je om je mail()-functie.
Ik zeg niet dat dit de oplossing is, maar het maakt je code wel robuuster.
Ik neem aan dat je weet hoe een if-je werkt?

het echte probleem zit hem in je from-header die je niet zelf mag laten verzinnen door iemand ;-)
 
Laatst bewerkt:
Ah zo ik snap het php4u, daar moet ik wel uitkomen.

Hostingbedrijf heeft ook bericht gestuurd, ze opperen dat het met nieuwe PHP7 versie te maken heeft...
 
Nog een aanvulling @php4u, de code uit het testmail.php is goed overigens want daarvan komt de mail wel aan.

Het gaat me echt om de uitgebreide code van het contactformulier. Die mail komt niet meer aan.
Bedoel je dat daar ook geen goede check in staat?
 
In je eerste test-scriptje gebruik je (vermoedelijk) het vaste mailadres (domein) die ook bij je hosting bekend is, klopt dat?

In je andere script, welke je in productie gebruikt, laat je de gebruiker de FROM zelf bepalen. Naast dat dit gevaarlijk is (header injection! == spam versturen door anderen), moet je dit ook vastzetten op jouw eigen mailadres. De enige header die aanpasbaar moet zijn is Reply-To, maar ook hier moet er ervoor zorgen dat hier enkel een mailadres ingevoerd wordt, welke je ook gecontroleerd hebt qua invoer.

Verder staat het feit dat het nu niet meer werkt los van PHP 7. Maar misschien is het PHP 7 platform bij je hosting zelf wat stricter ingesteld.

Dus:
- Bouw bij voorkeur een goede check in, en vermeld aan de gebruiker dat de mail verstuurd is, of in het andere geval dat deze juist niet verstuurd vanwege een technisch probleem bij jouw site met een nostalgisch linkje naar jouw e-maildres :p.
- Zet je FROM-header vast op jouw eigen mailadres, en laat de gebruiker Reply-To aanpassen, en valideer deze of het een mailadres is.
 
Laatst bewerkt:
Ik snap het, daar zal ik eerst aan gaan werken en misschien verhelpt dat het probleem. Kom ik nog wat tegen zal ik het hier vermelden.
Dank je! :D
 
Thanks. Hopelijk lukt het!
 
Hoi, ik heb regel 13 aangepast van
HTML:
    //$from = $_POST['email'];
naar
Code:
    $from = "info@bedrijfsnaam.nl";
en nu komt de mail verzonden met het contactform komt aan!

Nu de rest nog beter opmaken, maar met je hulp is het in ieder geval gelukt dus zet ik de vraag op opgelost :)
 
Ik neem aan dat je uiteindelijk wel je echte mailadres van je domein hebt ingevoerd? ;)
Fijn dat het nu werkt.
 
Dit is o.a. een verschil tussen smtp en mail(). Bij smtp zijn "from" (uit contactformulier) en "authenticatie" (bij host provider) gescheiden.
De kans dat de host provider het verzenden hiermee niet toelaat is een stuk kleiner maar toch zijn er host providers die zelfs dit niet toelaten :(
 
Laatst bewerkt:
@php4u natuurlijk ;-) Bij helpmij anonimiseer ik altijd code.

@bron dank je wel voor je bijdrage!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan