Nach preg_replace werden seltsame Zeichen eingefügt

max

Erfahrenes Mitglied
Update: Problem mit versenden von Mails via mail() bzw. PHPMailer

Ich hab vor einiger Zeit ein kleines Newslettertool programmiert in dem man ein paar Platzhalter für zB. den Link auf die eingene Seite hat, zusätzlich kann man noch ein Linktracking aktivieren und somit sehen wie oft die Links aus dem Newsletter angeklickt werden.

Beim Linktracking wird der vor dem eigentlichen Link eine Datei auf meinem Webserver aufgerufen und dann wird der Benutzer automatisch via Header Weiterleitung auf die eigentliche Seite geschickt.

Für das ganze habe ich folgende Funktion zum parsen der HTML Mail geschrieben:
PHP:
function parseMail($text,$anrede, $vorname, $nachname, $seitenUrl, $tracking=0, $n_id='', $u_id='', $c_id='') {
    $datum = date("d.m.Y");
    $zeit = date("G:i");
    
    $seitenlink = '<a href="'.$seitenUrl.'" target="_blank">'.$seitenUrl.'</a>';
    $linkPattern = ',<a([^>]+)href="((http://|https?://|ftp://)([^>"\s]+))([^>]+)>([^<]+)(</a>),i';
    
    if($tracking==1) {
    
        $info = base64_encode($n_id)."|".base64_encode($u_id)."|".base64_encode($c_id);
        $info = rawurlencode($info);
        $linktracking = '<a href="http://www.meinserver.com/email/inc/go_link.php?info='.$info.'&to=\2" target="_blank">\6\7';
    }
    else {
        $linktracking = '<a href="\2" target = "_blank">\6\7';
    }
    
    $text = checkQuotes($text);
    
    $suche = array(
                    '{\{ANREDE\}}',                
                    '{\{VORNAME\}}',
                    '{\{NACHNAME\}}',
                    '{\{DATUM\}}',
                    '{\{ZEIT\}}',
                    '{\{SEITENLINK\}}',
                    $linkPattern
                    );
    $ersetze = array(
                    $anrede,
                    $vorname,
                    $nachname,
                    $datum,
                    $zeit,
                    $seitenlink,
                    $linktracking
                    );
    
    $msg = preg_replace($suche, $ersetze, $text);
    
    return $msg;
}

Nun habe ich folgendes Problem: Beim ersten Versenden des Newsletters funktioniert alles noch einwandfrei, nur wenn ich den bereits gesendeten Newsletter im CMS wieder bearbeite und erneut versende wird mir beim preg_match für das Linktracking "! " (-> Ausrufezeichen + Leerzeichen) irgendwo im Link teilweise sogar in der Nachricht eingefügt.

Ich weiß einfach nicht woher das kommen könnte.
 
Zuletzt bearbeitet:
Probier mal Folgendes:
PHP:
function parseMail($text, $anrede, $vorname, $nachname, $seitenUrl, $tracking=false, $n_id='', $u_id='', $c_id='')
{
    
	$seitenlink = '<a href="'.$seitenUrl.'" target="_blank">'.$seitenUrl.'</a>';
	$pattern = '#<a[^>]+href="((?:https?|ftp)://[^>"]+)"[^>]*>([^<]+)</a>#i';

	if( $tracking == true ) {
		$info = rawurlencode( base64_encode($n_id) . '|' . base64_encode($u_id) . '|' . base64_encode($c_id) );
		$replacement = '<a href="http://www.meinserver.com/email/inc/go_link.php?info='.$info.'&to=\1" target="_blank">\2</a>';
	} else {
		$replacement = '<a href="\1" target="_blank">\2</a>';
	}
	$text = checkQuotes(preg_replace($pattern, $replacement, $text));
	$trans = array(
		'{ANREDE}'     => $anrede,
		'{VORNAME}'    => $vorname,
		'{NACHNAME}'   => $nachname,
		'{DATUM}'      => date('d.m.Y'),
		'{ZEIT}'       => date('G:i'),
		'{SEITENLINK}' => $seitenlink
	);

	return strtr($text, $trans);

}
 
Danke Gumbo!

Leider hat das auch nicht funktioniert.
Was mich wirklich intressieren würde ist wie so etwas zustande kommen kann, ich hab nirgends im meinem Text so ein Ausrufezeichen was dort eingefügt werden könnte und es ist mir sowieso extrem unlogisch da es beim ersten Versenden des Newsletters einwandfrei funktioniert, nur beim zweiten mal kommt so ein Sch**** raus.

Der Klou ist aber das der Text beim zweiten mal genau der gleiche ist wie beim ersten, dh. es ist genau der gleiche Prozess.
 
Da du hier eigentlich keinen regulären Ausdruck matchen musst, würde ich zu str_replace greifen:


PHP:
    $suche = array(
                    '{ANREDE}',                
                    '{VORNAME}',
                    '{NACHNAME}',
                    '{DATUM}',
                    '{ZEIT}',
                    '{SEITENLINK}',
                    $linkPattern
                    );
    $ersetze = array(
                    $anrede,
                    $vorname,
                    $nachname,
                    $datum,
                    $zeit,
                    $seitenlink,
                    $linktracking
                    );
    
    $msg = str_replace($suche, $ersetze, $text);

€: Hab grad gesehen dass $linkPattern eine Regexp ist.

Du sagtest ja dass der Fehler nur beim 2. versenden der Mehl auftritt, kommt beim ersten Versenden der Text nicht aus der DB?
Dann könnten wir das Problem schon mal eingrenzen.
 
Zuletzt bearbeitet:
diggity hat gesagt.:
Du sagtest ja dass der Fehler nur beim 2. versenden der Mehl auftritt, kommt beim ersten Versenden der Text nicht aus der DB?
Dann könnten wir das Problem schon mal eingrenzen.

Das stimmt allerdings daran hab ich noch gar nicht gedacht. Also der Text kommt beim ersten Mal nicht aus der Datenbank aber er wird auf die selbe weise (per POST) and das Skript zum Versand übergeben.

Hier ein Beispiel für den Text:
Code:
facilisis at vero et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue
Code:
facilisis at vero et accumsan et iusto odio dignissim qui blandit pra! esent luptatum zzril delenit augue

Man beachte praesent und pra! esent
 
Zuletzt bearbeitet:
So bin jetzt etwas weiter gekommen.

Also es liegt nicht an der oben angeführten Funktion sondern der Fehler liegt irgendwie beim Versenden der mails.

Für das Versenden des Newsletters nehme ich die PHPMailer Klasse her, wobei der Fehler auch beim normalen verwenden von mail() auftritt.
Also wenn ich mir den Newsletter vor dem Versenden ausgebe stimmt alles, nur in der eigentlichen mail die ich dann bekomme (egal ob mit PHPMailer oder einfach mail()) werden an ein paar Stellen "! " (Rufzeichen + Leerzeichen) eingefügt.
 
Anscheinend war das ganze ein Serverseitiges Problem (ist mir zwar immer noch ein Rätsel), habe nämlich gestern noch eine Mail an meinen Hoster geschrieben, zwar noch keine Antwort bekommen aber jetzt funktioniert es wieder.

Hätte mich auch irgnedwie gewundert, da das ganze schon einige Zeit völlig ohne Probleme gelaufen ist.

Würde aber trotzdem noch gerne wissen an was das genau gelegen hat, vielleicht bekomme ich ja noch eine aufschlussreiche Antwort von meinem Hoster oder es liegt vielleicht doch noch an mir und es kommt einfach bei einer gewissen Textkonstelation vor.
 
Ich kann mir dieses Phänomen ehrlich gesagt nicht erklären. Auch ein bestimmtes Muster kann ich nicht erkennen – es sei denn, diese Zeichenfolge wird immer nach den ersten 69 Zeichen eingefügt. Einen Grund dafür sehe ich aber auch nicht. Ich bin auf die Antwort deines Anbieters gespannt.
 
Ich bin mir nun sicher dass es am Server liegt, da ich es mittlerweile auf einem anderen Server getestet habe und dort hat alles einwandfrei funktioniert.
 
So habe jetzt etwas Info von meinem Hoster bekommen:
Das Problem liegt darin dass das Skript auf einem Unix Server ausgeführt wird und die eigentliche Mail von einem Linux Server versendet wird (oder wars umgekehrt? weiß ich jetzt leider nicht mehr so genau).

Durch diese Konstellation gibt es irgendwie einen konflikt der MIME Types und dadurch werden diese Zeichen eingefügt.

Genauer weiß ich es leider auch nicht da ich es selber über 3 Ecken erfahren habe.
 
Zurück