Email script

Status
Niet open voor verdere reacties.
Net even geprobeerd.

Bestand "contactform.zip" hierboven aangeklikt
Gekozen voor "Opslaan als", ... bureaublad
Naar bureaublad: met rechts op zip geklikt, gekozen voor "uitpakken in contactform"
Alle bestanden kan ik met Notepad++ openen.

Wijzgen, dan opslaan, dan sluiten en weer openen gaat goed. Wijzigingen staan er in.

Kleine aanpassing omdat iedere browser om veiligheidsredenen niet het pad naar het bestand kan onthouden als één of meer velden niet zijn ingevuld. In de bijlage de versie met deze aanpassing (in bestand verzend.php)
 

Bijlagen

  • contactform2.zip
    63,8 KB · Weergaven: 52
Laatst bewerkt:
Je vraag in deze PHP categorie gaat over een PHP script, niet over een compleet html/css/php formulier met maatwerk en alle toeters en bellen. Je html en css vragen kun je kwijt in respectievelijk de html en/of de css categorie.
Wat betreft het verwijderen van de verplichting bij de bijlage, haal hiervoor dit weg.
Code:
if (empty($_POST["file"])) {
  $err .= "The file is required.<br>";
  $err_file = $err_css;
}else{
  if ($err != '') {
    $err .= "Sorry, you have to enter the file again.<br>";
    $err_file = $err_css;
  }else{
    $file = $_POST['file'];
  }
}

Voor de afhandeling van bestand uploads is de PHP normaliter uitgebreider en hoort eigenlijk $_FILES["file"]["....."] gebruikt te worden met een goede error afhandeling. Dit ook in verband met security tussen server en client. De methode die in dit script is gebruikt heeft beperkingen.

Voor het maken van een compleet formulier (maatwerk frontend/backend) gaat de kostenteller lopen en dat hoort niet in deze categorie denk ik (misschien wel in de commerciele categorie "personeel gezocht").

Andere Helpmij'ers kunnen je vast en zeker bij de html/css helpen. Deze horen bij de client, niet bij de server zoals php.
 
Laatst bewerkt:
Je hebt het php script en je hebt de html/css pagina.
Deze kun je in elkaar schuiven zoals is gedaan in index.php (zie contactform2.zip‎). Zelf doen dus.
 
De afzender (en ook reply-to en cc) kun je meegeven in $headers
Code:
mail($to, $subject, $message, $headers);
In $headers kun je ook opgeven dat het een html/text mail is zodat je html kan versturen.
Even googelen voor php voorbeelden.

-aanvulling
als het alleen om een afzender gaat kun je ook dit doen
Code:
$params = '-f' . 'afzender@example.nl';
mail($to, $subject, $message, null, $params);
Suc6.
 
Laatst bewerkt:
Ja dat is precies wat ik heb geprobeerd maar de headers werken gewoon niet meer sinds een update van php?

en in mail() -f en dan email toevoegen werkt wel, maar ik wil graag dat als iemand mijn formulier invult op de site dat zijn email adres daar komt te staan maar hoe doe je dat dan?

#3 die ik ben vergeten = hoe krijg ik mijn hele contact form in het midden van de pagina met css?
 
RE: headers werken gewoon niet meer sinds een update van php
Even opnemen met je provider denk ik....

