contactformulier keuze bestemming

Status
Niet open voor verdere reacties.

mariannevanh

Terugkerende gebruiker
Lid geworden
14 dec 2004
Berichten
2.085
In het verleden heb ik regelmatig pogingen ondernomen om PHP onder de knie te krijgen, maar steeds moest ik mijn pogingen staken, omdat ik het niet begreep.
Ik ben daar niet blij mee, maar een mens kan nu eenmaal niet alles...

Ik ben op zoek naar een contactformulier, waarbij via bijv. een dropdown-menu een geadresseerde wordt gekozen. Uiteraard is het e-mailadres van de te kiezen ontvangers niet zichtbaar, maar slechts een functie (secretaris, webmaster).
Ik voel dat ik niet opnieuw het wiel moet uitvinden. Een dergelijk formulier is vast wel ergens voorhanden, maar ik heb het nog niet gevonden.

Wie helpt?

Vriendelijke groet,
Guido
 
De mailadressen in een array bewaren, en aan je select-box koppelen met een nummer?

Voorbeeld nodig?
 
Laatst bewerkt:
Waar gaat mijn bestandje de mist in?

formulier.html:
Code:
<form name="form1" method="post" action="sendmail.php">
	  Naam: <br><input name="naam" type="text" value""><br>
	  E-mail: <br><input name="email" type="text" value=""><br>
	  Bericht voor:<br>
	 <SELECT NAME="voorwie">

	<OPTION>maak uw keuze</OPTION>
	<OPTION>secretaris</OPTION>
	<OPTION>webmaster</OPTION>
	</SELECT><br><br>
	  <textarea name="bericht" rows="14" cols="70"></textarea><br>
	  <input type="submit" name="Submit" value="Verzenden">
</form>

sendmail.php
Code:
<?php
// Breek regels af na 70 tekens
$bericht = wordwrap($bericht,70);

