YouTube

Mit dem Laden des Videos akzeptieren Sie die Datenschutzerklärung von YouTube.
Mehr erfahren

Video laden

In diesem Video zeige ich euch, wie wir ein kleines Formular basteln und allen bestätigten E-Mail-Adressen einen Newsletter zukommen lassen können.

+++ WICHTIG: Damit die mail-Funktion eine Mail versenden kann, muss auf dem System, auf dem sie ausgeführt wird, ein Mailserver eingerichtet sein. Somit funktioniert diese Methode standardmäßig nicht, wenn man gängige Tools wie XAMPP lokal nutzt. Auf einem Webserver/Webspace sollte es allerdings ohne weitere Probleme funktionieren +++


Quellcode herunterladen


Quellcode index.php:

<?php
    require_once 'database.php';
    $db = new DB();

    if($_POST['eintragen']) {
        $name = $_POST['name'];
        $email = $_POST['email'];
        $optin_key = sha1(uniqid());

        if($db->subscribeToNewsletter($name, $email, $optin_key)) {
            $betreff    = "Bitte bestätige deine Newsletter-Anmeldung bei TutCubeDE";
            $header     = [
                'From' => 'TutCubeDE <info@tutcube.de>',
                'Reply-To' => 'info@tutcube.de',
                'Content-Type' => 'text/html'
            ];
            $inhalt     = " Hey du!
                            <br />
                            Cool, dass du Dich für den Newsletter angemeldet hast.
                            <br /><br />
                            Bitte bestätige kurz mit Klick auf folgenden Link deine Anmeldung für den besten Newsletter 
                            der Welt: 
                            <a href='https://tutcube.de/dev/newsletter/newsletter_confirm.php?key=" . $optin_key . "'>
                                https://tutcube.de/dev/newsletter/newsletter_confirm.php?key=" . $optin_key . "
                            </a>
                            ";

            if(mail($email, $betreff, $inhalt, $header)) {
                echo "Vielen Dank! Wir haben Dir eine Mail gesendet. Bitte bestätige die Anmeldung!";
            } else {
                echo "Leider konnten wir Dir gerade keine Mail senden, da ist wohl etwas schief gelaufen :(";
                // @todo Datensatz aus Datenbank löschen
            }
        } else {
            echo "Leider trat ein Problem beim Eintragen in den Newsletter auf. Bitte probiere es später erneut! :(";
        }
    }
?>

<html>
    <head>
        <title>Newsletter</title>
        <meta charset="UTF-8"> 
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <div id="wrapper" class="shadow">
            <h1>Zum Newsletter anmelden</h1>
            <form action="index.php" method="POST">
                <table border="0">
                    <tr>
                        <td>Name:</td>
                        <td><input type="text" name="name" required /></td>
                    </tr>
                    <tr>
                        <td>E-Mail:</td>
                        <td><input type="email" name="email" required /></td>
                    </tr>
                    <tr>
                        <td colspan="2"><input type="checkbox" name="datenschutz" value="datenschutz_ok" required /> Mit Anmeldung zum Newsletter stimme ich den Datenschutzbestimmungen zu. Der Newsletter wird ausschließlich dazu verwendet, Dich über neue Inhalte von TutCubeDE zu informieren. Gelegentlich können auch interessante Inhalte von oder über TutCubeDE verteilt werden.</td>
                    </tr>
                    <tr>
                        <td colspan="2"><input type="submit" value="Eintragen" name="eintragen" /></td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>

Quellcode database.php:

<?php
    class DB {
        private static $db_username 	= "c1newsletter";
        private static $db_password 	= "fgwgjMQ!4RD3";
        private static $db_host 		= "localhost";
        private static $db_name			= "c1newsletterdb";
        private static $db;

        function __construct() {
            try {
                self::$db = new PDO("mysql:host=" . self::$db_host . ";dbname=" . self::$db_name,  self::$db_username , self::$db_password);
            } catch(PDOException $e) {
                echo "Datenbankverbindung gescheitert!";
                die();
            }
        }

        function subscribeToNewsletter($name, $email, $optin_key) {
            $stmt = self::$db->prepare("INSERT INTO newsletter_user (name, email, optin_key) VALUES(:name, :email, :optin_key)");
            $stmt->bindParam(":name", $name);
            $stmt->bindParam(":email", $email);
            $stmt->bindParam(":optin_key", $optin_key);

            if($stmt->execute() && $stmt->rowCount()) {
                return true;
            } else {
                return false;
            }
        }

        function confirmOptinKey($optin_key) {
            $stmt = self::$db->prepare("UPDATE newsletter_user SET bestaetigt=1 WHERE optin_key=:optin_key");
            $stmt->bindParam(":optin_key", $optin_key);

            if($stmt->execute() && $stmt->rowCount()) {
                return true;
            } else {
                return false;
            }
        }

        function checkConfirmOptinKey($optin_key) {
            $stmt = self::$db->prepare("SELECT email, bestaetigt FROM newsletter_user WHERE optin_key=:optin_key");
            $stmt->bindParam(":optin_key", $optin_key);

            if($stmt->execute()) {
                return $stmt->fetch();
            } else {
                return false;
            }
        }

        function getAllConfirmedNewsletterEmails() {
            $stmt = self::$db->prepare("SELECT email, name FROM newsletter_user WHERE bestaetigt=1");

            if($stmt->execute()) {
                return $stmt->fetchAll(PDO::FETCH_ASSOC);
            } else {
                return false;
            }
        }
    }

Quellcode newsletter_confirm.php:

<?php
    require_once 'database.php';
    $db = new DB();

    $key = $_GET['key'];

    if($key == "") {
        echo "Kein Opt-In-Key angegeben!";
        exit();
    }

    $check_optin_key = $db->checkConfirmOptinKey($key);

    if($check_optin_key) {
        if($check_optin_key['bestaetigt']) {
            // wurde schon bestätigt
            echo "Deine E-Mail-Adresse (" . $check_optin_key['email'] . ") wurde bereits erfolgreich bestätigt!";
        } else {
            if($db->confirmOptinKey($key)) {
                echo "E-Mail erfolgreich bestätigt.";
            } else {
                echo "E-Mail konnte nicht bestätigt werden!";
            }
        }
    } else {
        echo "Keine E-Mail zu diesem Key vorhanden!";
    }

Quellcode send_newsletter.php:

<?php
    require_once 'database.php';
    $db = new DB();

    if($_POST['senden']) {
        $betreff = $_POST['betreff'];
        $inhalt = $_POST['emailtext'];

        $newsletterUser = $db->getAllConfirmedNewsletterEmails();

        if(!empty($newsletterUser)) {
            $header     = [
                'From' => 'TutCubeDE <info@tutcube.de>',
                'Reply-To' => 'info@tutcube.de',
                'Content-Type' => 'text/html'
            ];

            foreach($newsletterUser as $user) {
                $email = $user['email'];
                if(mail($email, $betreff, $inhalt, $header)) {
                    echo "Erfolgreich Newsletter zu <strong>" . $email . "</strong> gesendet!<br />";
                } else {
                    echo "Newsletter zu <strong>" . $email . "</strong> konnte nicht gesendet werden!<br />";
                }
            }
        } else {
            echo "Keine E-Mail-Adresse zum Newslettererhalt vorhanden!";
        }
    }
?>

<html>
    <head>
        <title>Newsletter</title>
        <meta charset="UTF-8"> 
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <div id="wrapper" class="shadow">
            <h1>Newsletter an alle senden</h1>
            <form action="send_newsletter.php" method="POST">
                <table border="0">
                    <tr>
                        <td>Betreff:</td>
                        <td><input type="text" name="betreff" required /></td>
                    </tr>
                    <tr>
                        <td>E-Mail-Text:</td>
                        <td><textarea type="email" name="emailtext" rows="20" cols="50" required></textarea></td>
                    </tr>
                    <tr>
                        <td colspan="2"><input type="submit" value="Senden" name="senden" /></td>
                    </tr>
                </table>
            </form>
        </div>
    </body>
</html>

Quellcode style.css:

body {
    margin-top: 20px;
    font-family: Arial, Helvetica, sans-serif;

    background: #70737c;
}

#wrapper {
    margin-left: auto;
    margin-right: auto;
    width: 900px;
    background-color: #fefefe;
    padding: 40px;
}

.shadow {
    -webkit-box-shadow: 0px 0px 10px #000;
    -moz-box-shadow: 0px 0px 10px #000;
    box-shadow: 0px 0px 10px #000;
}

.shadow-menu {
    -webkit-box-shadow: 0px 0px 3px #000;
    -moz-box-shadow: 0px 0px 3px #000;
    box-shadow: 0px 0px 3px #000;
}