RE: ik wil graag dat als iemand mijn formulier invult op de site dat zijn email adres daar komt
In $headers (zie #27) heb je de meeste mogelijkheden

RE: contact form in het midden van de pagina
Dit kan bijvoorbeeld met margin-left: auto; margin-right: auto;

Voorbeeld met $headers
Code:
$eol = '\r\n';
$to  = 'naam@example.nl';
$subject  = 'Contactformulier';
$message  = '<html><body>';
$message .= '<h1>Hallo allemaal</h1>';
$message .= '</body></html>';
$headers  = 'From: ' . strip_tags($_POST['email']) . $eol;
$headers .= 'Reply-To: ' . strip_tags($_POST['email']) . $eol;
$headers .= 'CC: iemand@example.nl' . $eol;
$headers .= 'MIME-Version: 1.0' . $eol;
$headers .= 'Content-Type: text/html; charset=ISO-8859-1' . $eol;
mail($to, $subject, $message, $headers);
 
HTML:
.top {
	float: left;
	width: 95.5%;
	padding: 13px 14px 13px 35px;
	background-color: #2F5388;
	color: #FFF;
	font-size: 15px;
	font-family: "Segoe UI Bold";
	line-height: 10px;
	border: 1px solid #2B4A7B;
	border-radius: 5px 5px 0px 0px;
	box-shadow: 2px 2px 5px #1D1E23;
}
.bottom {
	float: left;
	width: 95.5%;
	background-color: #FFF;
	padding: 30px 15px 30px 35px;
	margin-bottom: 20px;
	border: 1px solid #2B4A7B;
	border-radius: 0px 0px 5px 5px;
	box-shadow: 2px 2px 5px #1D1E23;
}
	#form {
		margin: 0 auto 0 auto;
	}
		#form .row {
			display: block;
			overflow: auto;
			margin-top: 10px;
		}
		#form .row .label {
			float: left;
			width: 100px;
			text-align: right;
			line-height: 28px;
			padding-right: 10px;
			margin-right: 10px;
		}
			.name, .email {
				outline: none;
				float: left;
				color: #2B4A7B;
				height: 20px;
				width: 250px;
				padding: 3px 10px 3px 10px;
				background: #FFFFFF;
				border: 1px solid #2B4A7B;
				border-radius: 5px;
				-moz-border-radius: 5px;
				-webkit-border-radius: 5px;
			}
			textarea {
				outline: none;
				float: left;
				color: #2B4A7B;
				width: 400px;
				max-width: 400px;
				height: 150px;
				max-height: 150px;
				padding: 7px 10px 7px 10px;
				border: 1px solid #2B4A7B;
				border-radius: 5px;
				-moz-border-radius: 5px;
				-webkit-border-radius: 5px;
			}
			#context {
				float: left;
				font-size: 10px;
				font-family: 'Segoe UI Light';
				line-height: 25px;
				margin-left: 0px;
			}
			input:hover, textarea:hover {
				border: 1px solid #A4CAF3;
			}
			input:focus, textarea:focus {
				color: #A4CAF3;
				background: #2F5388;
				-webkit-box-shadow: inset 2px 2px 7px 0px rgba(29,30,35,0.35);
				-moz-box-shadow: inset 2px 2px 7px 0px rgba(29,30,35,0.35);
				box-shadow: inset 2px 2px 7px 0px rgba(29,30,35,0.35);
			}
			::-webkit-input-placeholder {
			   color: #2F5388;
			}
			:-moz-placeholder { /* Firefox 18- */
			   color: #2F5388;  
			}
			::-moz-placeholder {  /* Firefox 19+ */
			   color: #2F5388;  
			}
			:-ms-input-placeholder {  
			   color: #2F5388;  
			}
			input[type=submit] {
				float: left;
				outline: none;
				font-family: 'Segoe UI Bold';
				color: #2B4A7B;
				background-color: #FFFFFF;
				margin: 10px 0 0 120px;
				padding: 6px 15px;
				border: 1px solid #2B4A7B;
				border-radius: 5px;
				-moz-border-radius: 5px;
				-webkit-border-radius: 5px;
				cursor: pointer;
			}
			input[type=submit]:hover {
				color: #A4CAF3;
				background-color: #2B4A7B;
			}

margin left en right werkt niet, heb al van alles geprobeerd.

De headers werken nu, maar alleen niet met jouw voorbeeld.
Zit nu wel met een ander probleem: hoe zorg ik dat mijn mail niet in de junkfolder komt tet staan?

Dit gebruik ik nu:
PHP:
		$to = "The Resistance <mijnemail@outlook.com> \r\n";
		$subject = "Contactformulier website";
		$headers  = "From: $_POST[name] <$_POST[email]> \r\n";
		$headers .= "X-Mailer: PHP" . phpversion();
		$headers .= "MIME-Version: 1.0" . "\r\n";
		$headers .= "Content-Type: text/html; charset=iso-8859-1" . "\r\n";
		$body = "<b>$_POST[name]</b> ($_POST[email])
				<br><br>$_POST[message]";

		mail ($to, $subject, $body, $headers);
 
Laatst bewerkt:
Kan je het even in een 'JSfiddle' plaatsen? Dat kijkt even wat gemakkelijker.
 
RE: hoe zorg ik dat mijn mail niet in de junkfolder komt tet staan

Lastig. Een spamfilter is een optelsom van diverse criteria in de content (teksten, plaatjes, linkjes, enz.), de structuur en de header. Stel je hebt 8 woorden en 10 linkjes in je email, dan heb je een grote kans dat de email als spam wordt aangemerkt. Er is leesvoer over spam. De heer G. kan je daarbij helpen.

Code:
.top {
  .....
  text-align: center;
}
.bottom {
  .....
  text-align: center;
}
#form {
  width: 70%;  /* margin auto werkt als width is opgegeven */
  margin: 0 auto;
}

<content> bestaat niet. Gebruik hier <section> of <div> (of eventueel <main>)

Sec6


*** aanvulling.

Dit is een lijst met criteria waar een spamfilter (in dit geval SpamAssassin) naar kijkt. Zoals je ziet is het een grote hoeveelheid die wordt beoordeeld.

Belangrijk: het From mailadres moet een bestaand emailadres zijn op het domein waarvan je de mail verstuurt, anders is het sowieso spam!

Hieronder is je script iets aangepast.
Code:
$to = "The Resistance <mijnemail@outlook.com>";
$subject = "Contactformulier website";

$headers  = "From: " . $_POST[name] . " <" . $_POST[email] . ">" . "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
$headers .= "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1" . "\r\n";

$body  = "<strong>" . $_POST[name] . "</strong> (" . $_POST[email] . ")";
$body .= "<br><br>" . $_POST[message] . "<br>";

mail ($to, $subject, $body, $headers);
 
Laatst bewerkt:
Super bedankt! het werkt nu, alles staat netjes in het midden, het mail script werkt, alleen dat junkfoldertje wilt nog niet lukken, erg jammer natuurlijk!
Wel raar want wat is het verschil tussen een verzonnen email en een echte bestaande van je provider, welke extra data zal er worden meegestuurd..
want dit werkt dan weer wel -rmijnemail.outlook.com); op de mail regel.

waar zie jij <content> staan?
 
Laatst bewerkt:
gebruik $_POST['name'] etc.. met single-quotes etc......

Verder is je script zeer gevoelig voor mailheader-injection. Persoonlijk zou ik om deze reden al overstappen op phpMailer.
 
RE: wat is het verschil tussen een verzonnen email en een echte bestaande van je provider
Het "onbedoeld gebruik" en "misbruik" staan hier centraal.

RE: waar zie jij <content> staan
In de jsfiddle staat <content class="bottom">

@php4u
Helemaal mee eens, en smtp is ook betrouwbaarder. Neemt niet weg dat je ook hier emails mee kan versturen die als spam worden aangemerkt.

** aanvulling

Code:
// variabelen
$to = "The Resistance <mijnemail@outlook.com>";
$subject = "Contactformulier website";
$name = trim($_POST['name']);
$email = trim($_POST['email']);
$message = trim($_POST['message']);

// minimale security
$name = str_ireplace(array("\r","\n","%0a","%0d","Content-Type:","bcc:","to:","cc:"), "", $name );
$validmail = filter_var($email, FILTER_VALIDATE_EMAIL); // vanaf PHP 5.2
$message = str_replace("\n.", "\n..", $message);

// headers
$headers  = "From: " . $name . " <" . $email . ">" . "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
$headers .= "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-Type: text/html; charset=iso-8859-1" . "\r\n";

// html
$body  = "<strong>" . $name . "</strong> (" . $email . ")";
$body .= "<br><br>" . $message . "<br>";

// versturen
if ($validmail !== false) {
  mail ($to, $subject, $body, $headers);
}
Dit geeft een minimum aan beveiliging.
 
Laatst bewerkt:
Ah dank je, ik zie dat ik op de hele site overal header heb staan en daaronder content, dit is vervangen naar header + div.

