RSS Typo3 und Probleme mit td_newsletter

verfasst 30.07.2008 von MediaCix | kurze URL: /t341 | 13 Kommentare

Da gibt es das Newsletter-Modul td_newsletter für Typo3. Diese wird bei typo3.org/extensions/ auch als Stable ausgezeichnet. Leider ist dem nicht so, denn diese Erweiterung ist alles anders als Stable. So gibt es zum Teil Probleme beim E-Mail-Versand wenn der Status 10 beträgt. HTML-Mails werden gleich gar nicht versendet, obwohl es dafür eine Option gibt. Nun habe ich mir das Teil mal vorgenommen und habe auf einige Fehler gefunden.

Der erste Fehler ist der Mail-Status 10.
Beim bearbeiten von Einträgen waren plötzlich eine Adressen mit diesem Status versehen.
Der Witz an der Geschichte ist aber, dass mit diesem Status keine Mails versendet werden.
Der Fehler hier liegt in der Datei class.tx_tdnewsletter_pi1.php

Etwa in Zeile 67 gibt es diesen Kommentar:

//Case 1 email already in use


In der nächsten Zeile steht der PHP-Code, wo der Status abgefragt wird.
Hier ist zusätzlich der Status 10 mit abzufragen:

» PHP
<?php
$res 
$GLOBALS['TYPO3_DB']->exec_SELECTquery(
 
'email'
 
'tt_address'
 
'email="'.strtolower(t3lib_div::_GP("email")).'" 
 AND (tx_tdnewsletter_newsletter=1 OR tx_tdnewsletter_newsletter=10)'
);
?>


Etwa in Zeile 106 gibt es diesen Kommentar:

//Case 1 user has already been validated and click the email link again


In der nächsten Zeile steht der PHP-Code, wo der Status nochmal abgefragt wird.
Hier ist zusätzlich der Status 10 nochmal mit abzufragen:

» PHP
<?php
$res 
$GLOBALS['TYPO3_DB']->exec_SELECTquery(
 
'*'
 
'tt_address''MD5(CONCAT(tstamp,",",email))="'.t3lib_div::_GP("h").'" 
 AND (tx_tdnewsletter_newsletter=1 OR tx_tdnewsletter_newsletter=10)'
);
?>


Und wer gerade beim umschreiben ist, kann gleich noch einen Schönheitsfehler mit ausbessern.
Etwa in Zeile 55 finden wir diesen Code:

» PHP
<?php
if(!ereg("^[_a-zA-Z0-9-]+(.[_a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+.)+([a-zA-Z]{2,4})$",t3lib_div::_GP("email")))
?>


Da wir als erfahrende Programmierer wissen, dass ereg() oder eregi() veraltet ist, sollte man hier gleich auf preg_match() umschreiben.

» PHP
<?php
if (!preg_match("~^[_a-z0-9-]+(.[_a-z0-9-]+)*@([a-z0-9-]+.)+([a-z]{2,4})$~i",t3lib_div::_GP("email"), $test) )
?>


Und wer wirklich fit in der Programmierung ist, kann das ganze noch verbessern.
Aber nun zurück zum eigentlichen Problem mit td_newsletter.
Nun sollten auch alle Mails mit Status versendet werden.

Das nächste Problem ist das versenden von HTML-Mails.
Hier gibt es 2 Möglichkeiten:
- HTML-Text direkt eingeben und Option HTML anklicken
- HTML-Datei hochladen

