login  Naam:   Wachtwoord: 
Registreer je!
 Forum

aanpassing contactform + bedankmail (Opgelost)

Offline Gust - 29/05/2014 21:33
Avatar van GustMySQL interesse Op deze pagina staat er een pracht van een contactform waarbij je kunt kiezen naar wie je iets stuurt.

Nu is het zo dat iedere ontvanger dezelfde email krijgt.

Nu probeer ik uit te zoeken, hoe de ontvanger een persoonlijke aanhef kan krijgen, maar tot nu toe wilt het niet lukken.

Ik vermoedt dat dit in regel 88 - 89 - 90 moet. Maar als ik dit probeer met $c['naam'] dan krijgt de ontvanger niets te zien.

Iemand enig idee hoe dit wel zou moeten lukken?

9 antwoorden

Gesponsorde links
Offline Thomas - 29/05/2014 22:53
Avatar van Thomas Moderator Zoals ik het begrijp, verstuurt dit script twee e-mailberichten (als de bedank-mail aan staat):
- één bericht gaat naar de contactpersoon van de website (dit is het primaire doel van het contact-formulier, een bericht sturen aan een medewerker van de website)
- één bericht gaat terug naar de afzender (de bedank e-mail, mede ter bevestiging dat het versturen van de contact gegevens is gelukt)

Is het je bedoeling om het eerste bericht te personificeren? Dit lijkt mij vreemd? Of gebruik je het contactformulier om berichten uit te wisselen aan verschillende gebruikers van een site? Als ik ergens personificatie zou gebruiken (in de oorspronkelijke opzet van het script) zou ik dit in de bedankmail doen. Dit zou je kunnen bereiken door een aanhef-veld (voor de afzender dus) op te nemen in het contactformulier.

Dit script is wel enigszins gedateerd, het is bijna 10 jaar oud lol. Zoals (waarschijnlijk) terecht wordt opgemerkt in de reacties op dit script is deze vatbaar voor MIME header-injectie. Vrij vertaald betekent dit dat dit contactformulier misbruikt zo kunnen worden voor het versturen van spam. Los hiervan zit er ook geen andere antispam-beveiliging in zoals een CAPTCHA of een timeout op IP-adres of wat dan ook.

Je hebt eigenlijk de headers helemaal niet nodig - de e-mailberichten zelf zijn plaintext, en de afzendgegevens zou je op kunnen nemen in het bericht zelf. Het is alleen een gemaksding, je kunt rechtstreeks reageren op e-mails. Ook zou ik er niet voor kiezen om e-mailadressen bekend te maken op een website, deze worden ook gecrawled door bots en binnen de kortste keren ontvang je hier spam op... Los van security zitten er in dit script dus ook een aantal zaken die niet praktisch zijn.

Het is mijn ervaring dat geen twee contactformulieren hetzelfde zijn. Het lijkt mij dus makkelijker om bij het eind (je doel) te beginnen. Wat wil je met jouw contactformulier doen? Wie moet er mail ontvangen? Is dit een plaintext mail, of HTML (met huisstijl en logo?) of allebei?
Offline Gust - 29/05/2014 23:40
Avatar van Gust MySQL interesse Mijn einddoel is de volgende: het moet dienen voor een psychologenpraktijk, bestaande uit meerdere psychologen, bestaande uit Mr x, Mr y en Mr z. Een client moet kunnen mailen naar zijn favoriete psycholoog. Die krijgen een persoonlijke html mail

Als de client naar Mr x mailt, dan moet Mr x een mail als volgt krijgen: "Beste Mr X, bla bla bla"
Als de client naar Mr x mailt, dan moet Mr y een mail als volgt krijgen: "Beste Mr Y, bla bla bla"
Als de client naar Mr x mailt, dan moet Mr z een mail als volgt krijgen: "Beste Mr Z, bla bla bla"