// verstuur
if ($voorwie = "secretaris" {
	$voorwiemail = "secretaris@domein.nl";
}
if ($voorwie = "webmaster" {
	$voorwiemail = "webmaster@domein.nl";
}

mail($voorwiemail,"Bericht vanaf de website",$naam,$email,$bericht);
?>

Dit geeft een error 500 op mijn website.

Vriendelijke groet,
Guido

P.S. Op mijn website staan uiteraard werkende e-mailadressen.
 
Laatst bewerkt:
Op lijn 6 van je PHP-script mist een sluit-haakje. Verder mis ik een value-attribute bij je option-tags.
En verder klopt je mail() niet. De opbouw is als syntax als volgt:
bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
En jij gebruikt $email als 4e parameter en $bericht als 5e parameter. Dat klopt niet!
Hoe kom je eigenlijk aan deze opbouw?

PS: Ik zelf raad phpMailer aan!
 
Laatst bewerkt:
Dankjewel PHP4U.
Ik heb twee testberichten verzonden (een naar de secretaris en naar de webmaster).
Beide berichten hebben in mijn mailprogramma als afzender mijn username van mijn webhostingpakket en worden beide afgeleverd in het e-mailaccount dat de webhoster van ons heeft.
Ook bevatten beide mails geen mailbody.

sendmail.php ziet nu zo uit:
Code:
<?php
// Breek regels af na 70 tekens
$bericht = wordwrap($bericht,70);

// verstuur
if ($voorwie = "secretaris") {
	$voorwiemail = "secretaris@domein.nl";
}
if ($voorwie = "webmaster") {
	$voorwiemail = "webmaster@domein.nl";
}

mail($voorwiemail,"Bericht vanaf de website",$bericht,$naam,$email);
?>

De opbouw van het mail vond ik op https://www.w3schools.com/php/func_mail_mail.asp, maar paste ik verkeerd toe.

Wat zit hier fout?
Wat is het voordeel van phpMailer en hoe gebruik ik het?

Vriendelijke groet,
Guido
 
Je mail-functie klopt nog steeds niet. En op de site van phpMailer staan ook voorbeelden.
 
Laatst bewerkt:
Vóór het mail-commando heb ik nu ingevoegd:
Code:
$headers = "From" . $naam . "\r\n" . " <" . $email . ">";

Het mailcommando heb ik gewijzigd in:
Code:
mail($voorwiemail,"Bericht vanaf de website",$bericht,$headers);

Het resultaat is nu dat ik een mail krijg met deze inhoud:
Code:
From
 <>

Het onderwerp is wel overgenomen, maar ik zie geen berichtinhoud. Waar zit de fout?

Vriendelijke groet,
Guido
 
Als ik zo lees geef je hier verkeerde code op, vermoed ik. Ik denk dat je jouw headers op de 3e plaats zet, i.p.v. de vierde die daarvoor zijn bedoeld.
 
Als ik zo lees geef je hier verkeerde code op, vermoed ik. Ik denk dat je jouw headers op de 3e plaats zet, i.p.v. de vierde die daarvoor zijn bedoeld.

Nee, want in
Code:
mail($voorwiemail,"Bericht vanaf de website",$bericht,$headers);
is de variabele $subject vervangen door een harde tekst. $headers staat dus wel degelijk op de vierde plaats.

Omdat ik ook nog een andere verfraaiing in m'n script wilde aanbrengen heb ik het over een andere boeg gegooid. Het script lijkt nu naar behoren te werken.

Bedankt voor alle hulp!

Vriendelijke groet,
Guido
 
Laatst bewerkt:
Nee, het werkt nog niet naar behoren. Welke persoon ik ook kies als geadresseerde, het berichtje wordt afgeleverd bij de tweede persoon.
Wat is er mis?

form.html
Code:
<form name="contactform" method="post" action="sendmail.php">
<table width="450px">
<tr>
 <td valign="top">
  <label for="naam">Bericht voor: *</label>
 </td>
 <td valign="top">
	<SELECT NAME="voorwie">
		<OPTION>Maak uw keuze</OPTION>
		<OPTION>secretaris</OPTION>
		<OPTION>webmaster</OPTION>
	</SELECT><br><br>
 </td>
</tr>
<tr>
 <td valign="top">
  <label for="naam">Naam *</label>
 </td>
 <td valign="top">
  <input type="text" name="naam" maxlength="50" size="30">
 </td>
</tr>
<tr>
 <td valign="top">
  <label for="email">E-mailadres *</label>
 </td>
 <td valign="top">
  <input  type="text" name="email" maxlength="80" size="30">
 </td>
</tr>
<tr>
 <td valign="top">
  <label for="comments">Uw bericht *</label>
 </td>
 <td valign="top">
  <textarea  name="comments" maxlength="1000" cols="25" rows="6"></textarea>
 </td>
</tr>
<tr>
 <td colspan="2" style="text-align:center">
  <input type="submit" value="Verstuur">
 </td>
</tr>
</table>
</form>

sendmail.php
Code:
<?php
if(isset($_POST['email'])) {
 
if ($voorwie = "secretaris") {
	$voorwiemail = "secretaris@domein.nl";
}
if ($voorwie = "webmaster") {
	$voorwiemail = "webmaster@domein.nl";
}

    $email_to = $voorwiemail;
    $email_subject = "Bericht van de website";
 
    function died($error) {
        // your error code can go here
        echo "Sorry, er is een fout opgetreden.";
        echo $error."<br /><br />";
        echo "Ga terug en herstel deze fouten.<br /><br />";
        die();
    }
 
 
    // validation expected data exists
    if(!isset($_POST['naam']) ||
        !isset($_POST['email']) ||
        !isset($_POST['comments'])) {
        died('Sorry, er is een fout opgetreden.');       
    }
 
    $naam = $_POST['naam']; // required
    $email_from = $_POST['email']; // required
    $comments = $_POST['comments']; // required
 
    $error_message = "";
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
 
  if(!preg_match($email_exp,$email_from)) {
    $error_message .= 'Het ingevoerde e-mailadres lijkt ongeldig.<br />';
  }
 
    $string_exp = "/^[A-Za-z .'-]+$/";
 
  if(!preg_match($string_exp,$naam)) {
    $error_message .= 'Er is een ongeldige naam ingevoerd';
  }
 
  if(strlen($comments) < 2) {
    $error_message .= 'De ingevoerde opmarking lijkt ongeldig te zijn.<br />';
  }
 
  if(strlen($error_message) > 0) {
    died($error_message);
  }
 
    $email_message = "Details van het ingestuurde bericht.\n\n";
 
     
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
 
    $email_message .= "Naam: ".clean_string($naam)."\n";
    $email_message .= "Email: ".clean_string($email_from)."\n";
    $email_message .= "Bericht: ".clean_string($comments)."\n";
 
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);  
?>
 
<!-- include your own success html here -->
 
Bedankt voor uw bericht. We nemen zo spoedig mogelijk contact met u op.
 
<?php
 
}
?>

Omdat ik eerst niet ontdekte dat mails aan beide geadresseerden op het zelfde e-mailadres werd bezorgd, was ik al begonnen met het toepassen van deze testopstelling in de echte website. Tot mijn stomme verbazing gebeurde er daar helemaal niets (zichtbaar voor mij).

Wat zit er fout in deze bestanden?

Vriendelijke groet,
Guido
 
Waar komt $voorwie vandaan?
Verder heeft een vergelijking een dubbele 'is': ==
Ook mist er een value in je option-tag.

- Los daarvan is die() een verkeerd gebruik in je script. Waarom moet je script keihard stoppen als er een fout is?

- Ook moet je foutmeldingen nooit onderdrukken met @, en is een foutafhandeling op mail() zeker aan te raden.

- Bij voorkeur raad ik phpMailer aan die alle standaarden volgt i.p.v. dat je die zelf in de headers staat te benoemen.

- Ook je reguliere expressie is overbodig. Iemand met pietje@testsite.amsterdam kan zich niet aanmelden. Gebruik liever https://php.net/filter_var om op mailadressen te controleren.
 
Laatst bewerkt:
PHP4U, dankjewel voor je terugkoppeling. Graag wil ik me eerst concentreren op een werkend script.

In form.html op de regels 5 en 18 zag ik opeens:
Code:
for = "naam"
Regel 5 heb ik gewijzigd in
Code:
for = "msgvoor"

Waar komt $voorwie vandaan?
Dat stond op regel 8, maar dat had "naam" moeten zijn en is dus nu gewijzigd (zie alinea hiervoor) in "voorwie"

Verder heeft een vergelijking een dubbele 'is': ==

Aangepast

Ook mist er een value in je option-tag.

Aangepast.

Los daarvan is die() een verkeerd gebruik in je script. Waarom moet je script keihard stoppen als er een fout is?

Ook moet je foutmeldingen nooit onderdrukken met @, en is een foutafhandeling op mail() zeker aan te raden.
Ook je reguliere expressie is overbodig. Iemand met pietje@testsite.amsterdam kan zich niet aanmelden. Gebruik liever https://php.net/filter_var om op mailadressen te controleren.

Deze aanbevelingen pak ik later op.

Bij voorkeur raad ik phpMailer aan die alle standaarden volgt i.p.v. dat je die zelf in de headers staat te benoemen.

Ik vraag me of af ik op mijn shared webhosting-account kan installeren.

Je aanbevelingen zijn me zeker waard om er naar te kijken. Dat doe ik als het script correct werkt.

Vriendelijke groet,
Guido
 
phpMailer werkt prima op een Shared hosting. Anders had ik het niet zomaar aanbevolen. ;).
Ik neem aan dat je weet wat dat option's uit HTML onderdeel zijn van een formulier, en dat je waardes uit een formulier met $_POST['veldnaam'] moet ophalen?
Vroeger, en dan bedoel ik hééééél vroeger, toen kon dat gewoon met $veldnaam. Maar dat kan al sinds PHP 4.2.0 al niet meer. ;)
 
Ik heb phpmailer op mijn webhosting geïnstalleerd, maar weet niet wat ik moet doen om e.e.a. verder te configureren en te gebruiken voor dit formulier.
Wie kan mij op weg helpen?

Vriendelijke groet,
Guido
 
Ik heb sendmailpreset.php aangemaakt in de directory van het contactformulier:
Code:
<?php
require '../phpmailer/PHPMailerAutoload.php';

$mail = new PHPMailer;
$mail->isSMTP();
$mail->Host = "mail.axc.nl";
$mail->Port = 587;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "ssl";
$mail->Username = "guido@domein.nl";
$mail->Password = "geheim";
$mail->setFrom('guido@domein', 'Guido');
$mail->Subject = 'Mailformulier vanaf de website';
if (isset($_POST['submit'])) {
	if(empty($_POST['naam'])
    or empty($_POST['email'])
    or empty($_POST['bericht'])) {
        echo "Er is een fout opgetreden"
    	// foutafhandeling toevoegen
		}
	$mail->addAddress($_POST['email'], $_POST['naam']);
	$mail->Body = $_POST['bericht'];
	if (!$mail->send()) {
		echo "Mailer Error: " . $mail->ErrorInfo;
	} else {
    	echo "Message sent!";
    }
}
?>

Deze sendmailpreset.php in combinatie met de eerder gebruikte sendmail.php schuren ergens nog met elkaar.
Hoe combineer ik deze bestanden met elkaar?

Vriendelijke groet,
Guido
 
Hoe bedoel je, de eerder gebruikte sendmail.php?

PHPmailer is een vervanger van mail().
 
Je moet die example van PHPmailer op die pagina integreren in plaats van de huidige mail-functie van PHP die je daarin gebruikt.
Logisch kijken en het lukt vast wel. Het is niet zo heel lastig, en makkerlijk dan je denkt.

Probeer het maar, en als het niet lukt, laat dan maar eens zien wat je hebt, en waar je op vast loopt.
 
Om de verzending aan de praat te krijgen doe ik eerst een stap terug door gewoon een basic berichtje te kunnen versturen. Het lijkt te lukken, want steeds als ik test.php in de browser aanroep, krijg ik twee seconden later een mail. Het valt me wel op dat tekstuele wijzigingen in subject, body of de terugmelding van met succes verzonden bericht NIET terug zie. De ontvangen e-mails en terugmeldingen zijn allemaal aan elkaar gelijk. Wat doe ik hier fout?

Mijn code tot nu toe:

Code:
<?php
require '../phpmailer/PHPMailerAutoload.php';
$mail = new PHPMailer;

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = 'mail.axc.nl';                          // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = 'guido@domein.nl';              // SMTP username
$mail->Password = 'geheim';                         // SMTP password
$mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587;                                    // TCP port to connect to

$mail->setFrom('guido@domein.nl', 'Guido');
$mail->addAddress('vriend@domein.nl', 'Vriend');
$mail->Subject  = 'First PHPMailer Message';
$mail->Body     = 'testbericht';
if(!$mail->send()) {
  echo 'Bericht is NIET verzonden.';
  echo 'Mailer error: ' . $mail->ErrorInfo;
} else {
  echo 'Bericht is met succes verzonden.';
}
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan