Magento – Newsletter für Deutschland

Alles was Recht ist

Will man in Deutschland einen Newsletter versenden, so müssen sich die Abonennten über eine Double Opt In Funktion anmelden. Das bedeutet, dass der Eintrag in die Empfängerliste in einem zweiten Schritt bestätigt werden muss. Magento versendet dafür eine Email mit einem Link, den der Empfänger klicken muss. Erst dann ist er für den Empfang des Newsletters freigeschalten.

Bitte betrachtet diesen Beitrag als Anregung. Ich bin kein Programmierer und man kann das sicher eleganter lösen. Es funktioniert, und das war mir wichtig.

Einstellungen in Magento

Möchte man diese Double Opt In Funktion in Magento nutzen, muß das zunächst in der Administration konfiguriert werden.

Administration -> Konfiguration -> Newsletter ->
Magento Newsletter Admin

Bei “Bestätigung nötig” stellt man auf “JA”. Wer jetzt denkt das reicht, liegt leider falsch. Denn out of the Box funktioniert das in Magento wie jetzt wie folgt:

Es gibt folgende Fallunterscheidungen:

Gast trägt sich in Newsletter
In diesem Falle verschickt Magento jetzt die Mail, deren Empfang der Empfänger bestätigen muss, um für den Newsletter freigeschaltet zu sein. Double Opt In = Perfekt.

Bereits registrierter User (Bestandskunde) trägt seine Email Adresse ein
Dies ist immer dann der Fall, wenn der entsprechende Kunde bereits einmal im Shop bestellt hat und bereits über ein Kundenkonto verfügt. Ist die eingetragene Email Adresse also bereits mit einem Benutzerkonto registriert versendet Magento KEINE Mail, die der Empfänger bestätigen muss. Der Empfänger ist sofort für den Newsletter freigeschaltet. Völlig egal, dass wir in der Admin “Bestätigung notwendig” auf “Ja” gestellt haben. KEIN Double Opt In = SCHLECHT.

Editieren der Model Datei

Um oben genanntes Verhalten zu “fixen”, müssen wir etwas in der Subscriper.php vom Newsletter rumhacken.

Damit meine Änderungen bei einem nächsten Update von Magento nicht überschrieben werden, kopiere ich mir die Datei inklusive Verzeichnisstruktur aus dem “core” ins “local” Verzeichnis.

Quelle: app/code/core/Mage/Newsletter/Model/Subscriber.php

Ziel: app/code/local/Mage/Newsletter/Model/Subscriber.php

In der Subscriper.php wird an mehreren Stellen geprüft, ob sich die Email Adresse, die gerade im Formular eingetragen wurde, bereits in der Datenbank befindet. Dies kann zum Beispiel dann vorkommen, wenn der entsprechende Kunde bereits einmal im Shop bestellt hat und bereits über ein Kundenkonto verfügt. Wenn die Email Adresse also bereits mit einem Benutzerkonto registriert ist, versendet Magento keine Authorisierung mehr, sondern schaltet den Benutzer sofort für den Newsletter frei (wie oben bereits beschrieben). Da wir uns in Deutschland natürlich an deutsches Recht halten müssen, wollen wir das nicht.

Wir editieren in  $customerSession->isLoggedIn() Zeile 311

Vorher:

$this->setStatus(self::STATUS_SUBSCRIBED);

Nachher:

$this->setStatus(self::STATUS_NOT_ACTIVE);

Außerdem noch Zeile 315:

Vorher:

$this->setSubscriberStatus(self::STATUS_SUBSCRIBED);

Nachher:

$this->setSubscriberStatus(self::STATUS_NOT_ACTIVE);

Komplett:

if ($customerSession->isLoggedIn()) {
            $this->setStoreId($customerSession->getCustomer()->getStoreId());
            $this->setStatus(self::STATUS_NOT_ACTIVE);
            $this->setCustomerId($customerSession->getCustomerId());
        } else if ($customer->getId()) {
            $this->setStoreId($customer->getStoreId());
            $this->setSubscriberStatus(self::STATUS_NOT_ACTIVE);
            $this->setCustomerId($customer->getId());
        } else {
            $this->setStoreId(Mage::app()->getStore()->getId());
            $this->setCustomerId(0);
            $isNewSubscriber = true;
        }

Wenn wir die Änderung nun speichern sind wir damit schon mal fertig. Magento versendet jetzt für jede einzutragende Emailadresse die Mail zum Bestätigen.

Jetzt gibt jetzt also den Double Opt In für:
- Gäste
- bereits registrierte Kunden

Anmerkung:
Trägt sich ein Nutzer mit einer Email Adresse in den Newsletter ein, der bereits einmal eingetragen ist (im Newsletter), so wird sein Status wieder reseted und er erhält eine neue Mail mit Bitte um Bestätigung. Die Email Adresse ist also niemals doppelt eingetragen.

Erfolgsmail versenden

Wenn die Eintragung in die Abonnentenliste bestätigt wurde gibt es auf der Seite im Shop eine kurze Bestätigung. Jetzt wollen wir noch eine Bestätigungsmail versenden. “Anmeldung im Newsletter”. Das macht Magento auch nicht automatisch für alle. Wir müssen also noch in der gleichen Datei (app/code/local/Mage/Newsletter/Model/Subscriber.php) dafür sorgen, dass die Mail versendet wird:

In public function confirm($code) ab Zeile 417 fügen wir ein:

$this->sendConfirmationSuccessEmail();

Sieht dann so aus:

public function confirm($code)
    {
        if($this->getCode()==$code) {
            $this->setStatus(self::STATUS_SUBSCRIBED)
                ->setIsStatusChanged(true)
                ->save();
                $this->sendConfirmationSuccessEmail();
            return true;
        }
        return false;
    }

In diese Email habe ich dann zusätzlich den Link zum abbestellen des Newsletters gepackt und darum gebeten, die Mail aufzuheben. Ein Formular, mit dem sich Gäste auf der Webseite aus dem Newsletter wieder austragen können, werde ich demnächst gesondert erstellen.

Meine komplette Subscriber.php habe ich hier auch nochmal zum Download angehängt.

Ich übernehme keinerlei Verantwortung für eventuelle Fehlfunktionen!

Über Anregungen und Verbesserungsvorschläge freue ich mich.

Update

Damit eingeloggte Kunden über Ihren Benutzerbereich den Newsletter einfach via Checkbox abonnieren können (und trotzdem durch das Double Opt Inn müssen) habe ich noch die entsprechende Datei komplett umgestrickt.

Die Änderung betrifft die Datei: app/design/frontend/default/default/ template/customer/form/newsletter.phtml

<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
<div class="category-head rounded">
<h2><?php echo $this->__('Newsletter Subscription') ?></h2>

<?php if($this->getIsSubscribed()): ?>
<div class="inner-box">
<form action="<?php echo $this->getAction() ?>" method="post" id="form-validate">
<?php echo $this->getBlockHtml('formkey')?>
<p><input type="checkbox" name="is_subscribed" id="subscription" value="1" title="<?php echo $this->__('General Subscription') ?>"  <?php if($this->getIsSubscribed()): ?> checked="checked"<?php endif ?> /> <label for="subscription">Ja, ich möchte den Newsletter erhalten.</label></p>
<p>Sie sind momentan für unseren Newsletter angemeldet. Wenn Sie das Häckchen in der Checkbox entfernen und speichern, werden Sie zukünftig keine Newsletter mehr empfangen.</p>
<div class="button-set">
<a href="<?php echo $this->getBackUrl() ?>" class="link-face-button">&laquo; <?php echo $this->__('Back') ?></a>
<button type="submit" class="form-button"><span><?php echo $this->__('Save') ?></span></button>
</div>
</form>
</div>
<script type="text/javascript">
//<![CDATA[
var dataForm = new VarienForm('form-validate', true);
//]]>
</script>
<? else: ?>
<div class="inner-box">
<style>
#advice-required-entry-mycb {position: absolute; margin-top: -70px;}
</style>
<p>Sie sind momentan <strong>nicht</strong> für unseren Newsletter angemeldet. Sie können hier den Newsletter mit Ihrer hinterlegten E-Mail Adresse (<i><?php echo $this->htmlEscape($this->getCustomer()->getEmail()) ?></i>) abonieren.</p>
<fieldset class="newsletter">
<form action="<?php echo $this->getUrl('newsletter/subscriber/new') ?>" method="post" id="newsletter-validate">
<input id="mycb" class="required-entry" type="checkbox" value="1" title="<?php echo $this->__('General Subscription') ?>" /> <label for="subscription">Ja, ich möchte den Newsletter erhalten.</label>
<script type="text/javascript">
<!--
var newsletterSubscriberForm = new VarienForm('newsletter-validate');
//-->
</script>
<input name="email" id="newsletter" value="<?php echo $this->htmlEscape($this->getCustomer()->getEmail()) ?>" type="hidden" class="required-entry validate-email input-text" />
<div class="button-set">
<a href="<?php echo $this->getBackUrl() ?>" class="link-face-button">&laquo; <?php echo $this->__('Back') ?></a>
<input type="submit" value="Speichern" alt="<?php echo $this->__('Subscribe') ?>" class="form-button" />
</div>
</form>
</fieldset>
</div>
<? endif ?>
</div>
  |  
  1. Daniel Sasse (ds_1984) sagte am :

    Sehr guter Beitrag, DANKESCHÖN! :-)

  2. Rainer Funk sagte am :

    Hi Sebastian,
    danke für den Beitrag.

    Wäre es nicht richtiger, dass man zusätzlich noch die Abfrage einbaut ob “Double Opt In” an ist? Weil sonst bekommt man die Bestätigungsmail auch dann wenn es aus ist.

    Sprich Zeile 301 bis einschließlich 305 kopieren und damit $this->setStatus(self::STATUS_SUBSCRIBED);
    ersetzen.

    Sprich

    if ($customerSession->isLoggedIn()) {
    $this->setStoreId($customerSession->getCustomer()->getStoreId());
    if (Mage::getStoreConfig(self::XML_PATH_CONFIRMATION_FLAG) == 1) {
    $this->setStatus(self::STATUS_NOT_ACTIVE);
    } else {
    $this->setStatus(self::STATUS_SUBSCRIBED);
    }
    $this->setCustomerId($customerSession->getCustomerId());
    }

    Gruß
    Rainer

  3. Gumbo sagte am :

    Super Anleitung. Vielen Dank!!

  4. admin sagte am :

    @Rainer Funk,
    Das ist natürlich eine gute Idee. Das habe ich nicht berücksichtigt, weil für mich die Frage nicht relevant war. Bei meinem Projekt, bzw. in Deutschland, ist es nunmal zwingend notwendig. Egal, was in der Admin eingestellt ist.

  5. Pingback: shopTags » 20×3 Magento Linktipps

  6. Kai sagte am :

    Hallo, wäre es für den Benutzerbereich nicht evtl. besser, die Funktion subscribeCustomer in der Subscriber.php zu überschreiben. Damit würde man auch erreichen, dass der neue Benutzer, der bei der Registrierung den Newsletter aktiviert, auch erst die Bestätigungs-EMail bekommt. Ich habe dazu in Zeile 376:
    if($customer->hasIsSubscribed()) {
    $status = $customer->getIsSubscribed() ? self::STATUS_SUBSCRIBED : self::STATUS_UNSUBSCRIBED;
    }

    durch

    if($customer->hasIsSubscribed()) {
    if (Mage::getStoreConfig(self::XML_PATH_CONFIRMATION_FLAG) == 1) {
    $status = $customer->getIsSubscribed() ? self::STATUS_NOT_ACTIVE : self::STATUS_UNSUBSCRIBED;
    } else {
    $status = $customer->getIsSubscribed() ? self::STATUS_SUBSCRIBED : self::STATUS_UNSUBSCRIBED;
    }
    }

    und in Zeile 406 noch:

    elseif ($this->getIsStatusChanged() && $status == self::STATUS_NOT_ACTIVE) {
    $this->sendConfirmationRequestEmail();
    }

    ergänzt. Gibt es nur noch ein Problem für Benutzer, die den Status “Nicht aktiviert” haben. Dann wird keine E-Mail versendet, da sich der Status nicht ändert. Da bin ich gerde noch am herumprobieren…

  7. Ulli Feldmann sagte am :

    Vielen Dank für den Beitrag und auch die Kommentare. Hat mir einige Denkarbeit und somit einen Haufen Zeit gespart. ;)

  8. admin sagte am :

    Hey, danke für die vielen positiven Kommentare.

  9. eunecte sagte am :

    Vielen Dank auch von mir. Hat viel Ärger erspart.

  10. daniel sagte am :

    vielen dank für deinen beitrag, funktioniert super.

  11. tecupio sagte am :

    Klasse!!!!! Vielen Dank

  12. Chrisitian sagte am :

    Coole Anleitung, aber gibt es schon Neuigkeiten in Richtung eines Artikels bezüglich “Abmeldung vom Newsletter für Gäste”?

  13. peter sagte am :

    Das mit der Abmeldung des Newsletters für gäste hab ich folgendermaßen gemacht:
    Bei mir ab Zeile 300
    if (!$this->getId() || $this->getStatus()==self::STATUS_UNSUBSCRIBED || $this->getStatus()==self::STATUS_NOT_ACTIVE) {
    if (Mage::getStoreConfig(self::XML_PATH_CONFIRMATION_FLAG) == 1) {
    $this->setStatus(self::STATUS_NOT_ACTIVE);
    } else {
    $this->setStatus(self::STATUS_SUBSCRIBED);
    }
    $this->setSubscriberEmail($email);
    }else{
    $this->setSubscriberStatus(self::STATUS_UNSUBSCRIBED)
    ->save();
    $this->sendUnsubscriptionEmail();
    return $this;
    }

    also den Else-Zweig noch angefügt, das heißt wenn ein Gast schon angemeldet ist wird er über die Newsletterbox beim erneuten Eintrag seiner E-Mail automatisch abgemeldet und bekommt auch eine Abmeldebestätigung per mail. Der Button in der box heißt bei mir jetzt nicht mehr”anmelden” sondern “An-/Abmelden”. Aus dem Kundenaccount hab ich den Newsletter ganz rausgeschmissen, d.h. er taucht dort nicht mehr auf, man kann sich nur noch über die Box an bzw. abmelden egal ob Kunde oder Gast. Die Newsletterbox ist bei mirständig präsent, egal ob Gast oder Kunde. Das rausschmeisen aus dem Kundenaccount geht folgendermaßen:
    Newsletter.xml ab Zeile 48

    <!– newsletternewsletter/manage/Newsletter Subscriptions –>

    auskommentieren, dann ist der link in der Kundenbox weg. Damit der Newsletter auch auf der Willkommensseite weg ist in der customer/account/dashboard/info.phtml die zweite spalte auskommentieren oder ganz rausschmeisen:

    <!–
    __(‘Newsletters’) ?>
    <a href=”getUrl(‘newsletter/manage’) ?>”>__(‘Edit’) ?>

    getIsSubscribed() ): ?>
    __(“You are currently subscribed to ‘General Subscription’.”) ?>

    __(‘You are currently not subscribed to any newsletter.’) ?>

    –>

    Die fehlermeldung die beim Abmelden kommt(“Beim Anmelden trat ein Fehler auf”) hab ich einfach umgeschrieben in “Der Newsletter wurde erfolgreich abgemeldet”. Das wäre noch ein verbesserungswürdiger Punkt, das bei einer Abmeldung die richtige Meldung kommt, wenn einer weiß wie’s geht bitte posten.

  14. b_nice sagte am :

    Das ist WUNDERBAR! Das Tutorial hat mir Meilen weitergeholfen. (Hier sollte es irgendwo einen Donate-Button geben!)

    Danke noch mal!

    (Kleiner Hinweis zur newsletter.phtml: abonnieren, Häkchen)

  15. Pingback: Magento Newsletter Anleitungen, Tutorials und Extensions » Von Michael Karl » Magento

  16. nikl sagte am :

    Also, ich bekomms nicht hin – hat sich da bei Version 1.4.0.1 etwas geändert? Wenn ich es so mache, wie hier beschrieben, bekomme ich weiterhin nur die Bestätigungsmail, keine Aktivierungsmail.

  17. nikl sagte am :

    Wenn ich jetzt Kais Comment lese, wird mir klar, warum es nicht funktioniert. Die hier beschriebenen Änderungen betreffen die Situation, dass der Newsletter bei einer Neuregistrierung abonniert wird ja gar nicht! Dann ist das ganze aber auch irgendwie fürn A****, oder?

  18. nikl sagte am :

    Sorry für die Kettenposts aber ich hab mich jetzt nochmal mit der Sache beschäftigt und habe es auch mehr oder weniger hinbekommen. Mein Problem ist, dass ich gerne die Funktion die Kai hier gepostet hat umsetzen möchte. Ich hab das auch soweit hinbekommen, allerdings bekommt der Kunde nun nachdem er seine Mailadresse bestätigt hat gleichzeitig eine Newsletteranmeldung- sowieo eine Newsletterabmeldung-Mail. Ich hab auch gesehen, dass die Datei sich in der aktuellen Version stark geändert hat, evtl hat das damit zu tun? – hat irgendjemand Kais Code in der 1.4.0.1 komplett zum Laufen gebracht?

  19. fatsche sagte am :

    Herzlichen Dank für dieses Tutorial/ diesen Blog. Hat sehr , sehr geholfen -und vorallem es funzt!!! ;) ))

  20. mk sagte am :

    hallo, interessanter Artikel!
    Ist das in der aktuellen Magento-Version immer noch zu beachten und zu ändern? (Okt/2010)

  21. loeffel sagte am :

    In v1.5.1.0 findet man in der subcriber.php folgenden Hinweis: // if user subscribes own login email – confirmation is not needed
    Entfernt man den dazugehörigen Block komplett und fügt dann noch die Zeile $this->sendConfirmationSuccessEmail(); wie oben beschrieben ein, funktioniert das ganze FAST für magento 1.5.1.0. Nur während der Registrierung, will es noch nicht…

  22. finkkraft sagte am :

    meine Lösung für Version 1.5.1.0:
    in function subscribe($email) die Zeile
    $isOwnSubscribes = ($customerSession->isLoggedIn() && $ownerId == $customerSession->getId());
    auskommentieren – damit erfüllt man die Double Opt In Funktion für eingeloggte user die das textfeld nutzen für die Newsletteranmeldung.
    in function subscribeCustomer($customer) die Zeile
    $status = $customer->getIsSubscribed() ? (!is_null($confirmation) ? self::STATUS_UNCONFIRMED : self::STATUS_SUBSCRIBED) : self::STATUS_UNSUBSCRIBED;
    ändern in
    $status = $customer->getIsSubscribed() ? (!is_null($confirmation) ? self::STATUS_UNCONFIRMED : self::STATUS_NOT_ACTIVE) : self::STATUS_UNSUBSCRIBED;
    und in der letzten if – elseif folgenden elseif hinzufügen
    elseif ($this->getIsStatusChanged() && $status == self::STATUS_NOT_ACTIVE) {
    $this->sendConfirmationRequestEmail();
    }

    damit wird der Status während der Kunden-Registrierung auf ‘nicht aktiv’ gesetzt und die entsprechende mail versand – gleiches gilt für die Newsletteranmeldung im Kundenbereich

  23. Daniel Sasse sagte am :

    Der Bug mit der Bestätigung (Newsletter Anmeldung) tritt so in der Form auch in Magento 1.5er Versionen auf wie ich in mehreren Instanzen sehen und dank dieses Beitrags beheben konnte.

    Danke!

    LG, Daniel

  24. Oliver sagte am :

    Danke für die Anleitung, das hat viel Zeit erspart, funktioniert selbst in 1.6.2 noch.

    Einzige Änderung die ich zusätzlich gemacht habe:
    $this->save();
    if ($isConfirmNeed === true
    && $isOwnSubscribes === false
    ) {
    $this->sendConfirmationRequestEmail();
    } else {
    $this->sendConfirmationSuccessEmail();
    }

    in

    if ($isConfirmNeed === true
    && $isOwnSubscribes === false
    ) {
    $this->sendConfirmationRequestEmail();
    } else {
    $this->sendConfirmationRequestEmail();
    }

    geändert

  25. Markus sagte am :

    hallo,
    bei mir wird alles versendet.nur der newsletter selbst geht nicht rauß????
    ich verzweifel da schon seit tagen dran?

    danke vorab für die hilfe^^

  26. karat sagte am :

    Danke Finkkraft!

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>