Michael P.: Sendmail Absender

Hallo!

Bin PHP-Anfänger und möchte bei folgendem Formular, dass der festgelegte Formular-Empfänger als Absender der Formulardaten die E-Mail-Adresse des Versenders in der From-Zeile sieht, so dass er diesem im E-Mail-Client direkt antworten kann.

Wie wäre das Formular zu ergänzen, bzw. wie kann ich aus dem Array (?) der Formulardaten das Feld mit der E-Mail-Adresse auslesen und in die From-Zeile ausgeben.

Bitte um Code(-schnipsel).

<?php

Konfiguration

Bitte passen Sie die folgenden Werte an, bevor Sie das Script benutzen!

An welche Adresse sollen die Mails gesendet werden?

$strEmpfaenger = '#emailadresse#';

Welche Adresse soll als Absender angegeben werden?

(Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

$strFrom       =  '"SENDMAIL" noreply@email.de';

Welchen Betreff sollen die Mails erhalten?

$strSubject    = 'Anfrage';

Zu welcher Seite soll als "Danke-Seite" weitergeleitet werden?

Wichtig: Sie muessen hier eine gueltige HTTP-Adresse angeben!

$strReturnhtml = 'http://www.domain.de/anfrage_ok.php';

Welche(s) Zeichen soll(en) zwischen dem Feldnamen und dem angegebenen Wert stehen?

$strDelimiter  = ":\t";

Ende Konfiguration

if($_POST)
{
 $strMailtext = "";

while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");
 header("Location: $strReturnhtml");
 exit;
}

?>

  1. Hallo Michael,

    Bin PHP-Anfänger und möchte bei folgendem Formular, dass der festgelegte Formular-Empfänger als Absender der Formulardaten die E-Mail-Adresse des Versenders in der From-Zeile sieht, so dass er diesem im E-Mail-Client direkt antworten kann.

    auch wenn Du Anfänger bist, so solltest Du doch den Code aufmerksam lesen
    können, dieser stammt vom Einfacher Formmailer von Patrick Canterino:

    [...] irgendwann kommt dieser Abschnitt:

    Welche Adresse soll als Absender angegeben werden?

    (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

    $strFrom       =  '"SENDMAIL" noreply@email.de';

    Bitte beachte auch den Hinweis in der zweiten Kommentarzeile.

    Freundliche Grüße

    Vinzenz

    1. Hallo Michael,

      Bin PHP-Anfänger und möchte bei folgendem Formular, dass der festgelegte Formular-Empfänger als Absender der Formulardaten die E-Mail-Adresse des Versenders in der From-Zeile sieht, so dass er diesem im E-Mail-Client direkt antworten kann.

      auch wenn Du Anfänger bist, so solltest Du doch den Code aufmerksam lesen
      können, dieser stammt vom Einfacher Formmailer von Patrick Canterino:

      [...] irgendwann kommt dieser Abschnitt:

      Welche Adresse soll als Absender angegeben werden?

      (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

      $strFrom       =  '"SENDMAIL" noreply@email.de';

      Bitte beachte auch den Hinweis in der zweiten Kommentarzeile.

      Freundliche Grüße

      Vinzenz

      Vielen Dank für die schnelle Antwort.

      Allerdings möchte ich genau in dieser Codezeite $strFrom die E-Mail-Adresse (z. B. noreply@email.de) dynamisch ersetzten durch den Wert des Feldes - wollen wir dieses Feld "email" nennen - in der der Versender seine eigene E-Mail-Adresse angibt. Wenn bsp. ein Herr Meier mit der E-Mail meier@abc.de das Formular ausfüllt, sollte der Wert $strFrom meier@abc.de sein ...

  2. echo $begrüßung;

    Wie wäre das Formular zu ergänzen, bzw. wie kann ich aus dem Array (?) der Formulardaten das Feld mit der E-Mail-Adresse auslesen und in die From-Zeile ausgeben.

    Das kommt darauf an, welchen Wert das name-Attribut des Eingabefelds hat, in das der Absender eingetragen werden soll. Prinzipiell steht der Wert in $_POST['wert_des_name-attributes'].

    Da dieser Wert allerdings von einem Client kommt und in einen Mail-Header eingebaut werden soll, ist hier unbedingt noch eine Prüfung vorzunehmen, damit dieses Mail-Formular nicht als Spam-Schleuder missbraucht werden kann. Wenn du in dem eingegebenen Wert ein Zeilenumbruchzeichen findest, dann ist das ein untrügliches Zeichen für einen Missbrauchsversuch durch einen Spammer.

    if (isset($_POST['wert_des_name-attributes'])) {
      // Zeilenumbruchszeichen enthalten? Spamverdacht!
      if (strpos($_POST['wert_des_name-attributes'], "\r") !== false or
          strpos($_POST['wert_des_name-attributes'], "\n") !== false)
        die('Abbruch wegen Spamversuch.'); // [*]

    $strEmpfaenger = $_POST['wert_des_name-attributes'];
    } else {
      $strEmpfaenger = 'Default-Wert'; // oder Abbruch/Affenformularkorrektur wegen fehlenden Wertes
      // ggf. noch eine Prüfung auf zulässiges Format einbauen.
    }

    if($_POST)

    Ob eine Variable gesetzt ist prüft man unter PHP mit der Funktion isset(). Die obige Form ist Javascript-Stil.

    if (isset($_POST))

    while(list($strName,$value) = each($_POST))

    Ich finde ein

    foreach ($_POST as $strName => $value)

    übersichtlicher als dieses while-list-each-Konstrukt. Das ist PHP-3-Stil, weil es da noch kein foreach gab (ist aber kein Fehler, funktioniert auch so).

    if(get_magic_quotes_gpc())

    Wenn man Probleme mit eingeschaltetem Magic-Quotes-Feature erwartet dann ist es besser, sie gleich zu Anfang des Scripts und generell zu eleminieren, anstatt ihnen eine Individualbehandlung zukommen zu lassen, die man dann vielleicht im Eifer des Gefechts vergisst.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      hmmm, die Anmerkung vergessen.

      die('Abbruch wegen Spamversuch.'); // [*]

      [*] die() ist im Normalfall kein schönes Mittel, um einen Anwender auf einen Fehler hinzuweisen. Ein plötzlicher Script-Tod hinterlässt eine unfertige Seite und sieht nicht unbedingt professionell aus.

      Da der erwartete Anwender für diesen Fehler aber ein Spam-Bot ist, finde ich die() hier angemessen.

      echo "$verabschiedung $name";

    2. Hey,

      hab das nun soweit hinbekommen, allerdings möchte ich einen Standardwert als E-Mail-Absender eingetragen haben (z. B. noreply@domain.de), wenn im Formular keine E-Mail-Adresse hinterlegt wird - bzw. keine konforme Mailadresse..

      Wie kann ich das noch lösen?

      Vielen Dank im Voraus!

      ----

      Welche Adresse soll als Absender angegeben werden?

      (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)

      $strFrom       =  'SENDMAIL noreply@domain.de';
      ----

      if (isset($_POST['E-Mail'])) {
        // Zeilenumbruchszeichen enthalten? Spamverdacht!
        if (strpos($_POST['E-Mail'], "\r") !== false or
            strpos($_POST['E-Mail'], "\n") !== false)
          die('Abbruch wegen Spamversuch.'); // [*]

      $strFrom = $_POST['E-Mail'];
      } else {
        $strFrom = 'SENDMAIL <noreply@domain.de'; // Behandlung bei fehlendem Wert --> Default-Wert anzeigen !!!?????

      }

      if($_POST)
      {
       $strMailtext = "";

      while(list($strName,$value) = each($_POST))
       {
        if(is_array($value))
        {
         foreach($value as $value_array)
         {
          $strMailtext .= $strName.$strDelimiter.$value_array."\n";
         }
        }
        else
        {
         $strMailtext .= $strName.$strDelimiter.$value."\n";
        }
       }

      if(get_magic_quotes_gpc())
       {
        $strMailtext = stripslashes($strMailtext);
       }

      mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
        or die("Die Mail konnte nicht versendet werden.");
       header("Location: $strReturnhtml");
       exit;
      }

      1. echo $begrüßung;

        hab das nun soweit hinbekommen, allerdings möchte ich einen Standardwert als E-Mail-Absender eingetragen haben (z. B. noreply@domain.de), wenn im Formular keine E-Mail-Adresse hinterlegt wird - bzw. keine konforme Mailadresse..
        Wie kann ich das noch lösen?

        Das ist ja schon fast vorhanden.

        if (isset($_POST['E-Mail'])) {

        [...]

        $strFrom = $_POST['E-Mail'];
        } else {
          $strFrom = 'SENDMAIL <noreply@domain.de'; // Behandlung bei fehlendem Wert --> Default-Wert anzeigen !!!?????
        }

        Hier schaust du nur, ob überhaupt das Element "E-Mail" vorhanden ist. Um deren Inhalt auszuwerten, müsstest du an der Zeile

        $strFrom = $_POST['E-Mail'];

        ansetzen und dort einige Prüfungen einbauen. Trivial ist nur der Fall, wenn das Feld leer ist. Die Prüfung auf eine konforme Mailadresse ist aufwendiger. Es gibt einige RegExp-Muster im Netz zu finden, die aber oftmals im Prinzip falsch sind, weil sie einige der zwar gültigen aber relativ wenig verwendeten Fälle als ungültig werten. Selbst wenn die Adresse formalen Ansprüchen genügt, heißt das nicht, dass sie auf ein real existierendes Postfach zeigt. Gelegentlich gibt es hier im Forum Diskussionen über Sinn und Unsinn solcher Prüfungen generell bzw. der eingesetzten Prüfmethoden im Speziellen. Viel mehr als in Richtung Archiv zeigen, kann ich leider nicht, weil ich mir nicht gemerkt habe, welche der Diskussionen besonders erkenntnisreich sind. Wie auch immer, du müsstest erstmal für dich festlegen, was gültige Adressen sind, und diese dann Kriterien dann in Code fassen. Dabei kannst du ja bei anderen abgucken, nach "PHP Email-Adresse prüfen" zu googlen dürfte sicherlich reichlich Fundstellen ergeben.

        echo "$verabschiedung $name";

        1. if (isset($_POST['E-Mail'])) {
            [...]

          $strFrom = $_POST['E-Mail'];
          } else {
            $strFrom = 'SENDMAIL <noreply@domain.de'; // Behandlung bei fehlendem Wert --> Default-Wert anzeigen !!!?????
          }

          Hier schaust du nur, ob überhaupt das Element "E-Mail" vorhanden ist. Um deren Inhalt auszuwerten, müsstest du an der Zeile

          $strFrom = $_POST['E-Mail'];

          ansetzen und dort einige Prüfungen einbauen. Trivial ist nur der Fall, wenn das Feld leer ist.

          Für mich genügt vorerst mal der triviale Fall - leider aber reicht mein Verständnis in PHP bisher nicht so weit, dies selbst zu lösen.
          Es sollte so sein, dass sofern kein Wert eingetragen wurde, in die $strFrom-Variable vor dem Zusammensetzen des Headers ein Default-Wert (noreply@domain.de) geschrieben wird.

          Wieder Mal größten Dank!!!

          1. echo $begrüßung;

            Für mich genügt vorerst mal der triviale Fall - leider aber reicht mein Verständnis in PHP bisher nicht so weit, dies selbst zu lösen.

            So schlimm wird es schon nicht sein :-)

            Es sollte so sein, dass sofern kein Wert eingetragen wurde, in die $strFrom-Variable vor dem Zusammensetzen des Headers ein Default-Wert (noreply@domain.de) geschrieben wird.

            Mit der Funktion empty($variablenname) kann man testen, ob die Variable "leer" ist. "Leer" ist sie unter anderem, wenn sie einen Leerstring enthält.

            Das als Bedingung für ein kleines if ...

            echo "$verabschiedung $name";