Seite 2 von 3

Verfasst: Do 20. Apr 2006, 18:20
von HerrB

Verfasst: Fr 21. Apr 2006, 08:53
von markusheinzer
Ich habe jetzt etwas rumprobiert und glaub eine nicht schlechte Lösung gefunden:

Im Newsletter-Handler-Modul habe ich jeweils vor der Zeile

Code: Alles auswählen

$mail->Subject  = $subject;
folgendes eingefügt:

Code: Alles auswählen

$btext = $subject;
$subject = '';
$btext = chunk_split($btext, 15, '|');
$betreff = explode('|',$btext);
foreach ($betreff as $u)
{ $subject .= '=?'.$encoding[$lang].'?Q?'.imap_8bit($u).'?= '; }
Die aufwändige Aufsplittung ist nötig, weil der fertige MIME-kodierte String zwischen =? und ?= (inkl.) nur 75 Zeichen lang sein darf. Wenn alle Zeichen kyrillisch sind, geht das bei 15 Zeichen grad durch. Und man darf mehrere solche Strings hintereinander haben.

Das gleiche in class.newsletter.php gemacht.

Resultat:
Alle Mails, die vom Newsletter-Handler-Modul verschickt werden, kommen nun perfekt an. Jedenfalls in Thunderbird. Sehr gut. :D
Beim Verschicken eines Newsletters allerdings (ich glaube, das kommt dann von class.newsletter.php) wird $encoding[$lang] nicht ausgeführt, sondern liefert nur einen Leerstring.
Woran kann das liegen? Ich kann mich erinnern, dass es gestern mal schön korrekt den Zeichensatz zurückgeliefert hat.

Verfasst: Fr 21. Apr 2006, 09:46
von HerrB
Super! Da hätte ich mich warscheinlich totgefummelt.

Ist $encoding und $lang als global in der jeweiligen Funktion definiert? Was kommt bei echo $encoding[$lang]; (in der Funktion der Klasse) raus?

Ich muss gestehen, dass ich gar nicht weiss, wo die $encoding-Variable definiert wird, vielleicht muss man da nochmal Hand anlegen.

Gruß
HerrB

Verfasst: Fr 21. Apr 2006, 10:06
von markusheinzer
ja, die beiden Variablen habe ich in der Funktion "send" als global definiert.
Bei echo $encoding[$lang]; wird nichts ausgegeben. Ich habe auch getestet, wo etwas ausgegeben würde, indem ich am gleichen Ort echo 'markus'; eingegeben habe. Das 'markus' wird ausgegeben, aber eben sonst nichts.

Verfasst: Fr 21. Apr 2006, 10:09
von HerrB
Ja, dann muss man nochmal nachforschen, woher $encoding eigentlich stammt. Ggf. kann man es als (optionalen) Parameter der send-Funktion noch hinten anfügen - aber auch dafür müsste es im Backend zur Verfügung stehen und damit eigentlich auch der Klasse als globale Variable, mmmmmh.

Gruß
HerrB

Verfasst: Fr 21. Apr 2006, 13:07
von markusheinzer
also wie gesagt, im Newsletter-Handler-Modul wird es völlig korrekt angewendet.
Soll ich dein "mmmmmh" so verstehen, dass Du das suchst?
Wenn ich helfen kann, wie soll ich vorgehen?

Verfasst: Fr 21. Apr 2006, 13:11
von HerrB
Mmmmh, heißt, ich denke (und würde heute abend Suchen). Du kannst einfach mal die Source-Dateien durchsuchen, wo $encoding als Variable erzeugt und gefüllt wird.

Wenn unter Windows XP und Windows XP findet gar kein Vorkommen bei Suche nach .php (Datei) und encoding (enthält), sage Bescheid, dann gibt es einen Tipp, wie man das korrigieren kann...

Gruß
HerrB

Verfasst: Fr 21. Apr 2006, 13:28
von markusheinzer
ist tatsächlich so. Wenn ich (win xp) nach *.php und "encoding" (enthält) suche, findet er gar nichts.
Wenn ich ohne *.php suche, findet er alles mögliche, nur keine php-Datei

Verfasst: Fr 21. Apr 2006, 13:38
von Halchteranerin
Das, womit dir HerrB helfen wollte (wie man unter Windows php-Dateien durchsuchen kann), findest du hier:
http://www.contenido.org/forum/viewtopic.php?t=7790

Verfasst: Fr 21. Apr 2006, 14:38
von markusheinzer
so. ich glaub, ich hab den hasen: Die Variable wird frisch fröhlich in der front_content.php generiert. Der Newsletter-Handler läuft über das Front-End, weshalb dort die Variable $encoding[$lang] funktioniert. Das Versenden des Newsletters hingegen hat mit dem Front-End nichts zu tun, weshalb die Variable auch nicht vorhanden ist.
Könnt's das sein?

Verfasst: Fr 21. Apr 2006, 15:18
von HerrB
Yep. Probiere bitte mal echo $aLanguageEncodings[$lang];

Gruß
HerrB

Verfasst: Fr 21. Apr 2006, 15:25
von markusheinzer
ergibt ebenfalls nichts.

Verfasst: Fr 21. Apr 2006, 16:38
von HerrB
Ah, jetzt sehe ich, das gilt nur für den Header. Nein, dann müsste man die Funktion nachbauen. Eigentlich gehört sie in eine Tool-Datei, sowas wie functions.general.php, aber hier würde ich sie in die include.newsletter_send.php integrieren und das Encoding als Parameter der Send-Methode mitgeben (d.h. auch: Parameter für die Funktion in class.newsletter.php ergänzen).

Gruß
HerrB

Verfasst: Fr 21. Apr 2006, 17:36
von markusheinzer
Danke. Ich versuchs mal...

Verfasst: Fr 21. Apr 2006, 18:30
von markusheinzer
Ich habs.

1. Schritt:

In der include.newsletter_send.php vor der function fncWriteClientLog($msg) folgenden Code einfügen:

Code: Alles auswählen

/**
* Looks up the encoding-charset of the current language
*/	
function encodingcharset() {
    global $cfg, $lang;

    $sql = "SELECT idlang, encoding
              FROM ".$cfg["tab"]["lang"]."
			 WHERE idlang = $lang";

    $db2 = new DB_Contenido;

    $db2->query($sql);
    $db2->next_record();
	
    return $db2->f("encoding");

}
2. Schritt:

In der gleichen Datei in der function fncWriteClientLog($msg) die Zeile

Code: Alles auswählen

$aResult = $oNewsletter->send($iIDCatArt, $sSendOption, $aSelGroups, $iDispatchCount, $_REQUEST["chunk"]);
wie folgt ergänzen:

Code: Alles auswählen

$aResult = $oNewsletter->send($iIDCatArt, $sSendOption, $aSelGroups, $iDispatchCount, $_REQUEST["chunk"], encodingcharset());
3. Schritt:

In der Datei class.newsletter.php folgende Zeile

Code: Alles auswählen

function send($idcatart, $destination = "other", $to = "", $chunksize = 0, $chunk = 0)
so ergänzen:

Code: Alles auswählen

function send($idcatart, $destination = "other", $to = "", $chunksize = 0, $chunk = 0, $encoding = "iso-8859-1")
4. Schritt:

In der gleichen Datei nach der Zeile

Code: Alles auswählen

$mail = new phpmailer();
folgende Zeile einfügen:

Code: Alles auswählen

$mail->CharSet = $encoding;
5. Schritt:

In der gleichen Datei etwas weiter oben nach der Zeile

Code: Alles auswählen

$subject = $this->get("subject");
folgenden Code einfügen:

Code: Alles auswählen

if (substr($subject,0,2) <> '=?')    // Nur das erste Mal encoden

{

	$betreff = chunk_split($subject, 15, '|');
	$betreff_array = explode('|',$betreff);
	$subject = '';
	foreach ($betreff_array as $u)
	{  $subject .= '=?'.$encoding.'?Q?'.imap_8bit($u).'?= '; }

}

Ich glaube, das war alles. wow. Hätte ich nicht gedacht, dass ich das hinkriege.

@HerrB: Danke für die Hilfe immer.

@alle: Kommentare natürlich erwünscht.