Beim Newsletter td_newsletter Version 0.0.5 geht beides gar nicht :(
Über Stunden habe ich geknobbelt, warum bei Eingabe von HTML-Code und Häckchen bei HTML nichts passiert. Es wird zwar eine Mail versendet, aber im Mail-Programm sieht man nichts.

Datei ext/td_newsletter/mod1/index.php
Suche die Zeile mit der Funktion:

» PHP
<?php
function createMail()
?>


Etwas weiter unten steht dann:

» PHP
<?php
$Typo3_htmlmail 
t3lib_div::makeInstance("t3lib_htmlmail");
$Typo3_htmlmail->messageid '<'.md5(microtime()).'@domain.ltd>';
?>


Dies muss geändert werden in:

» PHP
<?php
$Typo3_htmlmail 
t3lib_div::makeInstance("t3lib_htmlmail");
$Typo3_htmlmail->start();
$Typo3_htmlmail->messageid '<'.md5(microtime()).'@domain.ltd>';
?>


Jetzt werden erstmal HTML-Mails mittels direkter Eingabe versendet, und kommen auch als HTML-Mail an. Jedoch der Upload einer HTML-Datei geht immer noch nicht.

Zunächst hatte ich mich gewundert, dass die Variable $_FILES immer leer ist, wenn eine Datei hochgeladen wird. Die Schwachstelle liegt in der index.php welche im Ordner mod1 liegt. In der Version 0.0.5 ist hier der HTML-Code so schlamperhaft, dass wirklich nichts funktionieren kann!

Der eigentliche Fileupload wird durch das 2. Formular erledigt.
In der Funktion

» PHP
<?php
function showNewsletterForm()
?>


ist das Formular wo wir unsere Eingaben machen können.
Hier fehlt schonmal

enctype="multipart/form-data"


was zum Upload aber benötigt wird.

Beim Testen ging aber die Variable $_FILES immer noch nicht.
In der Datei index.php gibt es 2 Formulare, aber nur das letzte Formular wird mit

</form>


beendet. Das erste Formular hängt irgendwie in der Luft, und ist mit einer Select-Box versehen. Durch die Anordnung der Formulare im HTML-Quelltext, wird das 2. Formular mit enctype="multipart/form-data" gar nicht benutzt :(

Also habe ich etwas umgeschrieben:

» PHP
<?php
function showNewsletterForm() {
 global 
$LANG;
 
$content =
</
form>
<
form action="?" name="form" enctype="multipart/form-data" method="post">
?>


Durch den Zusatz von

</form>


wird das 1.Formular vom 2.Formular getrennt. Und nun steht auch die Variable $_FILES zur Verfügung :) Aber mein Upload-File kommt immer noch nicht an :(

Der nächste Fehler steht in der Funktion

» PHP
<?php
function createMail()
?>


und ist totaler Mist. Etwas weiter unten wird mit

» PHP
<?php
if ($GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["message"]) {
 
$Typo3_htmlmail->theParts["html"]["content"] = $GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["message"]; // Fetches the content of the page
} else {
 
$Typo3_htmlmail->fetchHTML($GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["file"]);
}
?>


abgefragt, ob ein HTML-Text oder ein Upload-File übertragen wurde.

Zunächst habe ich mal alle $GLOBALS["HTTP_POST_VARS"] in der Datei in $_POST umgeschrieben :)
So steht in Zeile 258:

» PHP
<?php
if($GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["html"] || $GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["file"])
?>


Dies wurde erstmal geändert in:

» PHP
<?php
if($_POST["td_newsletter"]["html"] || $_POST["td_newsletter"]["file"])
?>


Daraus ergibt sich der die Variable $_POST["td_newsletter"]["file"].
Der Witz ist aber, dass bei $_POST["td_newsletter"]["file"] nur der Dateiname übertragen wird.
Wie soll das der Inhalt der Datei vom HTML-File-Upload verarbeitet werden?

Da nun die Variable $_FILES wieder funktioniert, wurden alle Angaben mit $_POST["td_newsletter"]["file"] erstmal in $_FILES["td_newsletter_file"]["tmp_name"] umgeschrieben.
Wichtig! Den Wert td_newsletter_file gibt es gar nicht!
In der Original-Version steht im Formular:

<input type="file" name="td_newsletter[file]">


Nachdem ich $_FILES abgefragt habe, ist nur Mist rausgekommen.
Also habe ich diese Zeile umgeschrieben in:

<input type="file" name="td_newsletter_file">


Jetzt kann der File-Upload mittels $_FILES["td_newsletter_file"] sauber abgefragt werden.
In Zeile 275 die alte Abfrage:

» PHP
<?php
if ($GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["message"]) {
 
$Typo3_htmlmail->theParts["html"]["content"] = $GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["message"]; // Fetches the content of the page
} else {
 
$Typo3_htmlmail->fetchHTML($GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["file"]);
}
?>


Dies habe ich erstmal geändert in:

» PHP
<?php
if ( $_POST["td_newsletter"]["message"] ) {
 
$Typo3_htmlmail->theParts["html"]["content"] = $_POST["td_newsletter"]["message"];
}

if ( 
$_FILES["td_newsletter_file"]["tmp_name"] ) {
 
// print_r( $_FILES );
 
if ( move_uploaded_file($_FILES["td_newsletter_file"]['tmp_name'], 'temp.html' ) ) {
 
chmod('temp.html'0777);
 
// echo 'save';
 
$file file('temp.html');
 
$Typo3_htmlmail->theParts["html"]["content"] = implode('',$file);
 }
}
?>


Mit dem speichern vom Upload-File, dient für mich als Test-Lösung :)

Nicht vergesen:
Alle Anfragen mit $GLOBALS["HTTP_POST_VARS"]["td_newsletter"]["file"] wurden geändert in $_FILES["td_newsletter_file"]["tmp_name"].

Nach dieser Fummelei geht jetzt auch der Upload einer HTML-Datei wieder :)

[Update]

Hier die fertigen Dateien. Macht euch aber vorher für alle Fälle ein Update!

  • Datei: update_td_newsletter.zip
  • Größe: ca. 0.008 MByte
  • Upload: 2010-12-26 12:28:53
  • Downloads: 98


[Änderungen vorbehalten]

bisherige Kommentare

1
12.08.2008
[Eddy] meint dazu:
Also hast du es zu "STABLE" Version gemacht. :)))...trotzdem denke ich, ich such mal ein anderes Newsletter-Extention ;)

2
26.09.2008
[Stephan Weck] meint dazu:
Hallo,
vielen Dank für die Mühe die Sie sich gemacht haben.
Ich benutze die Extension auch und bin auch fast daran verzeweifelt :-)
Ich habe Ihre Anpassungen integriert und jetzt läuft das eigentlich so wie ich es mir vorgestellt habe..
nochmal vielen Dank
gruss
Stephan Weck

3
05.12.2008
René meint dazu:
Hallo,

mit großen Interesse habe ich Ihren Blog über die Korrekturen von td_newsletter gelesen. Jedoch war es mir nicht möglich anhand Ihrer Anweisungen, die PHP Datei zu rekonstrurieren. Wäre es möglich, dass Sie mir eventuell eine fertige zu schicken könnten?
Ich wäre Ihnen sehr Dankbar!

Liebe Grüße
René

4
22.01.2009
[milkyray] meint dazu:
Klasse, Danke schön! Hat perfekt funktioniert und viel Zeit gespart!

5
24.03.2009
Maier meint dazu:
Sehr gute Anleitung !!
Vielen Dank !!! !!!

Funktioniert einwandfrei !!

6
06.05.2009
[Matthias] meint dazu:
Hallo,

vielen Dank für die tolle Anleitung...habe allerdings die selben Schwierigkeiten wie René. Könnten Sie mir die php-Dateien zumailen?

Vielen Dank,
Matthias

7
14.05.2009
[Down-Syndrom Österreich] meint dazu:
Da auch wir auf td_newsletter umsteigen wollen, bitte uns die korrigierte PHP-Datei zusenden!
Vielen Dank für die Berichtigungen!

8
14.05.2009
[Matthias] meint dazu:
Vielleicht ginge es ja auch, die Datei hier auf dieser Seite online zu stellen...

9
15.05.2009
CIX88 meint dazu:
Hier die fertigen Dateien. Macht euch aber vorher für alle Fälle ein Update!

  • Datei: update_td_newsletter.zip
  • Größe: ca. 0.008 MByte
  • Upload: 2010-12-26 12:28:53
  • Downloads: 98


10
16.05.2009
[Matthias] meint dazu:
Herzlichen Dank!

11
19.10.2009
[mee] meint dazu:
Hallo

Wow, coole Anleitung, danke viel mals :-)
Kannst Du mir dieses auch zuschicken?
Ich hab da noch eine zusätzliche Frage und zwar möchte ich bei der Anmeldung, also im Frontend, das ganze noch erweitern in dem der User auch seinen Namen eingeben soll und nicht nur die Email Adresse. Sonst weiss ich ja nicht, wem die Mail gehört.
Wie kann ich das machen? Hab da leider keine Ahnung.
Danke für jegliche Tipps :-)

12
13.08.2010
alex meint dazu:
weiß hier evtl jemand, wie man die absendeadresse der bestätigungsmail ändert?
hab zwar schon:
plugin.td_newsletter >
plugin.td_newsletter = USER
plugin.td_newsletter {
userFunc = tx_tdnewsletter->main
orderEmail_from = email
orderEmail_fromName = email-name
}
ins setup eingetragen,a ber es bringt nix =(

13
16.12.2010
michi meint dazu:
Hallo, super Anleitung. Nachdem ich die Dateien von Dir eingespielt hatte kam zumindest eine Meldung, dass der Newsletter an die Eingetragenen Personen verschickt wurde. Leider kam dort nie eine Mail an. Was habe ich falsch gemacht?

Danke für jegliche Tipps :-)

neuen Kommentar schreiben

Ich möchte automatisch eine E-Mail bei neuen Kommentaren erhalten.



Themen mit ähnlichen Inhalten


Tags zum Beitrag

typo3     td_newsletter