De bedankmail moet uiteraard blijven (in html). Hier is het mij wel gelukt om de persoonlijke naam van de verzender erbij te krijgen. Waarom mij dit niet lukt bij de emails naar de ontvangers is me niet duidelijk.
Offline Thomas - 30/05/2014 15:55
Avatar van Thomas Moderator In de huidige vorm bevat het contactformulier enkel plaintext e-mail. Als je een HTML-variant wilt, zul je een MIME-mailbericht moeten bouwen. Je hebt dan extra headers nodig. Om output te escapen (te ontdoen van speciale betekenis) binnen deze HTML-mail dien je ook aan te geven met welke karakterset (of karakter-encodering, zo je wilt) je werkt. Je zult ook een karakterset moeten specificeren voor het bouwen van de HTML-variant zelf, bij voorkeur dezelfde als die je in je contactformulier-pagina gebruikt. Wil je dus een uitgebreide variant (met HTML) of enkel een plaintext bericht?

Wil je deze functionaliteit invoegen in een bestaande pagina, of wordt dit een aparte, op zichzelf staande pagina?
Offline Gust - 30/05/2014 16:30
Avatar van Gust MySQL interesse Aangezien het niet lukt om mijn eigen scripts aan te passen tot hetgeen ik wil, zoek ik een bestaand script dat ik in een eigen website wil inbouwen.
Offline Thomas - 02/06/2014 14:51 (laatste wijziging 03/06/2014 11:41)
Avatar van Thomas Moderator
  1. <?php
  2. error_reporting(E_ALL); // lelijke foutjes weergeven
  3. // noot: dit zou ik alleen doen in een test- of ontwikkelomgeving, maar niet in een productie-omgeving
  4. // noot: het volgende stuk CSS zou ik naar een (apart) CSS bestand verhuizen; daarnaast zou ik een
  5. // extra div introduceren met een class, als een wrapper om deze functionaliteit, zodat alleen het
  6. // contactformulier deze stijl krijgt, je voorkomt hiermee "hardcoding" van "globale" stijlen zoals
  7. // body, table, etc.; daarnaast zijn tables niet echt meer van deze tijd...
  8. ?>
  9. <style type="text/css">
  10. <!--
  11. body { background-color: #f1f1f1; }
  12. div.contact p,
  13. div.contact table { font-family: Verdana; font-size: 9pt; color: #000000; border: 1px; }
  14. div.contact table td.kop { background-color: #b9b9b9; border: 1px; }
  15. div.contact form input,
  16. div.contact form textarea { font-family: Verdana; font-size: 9pt; border: 1px solid; background-color: #e1e1e1; }
  17. div.contact form select { font-family: Verdana; font-size: 9pt; border: 1px solid; }
  18. div.contact div.fout { color: #ff0000; }
  19. //-->
  20. </style>
  21. <?php
  22. // configuratie
  23. // noot: gebruik heldere namen voor variabelen, gebruikt dus $config in plaats van $c ofzo...
  24. // zo ook voor de namen van de configuratie-variabelen zelf
  25. $config = array(
  26. 'naam_site' => 'Jouw website',
  27. 'stuur_bedank_mail' => true,
  28. 'data_ontvangers' => array(
  29. 1 => array(
  30. 'naam' => 'X',
  31. 'geslacht' => 'm',
  32. 'e-mail' => 'x@x.org',
  33. ),
  34. 'naam' => 'Y',
  35. 'geslacht' => 'v',
  36. 'e-mail' => 'y@y.com',
  37. ),
  38. 'naam' => 'Z',
  39. 'geslacht' => 'm',
  40. 'e-mail' => 'z@z.be',
  41. ),
  42. // en hier kun je nog meer mensen toevoegen...
  43. ),
  44. );
  45.  
  46. // noot: het volgende deel is ook niet echt handig; eigenlijk zou je de acties op willen delen in
  47. // aparte stukken; nu moet je namelijk het formulier verwerken terwijl je een pagina aan het
  48. // afdrukken bent; het was beter geweest als je het verwerken van het formulier en het versturen
  49. // van de e-mail in een aparte actie zat, en dat je daarna werd doorverwezen naar een bedank-pagina
  50. if (isset($_POST['verzenden'])) {
  51. $fouten = array();
  52. // noot: het volgende deel bevatte een ... elseif ... elseif ... elseif ... constructie, deze vertelt
  53. // je slechts wat de eerstvolgende fout in je formulier-invoer was, dit lijkt mij zwaar irritant
  54. // noot: in plaats van empty() kun je misschien beter kijken of de invoer andere tekens bevat dan enkel
  55. // spaties en regelovergangen; dit doe je met trim()
  56. if (!isset($_POST['onderwerp']) || trim($_POST['onderwerp']) == '') {
  57. $fouten[] = 'Je moet een onderwerp invullen';
  58. }
  59. if (!isset($_POST['naam']) || trim($_POST['naam']) == '') {
  60. $fouten[] = 'Je moet je naam invullen';
  61. }
  62. // noot: controleer of de afzender een geldige ontvanger heeft geselecteerd
  63. if (!isset($_POST['naar']) || !preg_match('#^[1-9][0-9]*$#', $_POST['naar']) || !isset($config['data_ontvangers'][$_POST['naar']])) {
  64. $fouten[] = 'Je moet een (geldige) ontvanger selecteren';
  65. }
  66. // noot: als je PHP-versie nieuw genoeg is, kun je misschien beter filter_var gebruiken
  67. // omdat de geldigheid van het e-mailadres verder niet uitmaakt, laat ik deze check onveranderd
  68. // wel is eregi() vanaf PHP 5.3.0 deprecated, dus wellicht wil je liever preg_match gebruiken
  69. if (!isset($_POST['email']) || trim($_POST['email']) == '' || !preg_match('#^(.+)@(.+)\.(.+)$#', $_POST['email'])) {
  70. // noot: email is een glasachtige laag op dakpannen, bakstenen etc.
  71. // @see http://nl.wikipedia.org/wiki/Email_%28glazuur%29
  72. // e-mail is elektronische post
  73. $fouten[] = 'Je moet een geldig e-mailadres invullen';
  74. }
  75. if (!isset($_POST['bericht']) || trim($_POST['bericht']) == '') {
  76. $fouten[] = 'Je moet een bericht invullen';
  77. }
  78.  
  79. if(count($fouten) == 0) {
  80. // noot: omdat dit een PLAINTEXT e-mail is, gebruiken we GEEN headers
  81. // als je dit wel wilt moet je hier een MIME mail van maken en zijn er extra controles op invoer nodig
  82. // noot: omdat de mail PLAINTEXT is, hoeft deze ook niet ge-escaped te worden, het is immers geen HTML...
  83. // noot: omdat we geen headers gebruiken, kun je dus ook niet reageren op dit bericht, wellicht wil je hier
  84. // een vermelding van maken in dit bericht zelf, zoiets als
  85. // "dit is een automatisch gegenereerd bericht, u kunt hier niet op reageren"
  86. $ontvanger = $config['data_ontvangers'][$_POST['naar']];
  87. $aanhef = $ontvanger['geslacht'] == 'v' ? 'mevrouw' : 'heer';
  88.  
  89. $bericht = array();
  90. $bericht[] = 'Geachte '.$aanhef.' '.$ontvanger['naam'].',';
  91. $bericht[] = '';
  92. $bericht[] = $_POST['naam'].' heeft u zojuist het volgende bericht verstuurd:';
  93. $bericht[] = '';
  94. $bericht[] = $_POST['bericht'];
  95. $bericht[] = '--------------------------------------------------';
  96. $bericht[] = 'Deze mail is verzonden vanaf '.$config['naam_site'];
  97.  
  98. mail($ontvanger['e-mail'], $_POST['onderwerp'], implode("\n", $bericht));
  99.  
  100. if($config['stuur_bedank_mail']) {
  101. $bericht = array();
  102. $bericht[] = 'Bedankt voor je mail. We zullen je vraag zo spoedig mogelijk in behandeling nemen.';
  103. $bericht[] = '--------------------------------------------------';
  104. $bericht[] = 'Dit is een auto-gegenereerde mail die is verzonden vanaf '.$config['naam_site'];
  105.  
  106. mail($_POST['email'], 'Bedankt', implode("\n", $bericht));
  107.  
  108. // noot: mogelijk wil je het bedank e-mailbericht inhoudelijk nog wat uitbreiden, zodat de afzender
  109. // kan zien wat deze gezegd heeft...
  110. // noot: om te controleren of een e-mail daadwerkelijk succesvol verzonden is zou je de returnwaarde
  111. // van de mail()-aanroep moeten controleren...
  112. ?><div class="contact">
  113. <p>Je e-mail is succesvol verzonden. Er is een e-mail gestuurd naar je adres.</p>
  114. </div><?php
  115. } else {
  116. ?><div class="contact">
  117. <p>Je e-mail is succesvol verzonden.</p>
  118. </div><?php
  119. }
  120. } else {
  121. ?><div class="contact">
  122. <table>
  123. <tr><td class="kop"><p align="center"><b>Fout:</b></td></tr>
  124. <tr><td><?php
  125. foreach ($fouten as $fout) {
  126. ?><div class="fout"> - <?php echo htmlspecialchars($fout, ENT_QUOTES) ?></div><?php
  127. }
  128. ?>Klik <a href="javascript:history.go(-1);">hier</a> om terug te gaan naar het formulier</a>
  129. </td></tr>
  130. </table>
  131. </div><?php
  132. }
  133. } else {
  134. ?><div class="contact">
  135. <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES) ?>">
  136. <table>
  137. <tr><td colspan="2" class="kop"><p align="center"><b>Contact</b></td></tr>
  138. <tr>
  139. <td width="24%">Aan:</td>
  140. <td width="76%">
  141. <select size="1" name="naar">
  142. <option value="0">- selecteer -</option><?php
  143. // noot: we geven geen enkele informatie over de e-mailadressen van de ontvangers!
  144. foreach ($config['data_ontvangers'] as $id => $data) {
  145. // noot: escaping mag je verder zelf uitzoeken, ik weet niet of je een ISO of UTF-8 charset gebruikt
  146. ?><option value="<?php echo htmlspecialchars($id, ENT_QUOTES) ?>"><?php echo htmlspecialchars($data['naam'], ENT_QUOTES) ?></option><?php
  147. }
  148. ?></select>
  149. </td>
  150. </tr>
  151. <tr>
  152. <td width="24%">Onderwerp:</td>
  153. <td width="76%"><input type="text" name="onderwerp" size="38" /></td>
  154. </tr>
  155. <tr>
  156. <td width="24%">Je naam:</td>
  157. <td width="76%"><input type="text" name="naam" size="38" /></td>
  158. </tr>
  159. <tr>
  160. <td width="24%">Je e-mailadres:</td>
  161. <td width="76%"><input type="text" name="email" size="38" /></td>
  162. </tr>
  163. <tr>
  164. <td width="24%">Bericht:</td>
  165. <td width="76%"><textarea rows="7" name="bericht" cols="32"></textarea></td>
  166. </tr>
  167. </table>
  168. <br />
  169. <input type="submit" name="verzenden" value="verzenden" />
  170. </form>
  171. </div><?php
  172. }
  173. ?>


EDIT:
- eenvoudige regex voor e-mail controleert nu of de delen voor @, tussen @ en . en na . niet leeg zijn
- aanroep van versturen contact-mail nu iets korter ($config['data_ontvangers'][$_POST['naar']] vervangen door $ontvanger)
Bedankt door: Gust
Offline Gust - 04/06/2014 12:57
Avatar van Gust MySQL interesse Bedankt dat is zo ongeveer wat ik wil, nu moet ik nog verder bouwen op het volgende:
- zorgen dat beide emails (zowel verzender als ontvanger) niet meer in mijn spambox komen
- zorgen voor captcha beveiliging

Zodra ik een oplossing heb, ga ik dit hier posten.
Offline Thomas - 04/06/2014 13:29 (laatste wijziging 04/06/2014 13:36)
Avatar van Thomas Moderator Gebruikt je (e-mail) provider programma's als SpamAssassin?

Als ik e-mail probeer te versturen vanaf mijn webhost naar een specifiek e-mailadres, wordt deze altijd geflagged als spam. Dit kan ook (deels) komen doordat de webhost geen positieve reputatie heeft (mogelijk te boek staat als notoire spammer).

Je kunt in GMail of Thunderbird (ik weet niet wat jij gebruikt om mail te lezen?) altijd de broncode opvragen van de verstuurde e-mail, hier is dan mogelijk header-informatie toegevoegd die informatie geeft over het gebruikte antispam-( en soms ook antivirus-)programma van een tussenstation en ook informatie verschaft over de criteria waarom je e-mail spam-punten scoort.

Ik vermoed dat je e-mail geflagged wordt als spam omdat de berichten nogal kort zijn en er geen afzender wordt vermeld, dit is in je mail waarschijnlijk gewoon een machinenaam. Het bouwen van een fatsoenlijke HTML-mail is waarschijnlijk een betere oplossing (dus een volwaardige MIME-mail met headers enzo) maar als je dit doet dan moet je je invoer ook beter controleren. Als je bijvoorbeeld de naam van de afzender niet controleert op regelovergangen en dergelijke, kun je MIME-headers injecteren in je mail-headers (bijvoorbeeld BCC - deze headers zie je niet in andere e-mailberichten terug wat het lastig maakt om deze op te sporen; waarschijnlijk heb je dat dan niet in de gaten totdat je mailserver geflagged wordt als spammer en/of je boze telefoontjes krijgt van je webhosting bedrijf), wat tot gevolg kan hebben dat je formulier misbruikt kan worden voor het versturen van spam. Dat is de reden dat ik voor nu de headers had verwijderd uit je script.

Het zou al kunnen helpen als je je From, Return-Path en Reply-To headers toevoegt en voorziet van de naam en het e-mailadres van de afzender (je hoeft er dan niet eens een MIME-mail van te maken denk ik) mits deze goed gefilterd worden.

Daarnaast is het belangrijk je bewust te zijn van de gehanteerde character set bij het versturen van (HTML) e-mail, maar ook elders, zoals in je website en database. Houd hier dus ook rekening mee!
Offline Gust - 04/06/2014 13:59 (laatste wijziging 04/06/2014 14:01)
Avatar van Gust MySQL interesse Als ik een langere mail stuur komt het inderdaad niet meer in mijn spambox terecht, enkel de vreemde headers blijven bestaan.

Bedoel je dit soort dingen die ik er tussen moet plaatsen?

  1. $headers = "From: \"Contact Formulier\" <".$cfg['email'].">\r\n";
  2. $headers .= "Reply-To: \"".$naam."\" <".$email.">\n";
  3. $headers .= "Return-Path: Mail-Error <".$cfg['email'].">\n";
  4. $headers .= "MIME-Version: 1.0\n";
  5. $headers .= "Content-Transfer-Encoding: 8bit\n";
  6. $headers .= "Content-type: text/html; charset=iso-8859-1\n";
Offline Thomas - 04/06/2014 14:34
Avatar van Thomas Moderator Vreemde headers? Die worden waarschijnlijk onderweg toegevoegd, daar doe je niet zoveel aan :].

Ja, bovenstaande headers zou je kunnen toevoegen, maar ik zou het iets anders opschrijven maar dat is deels persoonlijke voorkeur. Wel kan het handig zijn om je headers als array op te stellen, zo kun je in één keer het teken/de tekens voor een regelovergang wijzigen, mocht dit nodig zijn.

Zorg er in ieder geval voor dat je $naam en $email controleert op regelovergangen anders is deze code vatbaar voor MIME header injectie. Voorbeeld: vul voor $email maar eens het volgende in:

  1. ontvanger@adres.com>
  2. BCC: spam <spamslachtoffer@random.nl


Boom - BCC-regel toegevoegd.
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.236s