Clownvogel: Formmailer-Advanced/ swiftmailer

Ich habe den Formmailer as self.html.wiki herunter kopiert sowie swiftmailer installiert. Aber leider kann ich keine Mails versenden. Was muss ich verändern damit ich Mails versenden kann.

  1. Hallo Clownvogel,

    Ich habe den Formmailer as self.html.wiki herunter kopiert sowie swiftmailer installiert. Aber leider kann ich keine Mails versenden. Was muss ich verändern damit ich Mails versenden kann.

    Zunächst einmal mehr Informationen zur Verfügung stellen.

    Bis demnächst
    Matthias

    --
    Signaturen sind bloed (Steel) und Markdown ist mächtig.
    1. Moin!

      Zunächst einmal mehr Informationen zur Verfügung stellen.

      Richtig:

      Aber leider kann ich keine Mails versenden.

      ... reicht nämlich nicht. Es fehlen sämtliche Angaben zum System, auch Auszüge aus dem Error-Log haben wir nicht gesehen. Und oft wird "leider kann ich keine Mails versenden." mit "leider kommen die Mails nicht bei meinem an Mailkonto an" oder "der Spamfilter bzw. mein Mailserver lässt die Mails leider nicht rein" verwechselt.

      Jörg Reinholz

    2. [Vollzitat]

      hallo Matthias,

      ist gut ich werde jetzt hofffentlich mehr Informationen liefern. hier nun der Teil der die Mails versenden soll. (Die Mails kommen bei meinem localen-server nicht an):

       <?php
       
       $zieladresse = 'x@x.local';  
      
       $absenderadresse = 'x@x.local'; **was für eine adresse soll da hinein die Besucher der Hompage sollen mit ihrer eigen Adresse an die Zieladresse schreiben**
       
       $absendername = 'Formmailer'; 
      
       $betreff = 'Feedback';
       
       $urlDankeSeite = 'Leere Seite für Bestätigung.htm'; **ich habe eine Seite auf der Homepage diese ist aber nicht online**
      
       $trenner = ":\t"; // Doppelpunkt + Tabulator
       
       
       require_once "Swiftmailer-5.x/lib/swift_required.php"; // Swift initialisieren
       
       if ($_SERVER['REQUEST_METHOD'] === "POST") {
       
           $message = Swift_Message::newInstance(); // Ein Objekt für die Mailnachricht.
       
           $message
               ->setFrom(array($absenderadresse => $absendername))
               ->setTo(array($zieladresse)) // alternativ existiert setCc() und setBcc()
               ->setSubject($betreff);
       
           $mailtext = "";
       
           foreach ($_POST as $name => $wert) {
               if (is_array($wert)) {
                       foreach ($wert as $einzelwert) {
                       $mailtext .= $name.$trenner.$einzelwert."\n";
                   }
               } else {
                   $mailtext .= $name.$trenner.$wert."\n";
               }
           }
       
           $message->setBody($mailtext, 'text/plain');
       
           $mailer = Swift_Mailer::newInstance(Swift_MailTransport::newInstance());
           $result = $mailer->send($message);
       
           if ($result == 0) {
               die("Mail konnte nicht versandt werden.");
           }
       
           header("Location: $urlDankeSeite");
           exit;
       }
       
       header("Content-type: text/html; charset=utf-8");
      
      

      Ich habe den Swiftmailer "swiftmailer-5.x genannt. Muss ich in dies Verzeichnis nur die Bibliothek (lib) lassen oder alles was ich heruntergeladen habe. Odr kommt der Inhalt des Ordners lib direkt in das Verzeichnis meiner ganzen Homepage-Seiten.

      danke für weiter hilfe

      Clownvogel

      1. Hallo,

        $absenderadresse = 'x@x.local'; **was für eine adresse soll da hinein die Besucher der Hompage sollen mit ihrer eigen Adresse an die Zieladresse schreiben**
        

        ich gehe davon aus, du hast ein Formular:

        <form name="form1" method="post" action="absenden.php">
          <label for="emailAdresse">Ihre Mail - Adresse</label>
          <input type="email" name="emailAdresse" id="emailAdresse">
          <input type="submit" name="abschicken" id="abschicken" value="Senden">
        </form>
        

        Hier könnte man auch ein <button></button> nehmen

        In der Datei, die bei action angegeben wird, werden deine Daten wie folgt ankommen:

        $_POST["emailAdresse"];
        

        dieses kannst du dir z.b. mit

        echo htmlspecialchars($_POST["emailAdresse"]);
        

        ausgeben lassen. Ich würde jetzt eine Variable anlegen:

        $MailAdresse = $_POST["emailAdresse"];
        

        Ab jetzt kannst du mit $MailAdresse weiterarbeiten. In deinem Fall z.B. so:

        $absenderadresse = $MailAdresse;
        

        Und schon steht im Feld Absender, die Mail Adresse von deinem User / Kunden / Spamer, was auch immer :)

        1. Hallo

          <form name="form1" method="post" action="absenden.php">
            <label for="emailAdresse">Ihre Mail - Adresse</label>
            <input type="email" name="emailAdresse" id="emailAdresse">
            <input type="submit" name="abschicken" id="abschicken" value="Senden">
          </form>
          

          Hier könnte man auch ein <button></button> nehmen

          Zur Klarstellung für @Clownvogel a.k.a. Cl: „Hier“ bedeutet „statt <input type="submit">“.

          … Ich würde jetzt eine Variable anlegen:

          $MailAdresse = $_POST["emailAdresse"];
          

          Ab jetzt kannst du mit $MailAdresse weiterarbeiten. In deinem Fall z.B. so:

          $absenderadresse = $MailAdresse;
          

          Unter der Voraussetzung, dass ich mit der Emailadresse eh nichts anderes tue, als sie darauf zu prüfen, ob da mehrere Adressen drinstecken, und sie dann als „ReplyTo“ zu verwenden, lohnt sich das umkopieren mMn überhaupt nicht. Das kann ich auch direkt mit $_POST["emailAdresse"] machen, ohne (wieder mMn) den Überblick zu verlieren. Und dann noch ein Zweites kopieren der Variablen ($absenderadresse = $MailAdresse)?

          Und schon steht im Feld Absender, die Mail Adresse von deinem User / Kunden / Spamer, was auch immer :)

          Dass das mit einer großen Wahrscheinlichkeit nicht funktioniert und wie die Alternative aussieht, hat Sven ja schon gut verständlich geschrieben. @Clownvogel: Benutze also eine feste Absendeadresse und setze die Emailadresse des Benutzers ins ReplyTo-Feld (wie immer das Swiftmailer macht).

          Tschö, Auge

          PS: Das optisch kaputte Mention ist gemeldet (#474).

          --
          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
          Terry Pratchett, „Gevatter Tod“
          1. Hallo,

            Dass das mit einer großen Wahrscheinlichkeit nicht funktioniert und wie die Alternative aussieht, hat Sven ja schon gut verständlich geschrieben. @Clownvogel: Benutze also eine feste Absendeadresse und setze die Emailadresse des Benutzers ins ReplyTo-Feld (wie immer das Swiftmailer macht).

            dass das mit einer großen Wahrscheinlichkeit nicht funktioniert kann ich nicht bestätigen. Ich nutzte Swiftmailer schon seit Jahren und alle Kontaktformulare baue ich genau so auf, wie ich es geschrieben habe. Das Problem was Sven anspricht wird dadurch gelöst, dass man SMTP Daten hinterlegt

            $data = array();
            $data['smtp'] = array();
            $data['smtp']['host'] = '';
            $data['smtp']['port'] = '';
            $data['smtp']['username'] = '';
            $data['smtp']['password'] = '';
            

            dadurch wird sichergestellt, dass es eine eMail Adresse auf dem Server gibt.

            1. Hallo

              Dass das mit einer großen Wahrscheinlichkeit nicht funktioniert und wie die Alternative aussieht, hat Sven ja schon gut verständlich geschrieben.

              Ich nutzte Swiftmailer schon seit Jahren und alle Kontaktformulare baue ich genau so auf, wie ich es geschrieben habe. Das Problem was Sven anspricht wird dadurch gelöst, dass man SMTP Daten hinterlegt

              … dadurch wird sichergestellt, dass es eine eMail Adresse auf dem Server gibt.

              Welche Funktion erfüllt diese Emailadresse im Kontext von Swiftmailer?

              Tschö, Auge

              --
              Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
              Terry Pratchett, „Gevatter Tod“
              1. Hallo,

                Welche Funktion erfüllt diese Emailadresse im Kontext von Swiftmailer?

                um die e-Mail per SMTP zu verschicken. Dazu muss natürlich auf dem Server eine gültige Mail Adresse hinterlegt sein:

                http://swiftmailer.org/docs/sending.html

                1. Hallo

                  Welche Funktion erfüllt diese Emailadresse im Kontext von Swiftmailer?

                  um die e-Mail per SMTP zu verschicken. Dazu muss natürlich auf dem Server eine gültige Mail Adresse hinterlegt sein:

                  Ja, genau die, die als Absender der Email benutzt wird, wie es Sven ansprach. Also eine Emailadresse, die berechtigt ist, Emails über den benutzten Server zu versenden.

                  Die Adresse(n), die in SetFrom aufgelistet werden, werden für das ReplyTo genutzt. Sie wird, wenn einzeln angegeben, nur dann als Absendeadresse genutzt, wenn keine Adresse in SENDER angegeben wurde. Werden in SetFrom mehrere Adressen angegeben, muss SENDER ausgefüllt werden. Das kann aber, je nach Serverkonfiguration, schief gehen, weil im SetFrom eine Adresse angegeben wird, die auf dem Emailserver unbekannt/nicht zu Aktionen berechtigt ist. Das ist, worauf Sven hinaus wollte.

                  http://swiftmailer.org/docs/sending.html

                  Der hier führte noch weiter.

                  Tschö, Auge

                  --
                  Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                  Terry Pratchett, „Gevatter Tod“
                  1. Hallo,

                    Ja, genau die, die als Absender der Email benutzt wird, wie es Sven ansprach. Also eine Emailadresse, die berechtigt ist, Emails über den benutzten Server zu versenden.

                    nein, schau mal wie mein Code ausschaut

                    $data = array();
                    $data['smtp'] = array();
                    $data['smtp']['host'] = '';
                    $data['smtp']['port'] = '';
                    $data['smtp']['username'] = '';
                    $data['smtp']['password'] = '';
                    	
                    $data['subject'] = "Anfrage - Kontaktformular";	
                    	
                    $data['from'] 		= array('name' => $_POST['name'], 'email' => $_POST['email']);
                    $data['to'] 		= array('name' => '', 'email' => '');
                    $data['charset'] 	= 'utf-8';
                    

                    Der erste Bereich ist für den SMTP Krempel (wie wenn ich in Outlook eine Mail Adresse einrichte um damit Mails zu versenden).

                    Der zweite Teil, aber subject, kommen vom User bzw. vom Formular. Und schau mal was bei from steht.

                    (Kann natürlich auch sein, wir reden aneinander vorbei :) )

                    1. Hallo

                      $data['from'] = array('name' => $_POST['name'], 'email' => $_POST['email']);
                      

                      Der zweite Teil, aber subject, kommen vom User bzw. vom Formular. Und schau mal was bei from steht.

                      Soweit ist das schon klar.

                      Ich verstand dein „Dazu muss natürlich auf dem Server eine gültige Mail Adresse hinterlegt sein“ so, dass du in der Konfiguration des Swiftmailers eine dem per SMTP angesprochenen Server bekannte Adresse angegeben hast, die einer per Skript versendeten Email als die Absendeadresse hinzugefügt wird. Es ist nämlich tatsächlich so, wie Sven schrieb, dass viele Server Emails, die über sie versendet werden sollen, zurückweisen, wenn die Absendeadressen (From) nicht mit den Eintragungen über autorisierte Domains/Adressen übereinstimmen.

                      Tschö, Auge

                      --
                      Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
                      Terry Pratchett, „Gevatter Tod“
                    2. Hallo,

                      Ja, genau die, die als Absender der Email benutzt wird, wie es Sven ansprach. Also eine Emailadresse, die berechtigt ist, Emails über den benutzten Server zu versenden.

                      nein, schau mal wie mein Code ausschaut

                      $data = array();
                      $data['smtp'] = array();
                      $data['smtp']['host'] = '';
                      $data['smtp']['port'] = '';
                      $data['smtp']['username'] = '';
                      $data['smtp']['password'] = '';
                      	
                      $data['subject'] = "Anfrage - Kontaktformular";	
                      	
                      $data['from'] 		= array('name' => $_POST['name'], 'email' => $_POST['email']);
                      $data['to'] 		= array('name' => '', 'email' => '');
                      $data['charset'] 	= 'utf-8';
                      

                      Der erste Bereich ist für den SMTP Krempel (wie wenn ich in Outlook eine Mail Adresse einrichte um damit Mails zu versenden).

                      Der zweite Teil, aber subject, kommen vom User bzw. vom Formular. Und schau mal was bei from steht.

                      (Kann natürlich auch sein, wir reden aneinander vorbei :) )

                      Hallo Sara,

                      kommen deine Ausführungen alle hintereinander und ich habe schon eine Eingabemaske. Kommen diese ganzen "Befehle" vor der Eingabemaske oder wir ist das ganze aufgebaut. So wie ich das bis jetzt gemacht habe funktioniert es immer noch nicht.

                      1. Hallo,

                        kommen deine Ausführungen alle hintereinander und ich habe schon eine Eingabemaske. Kommen diese ganzen "Befehle" vor der Eingabemaske oder wir ist das ganze aufgebaut. So wie ich das bis jetzt gemacht habe funktioniert es immer noch nicht.

                        ehrlich gesagt verstehe ich deine Frage nicht wirklich. Auf meiner Seite sieht es so aus:

                        • Erst der PHP Code
                        • Danach das HTML Formular

                        Wenn du natürlich bei action="" eine andere Datei angegeben hast, kann dieses schon wieder ganz anders aussehen.

                        Du musst natürlich dafür sorgen, dass der PHP Code erst ausgeführt wird, wenn auf den Senden Button geklickt wurde

                        if(isset($_POST['abschicken'])){
                          // Hier dein PHP Code
                        }
                        

                        Am besten zu zeigst mal dein komplettes Script was du bis jetzt gemacht hast.

                        1. Hallo Sara

                          ja gerne Hier kommt die ganze Datei

                          <html>
                          <head>
                          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                          <title> Anmeldung </title>
                          <link rel="stylesheet" type="text/css" href="css/stylesheet.css">
                          </head>
                          <body>
                          <div id="Kopfleiste">
                          <h1> Ostergarten 2017 </h1>
                          </div>
                          <div id="menu">
                          <ul>
                          <li><a href="kalender.html">zurück</a></li>
                          </div>
                          
                          			<script src="js/jquery-1.10.2.min.js"></script>
                                      <script src="js/lightbox-2.6.min.js"></script>
                                      <link href="css/lightbox.css" rel="stylesheet" /></script></link>
                          			
                          <div id="inhalt">
                          <br>
                          
                          </div>
                           <?php
                           
                           $zieladresse = 'x.x@x.de';  
                          $_POST["emailAdresse"];
                          echo htmlspecialchars($_POST["emailAdresse"]);
                          $MailAdresse = $_POST["emailAdresse"];
                          $absenderadresse = $MailAdresse;
                           
                           $absendername = 'Formmailer'; 
                           
                           $betreff = 'Feedback';
                          
                           $urlDankeSeite = 'http://Danke1.html'; 
                          
                           $trenner = ":\t"; 
                          
                           
                           require_once "Swiftmailer-5.x/lib/swift_required.php"; // Swift initialisieren
                           
                           if ($_SERVER['REQUEST_METHOD'] === "POST") {
                           
                               $message = Swift_Message::newInstance(); // Ein Objekt für die Mailnachricht.
                           
                               $message
                                   ->setFrom(array($absenderadresse => $absendername))
                                   ->setTo(array($zieladresse)) // alternativ existiert setCc() und setBcc()
                                   ->setSubject($betreff);
                           $data = array();
                          $data['smtp'] = array();
                          $data['smtp']['host'] = '';
                          $data['smtp']['port'] = '';
                          $data['smtp']['username'] = '';
                          $data['smtp']['password'] = '';
                             
                             $mailtext = "";
                           
                               foreach ($_POST as $name => $wert) {
                                   if (is_array($wert)) {
                                           foreach ($wert as $einzelwert) {
                                           $mailtext .= $name.$trenner.$einzelwert."\n";
                                       }
                                   } else {
                                       $mailtext .= $name.$trenner.$wert."\n";
                                   }
                               }
                           
                               $message->setBody($mailtext, 'text/plain');
                           
                               $mailer = Swift_Mailer::newInstance(Swift_MailTransport::newInstance());
                               $result = $mailer->send($message);
                           
                          
                                  
                          $data['subject'] = "Anfrage - Kontaktformular";        
                                  
                          $data['from']                 = array('name' => $_POST['name'], 'email' => $_POST['email']);
                          $data['to']                 = array('name' => '', 'email' => '');
                          $data['charset']         = 'utf-8';
                          
                               if ($result == 0) {
                                   die("Mail konnte nicht versandt werden.");
                               }
                           
                               header("Location: $urlDankeSeite");
                               exit;
                           }
                           
                           header("Content-type: text/html; charset=utf-8");
                           
                           ?>
                          
                          
                           <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
                           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
                           <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
                               <head>
                                   <title>Einfacher PHP-Formmailer</title>
                                   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                               </head>
                               <body>
                                   <h1>Beispielformular</h1>
                                   <form action="" method="post">
                                       <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
                                       <dl>
                                           <dt>Ihr Name:</dt>
                                           <dd><input type="text" name="Versender" /></dd>
                                           <dt>Ihre E-Mail:</dt>
                                           <dd><input type="text" name="E-Mail" /></dd>
                                           <dt>Sie können:</dt>
                                           <dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd>
                                           <dt>Sie sind:</dt>
                                           <dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd>
                                           <dt>Sie mögen:</dt>
                                           <dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd>
                                           <dt>Bemerkungen:</dt>
                                           <dd><textarea name="Bemerkungen" rows="3" cols="20">Bemerkungen</textarea></dd>
                                       </dl>
                                       <!-- Ende der Beispielangaben -->
                                       <p>
                                       <input type="submit" value="Senden" />
                                       <input type="reset" value="Zurücksetzen" />
                                       </p>
                                   </form>
                               </body>
                           </html>
                          
      2. Moin!

        $absenderadresse = 'x@x.local'; was für eine adresse soll da hinein die Besucher der Hompage sollen mit ihrer eigen Adresse an die Zieladresse schreiben

        Im Wiki steht das hier:

         // Welche Adresse soll als Absender angegeben werden?
         // (Manche Hoster lassen diese Angabe vor dem Versenden der Mail ueberschreiben)
         $absenderadresse = 'ihrAndererName@EXAMPLE.com'; 
        

        Dein Wunsch wird nicht funktionieren. Die FROM-Adresse muss eine sein, die für den benutzen Mailserver berechtigt ist. Ganz früher, in den dunklen Spam-Zeiten, hat jeder Mailserver jedes FROM durchgelassen. Heutzutage ist der Spamfilter des empfangenden Mailservers in der Lage zu prüfen, ob der sendende Mailserver überhaupt die Erlaubnis hat, für irgendeine Domain Mails mit FROM zu versenden. Wenn nicht, lehnt er den Empfang ab. Ebenfalls checkt der sendende Mailserver, ob ihn Mails mit nicht erlaubten Domains verlassen sollen, und versendet diese einfach schon nicht.

        Das sind zwei einfache Gründe, warum bei dir die Mails nicht ankommen. Du kannst zwar versuchen, das in deinem Mailserver (der vermutlich sowohl Versand als auch Empfang gleichzeitig macht) umzukonfigurieren, aber vermutlich willst du irgendwann das Ganze auch im echten Internet benutzen - und dann geht's vermutlich nicht mehr so einfach.

        Du musst also eine FROM-Mailadresse wählen, die als technischer Absender einen gültigen Mailaccount auf dem sendenden Mailserver hat.

        Vermutlich wolltest du die User-Mailadresse dort eingetragen haben, damit du nach dem Mailempfang einfach auf "Antworten" klicken und zurückschreiben kannst. Dafür ist der Mail-Header "Reply-to" zuständig. Nimm einfach den, der hat das Spamfilterproblem nicht.

        $urlDankeSeite = 'Leere Seite für Bestätigung.htm'; ich habe eine Seite auf der Homepage diese ist aber nicht online

        Diese Seite muss mit HTTP erreichbar sein, sonst kommt keine Danke-Seite nach dem Abschicken im Browser. Verhindert nicht den Mailversand, ist aber unschön. Irgendeinen Server musst du ja sowieso ansprechen mit dem Browser, ansonsten geht der Formmailer ja nicht. Der kann also auch eine Danke-Seite hosten. "Online" im Sinne von "aus dem Internet erreichbar" muss die Seite nicht sein - wenn der Browser deinen Formmailer ansprechen kann, kommt er auch auf diese Dankeseite.

        Ich habe den Swiftmailer "swiftmailer-5.x genannt. Muss ich in dies Verzeichnis nur die Bibliothek (lib) lassen oder alles was ich heruntergeladen habe. Odr kommt der Inhalt des Ordners lib direkt in das Verzeichnis meiner ganzen Homepage-Seiten.

        Wenn du nicht klar abschätzen kannst, was SwiftMailer intern an Dateien braucht, lass das Downloadpaket komplett.

        Grüße Sven

  2. Hallo,

    Ich habe den Formmailer as self.html.wiki herunter kopiert sowie swiftmailer installiert. Aber leider kann ich keine Mails versenden. Was muss ich verändern damit ich Mails versenden kann.

    vielleicht solltest du dir mal diese Dokumentation und vor allem die Beispiele ansehen, dort wird alles genau erklärt: http://swiftmailer.org/docs/sending.html