Avatar billede dotcom1 Nybegynder
12. marts 2005 - 15:59 Der er 11 kommentarer og
1 løsning

Set cookie i form mail script

Hej.

I følgende form mail script kunne jeg godt tænke mig at man kunne sætte en cookie, så brugere kun kan sende mails, f.eks. hvert 5. minut, men hvordan gøres det?

Mvh.

formmail.php:

<?php
// Your e-mail adress:
$mailto = "name@domain.tld";

# Maximum size of attachment in bytes:
$max_attach_size = 500000;

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>Formmailer</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<style type="text/css">
<!--
body                { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13px; color: #000000; background: #ffff3; margin: 20px; padding: 0px; border: 0px; }
.caution            { color: red; font-weight: bold; }
-->
</style>
</head>
<body><?php
/*if (empty($_POST['form_submitted']))
{
  ?><p>Please fill out the form:</p><?php
}
*/
if (isset($_POST["form_submitted"]))
{
  $name = $_POST['name'];
  $email = $_POST['email'];
  $subject = $_POST['subject'];
  $text = $_POST['text'];

  unset($errors);
  if ($email != "" and !preg_match("/^[^@]+@.+\.\D{2,5}$/", $email)) $errors[] = "e-mail address seems to be invalod";
  if ($text == "") $errors[] = "no message entered";
  if ($_FILES['probe']['size'] > $max_attach_size) $errors[] = "attachment too large (".number_format($_FILES['probe']['size']/1000,0,",","")." KB) - maximum size: ".number_format($max_attach_size/1000,0,",","")." KB";

  if (empty($errors))
  {
    $text = stripslashes($text);
    $subject = stripslashes($subject);
    if ($name != "") $mail_name=$name; else $mail_name="Unknown";
    if ($subject != "") $mail_subject = $subject; else $mail_subject = "No subject";
    if ($email != "") $mail_email = $email; else $mail_email = "email@unknown.xyz";
    $ip = $_SERVER["REMOTE_ADDR"];

    // if attachment, MIME-Mail:
    if (isset($_FILES['probe']['name']) && trim($_FILES['probe']['name']) != "")
    {
      // read and encode file:
      $datei_content = fread(fopen($_FILES['probe']['tmp_name'],"r"),filesize($_FILES['probe']['tmp_name']));
      $datei_content = chunk_split(base64_encode($datei_content),76,"\n");
      // Boundary:
      $boundary = md5(uniqid(rand()));
      // Mail-Header:
      $mail_header = "From: ".$mail_name." <".$mail_email.">\n";
      $mail_header .= "X-Sender-IP: ".$ip."\n";
      $mail_header .= "MIME-Version: 1.0\n";
      $mail_header .= "Content-Type: multipart/mixed; boundary=\"".$boundary."\"\n";
      $mail_header .= "This is a multi-part message in MIME format.\n";
      // Mail-Text:
      $mail_header .= "--".$boundary;
      $mail_header .= "\nContent-Type: text/plain";
      $mail_header .= "\nContent-Transfer-Encoding: 8bit";
      $mail_header .= "\n\n".$text;
      // Attachment:
      $mail_header .= "\n--".$boundary;
      $mail_header .= "\nContent-Type: ".$_FILES['probe']['type']."; name=\"".$_FILES['probe']['name']."\"";
      $mail_header .= "\nContent-Transfer-Encoding: base64";
      $mail_header .= "\nContent-Disposition: attachment; filename=\"".$_FILES['probe']['name']."\"";
      $mail_header .= "\n\n".$datei_content;
      // End:
      $mail_header .= "\n--".$boundary."--";
      // Send E-mail
      if (@mail($mailto,$mail_subject,"",$mail_header)) $sent = true; else $errors[] = "no connection to the mailserver - please try again later";
    }
    // no attachment, normal E-mail:
    else
    {
      $mail_header = "From: ".$mail_name." <".$mail_email.">\n";
      $mail_header .= "X-Sender-IP: $ip\n";
      $mail_header .= "Content-Type: text/plain";
      if (@mail($mailto,$mail_subject,$text,$mail_header)) $sent = true; else $errors[] = "no connection to the mailserver - please try again later";
    }

    // copy to sender:
    if (isset($sent) && isset($email) && $email != "" && isset($_POST['copy']))
    {
      if (isset($_FILES['probe']['name']) && trim($_FILES['probe']['name']) != "") $copy_mail_text = "Copy of the e-mail:\n\n".$text."\n\nAttachment: ".$_FILES['probe']['name']; else $copy_mail_text = "Copy of the e-mail:\n\n".$text;
      $header= "From: ".$mailto."\n";
      $header .= "X-Sender-IP: ".$ip."\n";
      $header .= "Content-Type: text/plain";
      @mail($email, $mail_subject, $copy_mail_text, $header);
    }
  }
}

if (empty($sent))
{
  if(isset($errors))
  {
    ?><p class="caution">Error:</p><ul><?php foreach($errors as $f) { ?><li><?php echo $f; ?></li><?php } ?></ul><br /><?php
  }

  ?><form method="post" action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" enctype="multipart/form-data"><div>
  <p><b>Name:</b><br /><input type="text" name="name" value="<?php if (isset($name)) echo htmlentities(stripslashes($name)); else echo ""; ?>" size="35" /></p>
  <p><b>E-mail:</b><br /><input type="text" name="email" value="<?php if (isset($email)) echo htmlentities(stripslashes($email)); else echo ""; ?>" size="35" /></p>
  <p><b>Subject:</b><br /><input type="text" name="subject" value="<?php if (isset($subject)) echo htmlentities(stripslashes($subject)); else echo ""; ?>" size="35" /></p>
  <p><b>Message:</b><br /><textarea name="text" cols="55" rows="12"><?php if (isset($text)) echo htmlentities(stripslashes($text)); else echo ""; ?></textarea></p>
  <b>Attachment:</b><br /><input type="file" name="probe" value="<?php if (isset($_POST['probe'])) echo htmlentities(stripslashes($_POST['probe'])); else echo ""; ?>" size="20"/></p>
  <br /><br />
  <p><input type="submit" name="form_submitted" value="OK - Submit" /> <input type="checkbox" name="copy" value="true" /> Copy to sender</p>
  </div></form><?php
}
else
{
  if (empty($email)) { ?><p><b>Thank you!</b><br />The message has been sent successfully but you didn't specify your e-mail address so I can't reply.</p><?php }
  else { ?><p><b>Thank you!</b><br />The message has been sent successfully.</p><?php }
}

?>
</body>
</html>
Avatar billede detox Nybegynder
12. marts 2005 - 19:00 #1
Hvis du 'møblerer' om på scriptet og sætter php delen med mail op i starten af scriptet (inden output), kan du sætte en cookie der holder 5 min. med:

setcookie('mail', '1', time()+300);

lige efter dine mail() funktioner. I starten af scriptet tjekker du så om den er sat med:

if (isset($_COOKIE['mail'])) {
  // Der er ikke gået 5 minutter
  // Gør noget
  exit;
}
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 15:00 #2
Hej detox.
Det virker fint når jeg sætter en cookie i scriptet som du har beskrevet. :-)
Problemet opstår når scriptet er implementeret på et webside...så får jeg den sædvanlige fejl med "Cannot add header information - headers already sent by..." når jeg sender en mail. Jeg tænker at det skyldes Takke-beskeden efter afsendelse, men jeg kan ikke finde ud af at placere den, så den ikke melder fejl.
Siden med scriptet ser således ud: http://www.e-nanna.dk/scripts/source.php?url=/templates/eksperten.php
:)
Avatar billede detox Nybegynder
13. marts 2005 - 16:50 #3
Sikkert fordi du har en tom linje her:

$max_attach_size = 500000;
?>

<?php

der er ingen grund til at gå ud og ind af php her, slet:

?>

<?php
Avatar billede detox Nybegynder
13. marts 2005 - 16:54 #4
Du skal nok osse sætte en cookie her:

if (@mail($mailto,$mail_subject,"",$mail_header)) $sent = true; else $errors[] = "No connection to the mailserver - please try again later";

if (@mail($mailto,$mail_subject,"",$mail_header)) {
  $sent = true;
  setcookie('mail', '1', time()+300);
} else {$errors[] = "No connection to the mailserver - please try again later";}

og lige sådan med den anden.
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 17:04 #5
Hmm, jeg får parse error i den linie med setcookie her:
if (@mail($mailto,$mail_subject,"",$mail_header)) {
  $sent = true;
  setcookie('mail', '1', time()+300);
} else {$errors[] = "No connection to the mailserver - please try again later";}
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 17:09 #6
Nå, det lader til at virke nu - får ikke fejl mere og cookien virker, men når jeg får vist de dér "tak for mailen"-beskeder efter afsendelse, så vises de i et tomt vindue, istedet for under mailformen... Hvordan kan det være? :)
Avatar billede detox Nybegynder
13. marts 2005 - 17:23 #7
Formen står jo inden for denne if betingelse:

if (empty($sent))
{

og den er jo sand efter mailen er sendt.
Avatar billede detox Nybegynder
13. marts 2005 - 17:23 #8
Eller rettere den er IKKE sand ;)
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 21:38 #9
Okay... Kan jeg ændre på if (empty($sent)){ eller havd skal jeg gøre få formen til at se ud som før? :) Før cookien stod formen vel også inden for betingelsen?
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 21:38 #10
I øvrigt, tusind tak for din hjælp indtil videre... :)
Avatar billede dotcom1 Nybegynder
13. marts 2005 - 21:45 #11
Aha, fandt selv ud af at flytte <?php if (empty($sent)) - nu virker det helt perfekt! Tusind tak, detox. Læg endelig et svar. :)
Avatar billede detox Nybegynder
13. marts 2005 - 21:46 #12
Velbekommen
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester