views:

33

answers:

3

In my homepage I defined a form which uses the following script to send a mail:

<?php

/* Geben Sie hier Ihre E-Mail Adresse zwischen den beiden " an: */

$_emails[0] = "[email protected]";

// Wenn keine $_POST Daten übermittelt wurden, dann abbrechen
if(!isset($_POST) OR empty($_POST))
{
   header("Content-type: text/plain; charset=utf-8");
    echo "Es wurden keine Daten übermittelt!";
    exit;
}
else
{
    // Datum, Uhrzeit und Pfad zum eigenen Script feststellen
    $date = date("d.m.Y");
    $time = date("H:i");
    $host = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];

    // Empfänger feststellen und auf Gültigkeit prüfen
    if(isset($_POST['recipient']) AND isset($_emails[ $_POST['recipient'] ])
       AND preg_match("/^.*@.*\..*$/", $_emails[ $_POST['recipient'] ]))
    {
        $recipient = $_emails[ $_POST['recipient'] ];
    }
    // Wurde kein (gültiger) Empfänger angegeben, es mit $_email[0] versuchen
    elseif(isset($_emails[0]) AND preg_match("/^.*@.*\..*$/", $_emails[0]))
    {
        $recipient = $_emails[0];
    }
    // Ist auch diese Adresse ungültig, mit Fehlermeldung abbrechen
    else
    {
        header("Content-type: text/plain");
        echo "Fehler im Script - es wurde kein Empfänger oder eine ungültige E-Mail Adresse in \ angegeben.";
        exit;
    }

    // Wenn Betreff übermittelt, diesen verwenden
    if(isset($_POST['subject']))
    {
        $subject = $_POST['subject'];
    }
    // sonst einen Default Betreff verwenden
    else
    {
        $subject = "Formular Daten von {$_SERVER['HTTP_HOST']}";
    }

    // E-Mai Kopf generieren
    $email = "Formular Eintrag\n"
           . "\n"
           . "Am $date um $time Uhr hast das Script auf $host Formulardaten empfangen,\n"
           . "welche nach Angabe des Browsers von {$_SERVER['HTTP_REFERER']} stammen.\n"
           . "\n"
           . "Der Formular Inhalt wird nachfolgend wiedergegeben.\n"
           . "\n";

    // Alle $_POST Werte an den E-Mail Kopf anhängen
    foreach($_POST as $key => $value)
    {
        if($key == "redirect" OR $key == "recipient" OR $key == "subject")
        {
            continue;
        }
        $email .= "Fomular Feld '$key':\n"
               .  "=============================\n"
               .  "$value\n"
               .  "\n";
    }

    // E-Mail Fuß anfügen
    $email .= "=============================\n"
           .  "Ende der automatisch generierten E-Mail.";

    // Versuchen E-Mail zu versenden
    if(!mail($recipient, $subject, $email)) {
        // Ist dies gescheitert, Fehlermeldung ausgeben
        echo "Es ist ein Fehler beim Versenden der E-Mail aufgetreten,"
             . " eventuell liegt ein Konfigurationsfehler am Server vor.\n\n";
        exit;
    }

    // Wenn gewünscht, auf Bestätigungsseite weiterleiten
    if(isset($_POST['redirect']) AND preg_match("=^(http|ftp)://.*\..*$=", $_POST['redirect'])) {
       header("Location: ".$_POST['redirect']);
        exit;
    } else {
        header("Content-type: text/html");
        echo "Die E-Mail wurde erfolgreich versendet.";
    echo '<br>';
      echo '<a href="http://www.ornitholog.li/cms/index.php?page=kontakt"&gt;Zurueck&lt;/a&gt;';
        exit;
    }
}

?>

It works ok, but however, the confirmation that the email was sent is displayed in a new window. I would prefer that the confirmation is displayed instead of the email form. How can I achieve that?

==EDIT=== I added the form:

<form action="./mail.php" method="post"> 
<table border="0">
<tbody>
<tr>
<td><label for="absender">Ihr Name:</label></td>
<td><input id="absender" name="absender" size="25" type="text" /></td>
</tr>
<tr>
<td><label for="email">Ihre E-Mail Adresse:</label></td>
<td><input id="email" name="email" size="25" type="text" /></td>
</tr>
<tr>
<td><label for="betreff">Betreff ihrer Nachricht:</label></td>
<td><input id="betreff" name="betreff" size="25" type="betreff" /></td>
</tr>
<tr>
<td><label for="nachricht">Ihre Nachricht:</label></td>
<td><textarea id="nachricht" cols="30" rows="8" name="nachricht"></textarea></td>
</tr>
<tr height="20">
<td></td>
<td></td>
</tr>
<tr>
<th colspan="2" align="center"><input name="abschicken" type="submit" value="Nachricht verschicken" /></th>
</tr>
</tbody>
</table>
</form>
+2  A: 

You change the action in your <form> to the same script as the form itself is in and check for the $_POST - if it is filled with something from the form, try to submit it.

Basically, you just put the PHP-code above or below or around your HTML-form. Then I personally add a hidden field like <input type="hidden" name="sent" value="true"> which I can check for in PHP.

if (!empty($_POST['sent']))
{
    // Your PHP-Code for sending the mail
}
else
{
    // Your HTML form
}
ApoY2k
See my edit. You point `action=""` to the file itself and sort out if the form was sent or not.
ApoY2k
Thanks now I know how to do it. However I have problem to implement the code in my CMS, but for that i have to use the CMS forum I think ;)
Roflcoptr
Another possibility would be to redirect the user back to the form page using a GET-parameter and to check for that in the form page...
ApoY2k
+1  A: 

provive a variable that stands for a success-state like:

http://www.ornitholog.li/cms/index.php?page=kontakt&amp;state=1

http://www.ornitholog.li/cms/index.php?page=kontakt&amp;state=2

State 1 -> success

State 2 -> not all fields are proper filled

Or simply add the code into the same file as the form is in.

Ben Fransen
+1  A: 

I take it you wish the confirmation to be shown without having to load a new page? If so, then you must apply Javascript, preferably AJAX, to submit the form, receive the response, remove the form and display the confirmation (all in the same page without a reload).

gablin