Ik heb je nieuwe script getest en die komt ook nog aan als spam.
Gister nacht heb ik dit ervan weten te maken en ik ben er blij mij zoals die nu werkt op 1 ding na, daarover zo meer. Alleen ik zie dat je de code aan het verbeteren bent dus ik post mijn hele script even, misschien dat je hem zo kan verbeteren voor mij?

PHP:
<?php
	ini_set( 'display_errors', 1 );
	error_reporting( E_ALL );

if (isset($_POST['submit']))
{
	if (empty($_POST['name']) OR empty($_POST['email']) OR empty($_POST['message']))
	{
		echo '<html>
				<head>
					<link rel="stylesheet" type="text/css" href="../css/normal.css" />
				</head>
				<body>
					<header class="top">
						<center>Contact form</center>
					</header>
					<div class="bottom">
						<center>Are you sure you have filled in all empty fields?
						<br><br>Click the link below to go back and try again.
						<br><br><br>
						<a class="link" href="javascript:history.go(-1)">Previous page</a></center>
					</div>
				</body>
			</html>';
	}
	elseif(!preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$^i",$_POST['email']))
	{
		echo '<html>
				<head>
					<link rel="stylesheet" type="text/css" href="../css/normal.css" />
				</head>
				<body>
					<header class="top">
						<center>Contact form</center>
					</header>
					<div class="bottom">
						<center>Please enter a valid email address.
						<br><br>Click the link below to go back and try again.
						<br><br><br>
						<a class="link" href="javascript:history.go(-1)">Previous page</a></center>
					</div>
				</body>
			</html>';
	}
	else
	{
		$to = "mijnnaam<mijnemail@outlook.com>";
		$subject = "Contactformulier website";

		$headers  = "From: The Resistance <rebel@the-resistance.tk>" . "\r\n";
		$headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
		$headers .= "MIME-Version: 1.0" . "\r\n";
		$headers .= "Content-Type: text/html; charset=iso-8859-1" . "\r\n";

		$body  = '<img src="http://www.theresistance.heliohost.org/images/banner.gif"><br><br>';
		$body .= "<strong>" . $_POST['name'] . "</strong> (" . $_POST['email'] . ")";
		$body .= "<br><br>" . $_POST['message'] . "<br>";

		mail ($to, $subject, $body, $headers);

		echo '<html>
				<head>
					<link rel="stylesheet" type="text/css" href="../css/normal.css" />
					<meta http-equiv="refresh" content="3;url=index.php" />
				</head>
				<body>
					<header class="top">
						<center>Contact form</center>
					</header>
					<div class="bottom">
						<center>Thank you.
						<br>Your message has been received!</center>
					</div>
				</body>
			</html>';
	}
}
?>

Het enigste probleem is nu dat die image (banner) gemarkeerd is als onveilig en is geblokkeerd. Maar hij komt zo wel aan in postvak in.

Vraag: waarom doe je steeds $body. om html toe te voegen? 'en de code hier' werkt ook voor mij.
 
Laatst bewerkt:
Hi,

De code gereorganiseerd en dingen toegevoegd.
Code:
<?php
ini_set( 'display_errors', 1 );
error_reporting( E_ALL );
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Contact</title>
<link rel="stylesheet" href="../css/normal.css" />
<meta http-equiv="refresh" content="3;url=index.php" />
</head>
<body>
<header class="top">
<center>Contact form</center>
</header>
<div class="bottom">
<?php
if (isset($_POST['submit']))
{
   if (empty($_POST['name']) OR empty($_POST['email']) OR empty($_POST['message']))
   {
      echo 'Are you sure you have filled in all empty fields?
      <br /><br />Click the link below to go back and try again.
      <br /><br /><br />
      <a class="link" href="javascript:history.go(-1)">Previous page</a>';
   }
   elseif(!preg_match("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$^i",$_POST['email']))
   {
      echo 'Please enter a valid email address.
      <br /><br />Click the link below to go back and try again.
      <br /><br /><br />
      <a class="link" href="javascript:history.go(-1)">Previous page</a>';
   }
   else
   {
      $to = "Mijn Naam <mijnemail@outlook.com>";
      $subject = "Contactformulier website";
      $name = $_POST['name'];
      $email = $_POST['email'];
      $message = $_POST['message'];
      $name = str_ireplace(array("\r","\n","%0a","%0d","Content-Type:","bcc:","to:","cc:"), "", $name );
      $message = str_replace("\n.", "\n..", $message);
      $headers  = "From: The Resistance <rebel@the-resistance.tk>" . "\r\n";
      $headers .= "X-Mailer: PHP/" . phpversion() . "\r\n";
      $headers .= "MIME-Version: 1.0" . "\r\n";
      $headers .= "Content-Type: text/html; charset=iso-8859-1" . "\r\n";
      $body  = '<img src="http://www.theresistance.heliohost.org/images/banner.gif" alt="" />';
      $body .= '<br><br><strong>' . $name . '</strong> (' . $email . ')';
      $body .= '<br><br>' . $message . '<br>';
      mail ($to, $subject, $body, $headers);
      echo 'Thank you.
      <br />Your message has been received!';
   }
}
?>
</div>
</body>
</html>
<?php ?>

RE: nieuwe script getest en die komt ook nog aan als spam.
Dit kan door veel dingen veroorzaakt worden. Zie "Dit is een lijst" bij #33)

RE: image (banner) gemarkeerd als onveilig en is geblokkeerd
Werk je met Microsoft Outlook?
Komt de afbeelding van een ander domein als de email?

RE: waarom doe je steeds $body.
Je mag elke naam kiezen die je wilt. Het is in php de naam van een variabele. Je kunt dus overal $body veranderen in $html als je wilt. De reden dat $body is gebruikt komt omdat een email uit een header (bericht info) en een body (het bericht zelf) bestaat. Vandaar dat deze namen zijn overgenomen.

Suc6.
 
Als ik deze pagina open in een php include, wat ik dus doe dan zijn al die html en heads overbodig. w3c validatie zegt dat namelijk. En alle <br> moeten <br /) zijn zegt die.

Mijn script komt niet meer aan als spam nu.
Aleeen die image (banner) wordt gemarkeerd als onveilig en geblokkeerd. Snap niet waarom.
Ik werk met outlook (via mijn browser, op het web inloggen dus)
Nee banner staat op de site.

En ik bedoelde met body, waarom doe ze steeds onder elkaar. je kan ze toch ook gewoon zo doen:
$body = '<img src="http://www.theresistance.heliohost.org/images/logo.gif" alt="Logo" /><br />
<br /><strong>' . $name . '</strong> (' . $email . ')
<br /><br />' . $message . '<br />';
Gewoon aan 1 stuk door?

Edit: Waarom staat dit er tussen, wat doet het, kun je het even uitleggen zodat ik het goed begrijp.

$name = str_ireplace(array("\r","\n","%0a","%0d","Content-Type:","bcc:","to:","cc:"), "", $name );
$message = str_replace("\n.", "\n..", $message);
 
Laatst bewerkt:
RE: dan zijn al die html en heads overbodig
Er moet altijd 1x een doctype, html, head, body en title (en liefst ook een charset) in je pagina staan (niet meer, niet minder). Waarschijnlijk heb je ergens anders deze al staan maar dat kan ik niet raden :)

RE: alle <br> moeten <br /) zijn
Dit hangt af van je doctype. In html <br> en in xhtml <br /> Dit geldt trouwens voor alle tags zonder eindtag, bijvoorbeeld <img .... /> of <meta .... /> Noot: de '/' wordt probleemloos door alle browsers geaccepteerd, ongeacht de doctype.

RE: Ik werk met outlook
Deze gebruik ik niet maar misschien kun je in de settings een vinkje vinden die online afbeeldingen blokkeert (zo'n vinkje zit namelijk wel in Office Outlook).

RE: ik bedoelde met body, waarom doe ze steeds onder elkaar
Slecht leesbare code is de valkuil voor iedere programmeur. Daarom breek ik persoonlijk liever de regels bij <br />. Voor de werking maakt het niets uit maar voor de leesbaarheid wel. Je kunt bij wijze van spreken alle html en php van de gehele pagina achter elkaar zetten en dan werkt het ook, maar voor onderhoud is het niet echt handig meer.

Suc6. Have fun.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan