Antworten auf deine Fragen:
Neues Thema erstellen

PHPmailer und Umlaute

Cortax

Noch nicht viel geschrieben

Guten Abend!

Ich weiss, das Thema gibt es schon wie Sand am Meer aber ich krieg's einfach nicht hin...

Hab ein Kontaktformular mit einem PHP-Skript, dass die php-mailer-class verwendet.

Habe ein Problem mit Umlauten



Bei dem Nachrichten-Feld gehen zwar alle Zeichen, beim Betreff geht aber das € - Zeichen nicht
und von Emailaddresse (siehe rechts) über Vorname+Nachname wird's dann immer schlimmer...

Hab schon 100 verschiedene Sachen ausprobiert, aber nichts hilft so dass es komplett funktioniert.

Hier das Skript:
PHP:
<?php

require('../phpmailer/class.phpmailer.php');

//Anti-Injection-Skript einbinden
include '../antiinjection.php';

$ngcvalidation = file_get_contents(str_replace(" ", "", "http://www.kostenloses-captcha.de/validation.php?ngid=".$_POST['ngidtransfer']."&secr=".$_POST['SecR']."&secb=".$_POST['SecB']."&secg=".$_POST['SecG'].""));
//$ngcvalidation bekommt den String "true" zugewiesen, wenn die Sicherheitseingabe korrekt war
//$ngcvalidation bekommt den String "false" zugewiesen, wenn die Sicherheitseingabe inkorrekt war

if ($ngcvalidation == "false")
{
    ob_start();
    echo "Falsche Eingabe beim Sicherheitscode!<br>";
    echo "Senden nicht erfolgreich.<br>";
    echo "Sie werden in 5 Sekunden weitergeleitet.";
    header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
    ob_end_flush();
    exit;   
}

else
{
  if (!IsSet ($_POST['vorname'],$_POST['nachname'],$_POST['email'],$_POST['betreff'],$_POST['nachricht'])
      || !is_string($_POST['vorname'])
      || !is_string($_POST['nachname'])
      || !is_string($_POST['email'])
      || !is_string($_POST['betreff'])
      || !is_string($_POST['nachricht']))
      {
          ob_start();
        echo "Falsche Eingabe!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;   
      }
     

  if($_POST['vorname'] == "Vorname" || $_POST['vorname'] == ""  )
    {
        ob_start();
        echo "Keinen Vornamen eingegeben!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;       
    }
  else
  if($_POST['nachname'] == "Nachname" || $_POST['nachname'] == ""  )
    {   
        ob_start();
        echo "Keinen Nachnamen eingegeben!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
    }
  else
  if($_POST['email'] == "Ihre Email" || $_POST['email'] == ""  )
    {
        ob_start();
        echo "Keine Emailaddresse eingegeben!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5;  http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
    }
  else
  if($_POST['betreff'] == "Betreff" || $_POST['betreff'] == ""  )
    {
        ob_start();
        echo "Keinen Betreff eingegeben!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
    }
  else
  if($_POST['nachricht'] == "Nachricht" || $_POST['nachricht'] == ""  )
    {
        ob_start();
        echo "Keine Nachricht eingegeben!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
    }
  if($_POST['id'] != "")
    {
        ob_start();
        header("Refresh: 0; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
    }
  else
    {
            //setlocale(LC_TIME, "de_DE.utf8");
            //error_reporting(0);
           
               
            // $vorname = utf8_decode($_POST['vorname']);
            // $nachname = utf8_decode($_POST['nachname']);
            // $email = utf8_decode($_POST['email']);
            // $betreff = utf8_decode($_POST['betreff']);
            // $nachricht = utf8_decode($_POST['nachricht']);
           
            $vorname=EscapeStringForMail ($_POST['vorname'], 1);
            $nachname=EscapeStringForMail ($_POST['nachname'], 1);
            $email=EscapeStringForMail ($_POST['email'], 1);
            $betreff=EscapeStringForMail ($_POST['betreff'], 1);
            $nachricht=EscapeStringForMail ($_POST['nachricht'], 0);
           
           
           
            // $vorname = $_POST['vorname'];
            // $nachname = $_POST['nachname'];
            // $email = $_POST['email'];
            // $betreff = $_POST['betreff'];
            // $nachricht = $_POST['nachricht'];
           
           
            $empfaenger = "test@web.de";
           
            $mail = new PHPMailer();
           
            // $vorname = "=?utf-8?b?".base64_encode($vorname)."?=";
            // $nachname = "=?utf-8?b?".base64_encode($nachname)."?=";
            // $email = "=?utf-8?b?".base64_encode($email)."?=";
            // $betreff = "=?utf-8?b?".base64_encode($betreff)."?=";
           
            $mail->From = $email;
            $mail->FromName = $vorname . " " . $nachname;
            $mail->AddAddress($empfaenger);
           
            $mail->Subject = $betreff;
            $mail->Body = $nachricht;
            $mail->WordWrap = 30;
           
            if (!$mail->Send())
            {
                ob_start();
                echo "Fehler beim Senden!<br>";
                echo "Senden nicht erfolgreich.<br>";
                echo "Sie werden in 5 Sekunden weitergeleitet.";
                header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
                ob_end_flush();
                exit;   
            }
            else
            {
                header("Refresh: 0; http://www.illutie.de/de/erfolg.html");
                exit;
            }       

    }
}
?>

Man kann auskommentiert schon einige Sachen erkennen, die ich versucht hab...
Viele weitere sind gelöscht...

Die Escape-Funktion macht folgendes:

PHP:
function EscapeStringForMail ($string, $indicator=1)
        {
        if ($indicator!=0)
            {
            //UNZULAESSIGE ZEICHEN FILTERN
            $string = preg_replace( "/[^a-zäüöß0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "",$string );
            };
       
        //E-MAIL-BEFEHLE FILTERN
        $string = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "",$string );
       
        //UNNOETIGE LEERZEICHEN ENTFERNEN:
        $string = trim($string);
       
        //PHP- UND HTML-CODE ENTFERNEN:
        $string = strip_tags($string);
       
        //GEFILTERTEN STRING ZURUECKGEBEN   
        return $string;
        };

Hab in der php.ini eingetragen:

default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6

Das Formular hat ein accept-charset utf8, sowie die datei ein utf8 meta.
 

lachender_engel

Aktives Mitglied

Ich kann das $mail->From = $email; nicht.
Die Ursache liegt in jedem Fall in der falschen Codierung des E-Mail-Headers.
Mit diesen Einstellungen klappt es in jedem Fall:
PHP:
$mail = new PHPMailer(true);
// Hier kommen die SMTP oder andere Paramter hin.
$mail->CharSet = 'utf-8';     
$mail->Sender='name@domain.tld'; // indicates ReturnPath header
$mail->SetFrom('name@domain.tld', 'Absender Klartext');
$mail->Subject = "Betreff";
$mail->AddAddress('empfaenger@domain.tld', 'Vorname Name');
$mail->MsgHTML($message);
$mail->Send():
 

Cortax

Noch nicht viel geschrieben

Tut mir Leid, aber irgendwie geht das bei mir nicht... erst sagt er mir kein Mail-Body und wenn ich nen mail->body angebe sagt er, dass er mail() nicht aufrufen kann...

$mail->CharSet = 'utf-8'; in meinen Code einzubauen hat leider auch nichts gebracht (das hatte ich schon versucht)

Es ist echt zum verzweifeln...

Aber danke trotzdem.
 

El Gordo

Noch nicht viel geschrieben

Suche mal bitte in der class.phpmailer.php nach:
Code:
* Sets the CharSet of the message.

Dort änderst du dann einfach die Codierung in utf-8 ab. So wie im folgenden Beispiel:
Code:
public $CharSet           = 'utf-8';
 

Cortax

Noch nicht viel geschrieben

Hab in die Escape-Funktion jetzt mal folgendes reingeschrieben:

$string = str_replace("ä", "ae", $string);
$string = str_replace("ü", "ue", $string);
$string = str_replace("ö", "oe", $string);
$string = str_replace("Ä", "Ae", $string);
$string = str_replace("Ü", "Ue", $string);
$string = str_replace("Ö", "Oe", $string);
$string = str_replace("ß", "ss", $string);
$string = str_replace("´", "", $string);

Die Umlaute werden dann korrekt umgewandelt angezeigt. Das heisst er findet an der Stelle doch noch ein Ü vor. dann versteh ich nicht wieso das ü nicht überlebt, bis es in meinem Postkasten ist..... :/
 

afr0kalypse

Allwissendes Karmameerschweinchen!

Kann man sich das irgendwo online ansehen?
Wie ist der Webserver konfiguriert?
Welchen Charset bietest du denn auf Frontend-Seite an? Auch utf-8?
Werden deine Daten in eine DB geschrieben und dann noch mal ausgelesen und angezeigt?
was sagt phpinfo(); ?
 

lachender_engel

Aktives Mitglied

Noch mal: Dein Problem sind nicht die Umlaute sondern eindeutig Deine E-Mail-Codierung.
Darunter versteht Du, dass die Kopfparameter (der Headbereich) fehlerhaft sind.
Das erkennst Du darin, dass Dein "Von" Fehler aufweist.
Fange ganz klein an. Verwende nur die wichtigsten Paramter und lasse den Schnick-Schnack mit den Sonderzeichen. Bei einer richtig programmierten E-Mail kommen auch die Sonderzeichen in der E-Mail richtig an.
Fange mit einer einfachen Text-E-Mail an und arbeite Dich Schritt für Schritt zumg ewünschten Ziel.
 

Cortax

Noch nicht viel geschrieben

Hallo zusammen und danke für eure Beiträge.

Könnt ihr euch gerne hier ansehen die Seite:
(Ist alles noch im Aufbau, noch nicht auf kleinere Auflösungen optimiert)

Ja es liegt am Mail-Header hab das jetzt verstanden.

Als Zwischenlösung hab ich jetzt diese Variante gewählt:

PHP:
function sonderzeichen($string)
{
$string = str_replace("ä", "ae", $string);
$string = str_replace("ü", "ue", $string);
$string = str_replace("ö", "oe", $string);
$string = str_replace("Ä", "Ae", $string);
$string = str_replace("Ü", "Ue", $string);
$string = str_replace("Ö", "Oe", $string);
$string = str_replace("ß", "ss", $string);
$string = str_replace("´", "", $string);
return $string;
}

      $vorname = $_POST['vorname'];
      $nachname = $_POST['nachname'];
      $email = $_POST['email'];
    
      $vorname2 = sonderzeichen($_POST['vorname']);
      $nachname2 = sonderzeichen($_POST['nachname']);
      $email2 = sonderzeichen($_POST['email']);
    
      $betreff = $_POST['betreff'];
      $nachricht = $_POST['nachricht'];
    
    
    
      $empfaenger = "test@web.de";
    
    
      $mail = new PHPMailer();
      $mail->CharSet = 'utf-8';
      $mail->SetLanguage ("de");
      $mail->From = $email2;
      $mail->FromName= $vorname2 . " " . $nachname2;
      $mail->AddAddress($empfaenger);
      $mail->Subject = $betreff;
      $mail->Body = $vorname. " " . $nachname. "(" . $email . "):<br>" . $nachricht;
      $mail->WordWrap = 30;
    
      if (!$mail->Send())
      {
        ob_start();
        echo "Fehler beim Senden!<br>";
        echo "Senden nicht erfolgreich.<br>";
        echo "Sie werden in 5 Sekunden weitergeleitet.";
        header("Refresh: 5; http://www.illutie.de/de/kontakt.php");
        ob_end_flush();
        exit;
      }
      else
      {
        header("Refresh: 0; http://www.illutie.de/de/erfolg.html");
        exit;
      }

Ich wandle im Header die Umlaute um, und geb im Body nochmal alles richtig aus. Das Ergebnis könnte dann so aussehen:



Das ist zumindest eine potenzielle Lösung, falls ich das mit dem Email-Header nicht hinbekomme.

Nun zum Thema Mailheader:

php.ini:

allow_url_fopen = on
default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6

frontend: utf-8

db-anbindung: nein

phpinfo(); sagt ziemlich viel aus... was ist denn da gefragt ? bei default charset steht uft-8 bei idn (was auch immer das ist) steht ISO-8859-1, soweit die charset angaben die ich finden kann.
 

Isometric

Powerproster

Wie sind denn deine php-Dateien codiert? Ich hatte da auch schon Problem mit Umlauten, wenn nicht alle Codierungen UTF8 (ohne BOM) waren.

Guck mal hier, vielleicht hilft die Seite auch weiter:
 

afr0kalypse

Allwissendes Karmameerschweinchen!

Kann es sein, dass der phpmailer versucht, einen von dir in utf-8 codierten Text noch mal utf-8 zu codieren?
Dann müsstest du im Vorfeld prüfen, welchen charset dein Text hat und entsprechend reagieren.
 

Cortax

Noch nicht viel geschrieben

Den Verdacht mit dem mehrfach-codieren hatte ich auch schon weil davon nix funktioniert:


PHP - header()
header('Content-Type: text/html; charset=ISO-8859-1');
oder:
header('Content-Type: text/html; charset=UTF-8');
Die Funktion muss vor jeglicher Ausgabe an den Browser erfolgen!

PHP - setlocale()
setlocale() - Setzt Locale Informationen
setlocale(LC_TIME, 'de_DE.utf8');
PHP - htmlentities()
Probleme mit htmlentities() bei UTF-8 Zeichenkodierung beheben.
htmlentities($str, ENT_QUOTES, 'UTF-8');
 

Cortax

Noch nicht viel geschrieben

Wie sich herausgestellt hat war der Fehlerverursacher folgende Zeile:

$Mail->From = S_POST['email']

Hab die From-Angabe jetzt komplett weggelassen und nurnoch

PHP:
$mail = new PHPMailer();
      $mail->CharSet = 'utf-8';
      $mail->SetLanguage ("de");
      $mail->AddAddress($empfaenger);
      $mail->Subject = $betreff;
      $mail->FromName = $nachname . "," . $vorname;
      $mail->Body = $email . ":\n\n" . $nachricht;
      $mail->WordWrap = 30;

Ist das wohl so in Ordnung oder fehlt da irgendwo noch ne Angabe ?

Funktionieren tut es soweit, krieg Name und Vorname mit Umlauten angezeigt.
Das Einzig Blöde ist, dass er als Absendermail root@localhost anzeigt, weswegen ich die richtige Email (die aus dem ausgefüllten Formular kommt) noch einmal in den Mail-Body geschrieben habe.
 

Cortax

Noch nicht viel geschrieben

mit setfrom, zb.: $mail->SetFrom($_POST['email'], $_POST['name']);
krieg ich als absender wieder "Root User" angezeigt, also denk ich mal ist das so nicht gewollt
 

afr0kalypse

Allwissendes Karmameerschweinchen!

kriegst du denn mit $_POST['email'] die richtige Email Adresse?
Dann mach doch $mail->SetForm($_POST['email'], $vorname . ' ' . $nachname);
 

Cortax

Noch nicht viel geschrieben

Ja, ich kriege die richtige Emailadresse, weil $mail->Body = $email . ":\n\n" . $nachricht;
gibt mir die richtige Emailadresse aus. Der Absender der Mail ist ja sozusagen die Applikation und nicht der, der das Formular ausfüllt.
Deshalb darf man denk ich mal From oder SetFrom nicht manuell überschreiben.

Krieg im Prinzip jetzt alles richtig angezeigt, auch mit Umlauten bis halt dass als Absender da root@localhost steht, aber dafür hab ich ja die richtige Emailadresse nochmal im Body ausgegeben, da steht dann also richtig "müller@gmx.de" (zum beispiel).

Danke für die vielen Tipps.
 
M

Maifin

Guest

Hallo zusammen,

auch ich verzweifle so langsam an dieser verflixten codierung in meinem PEAR-PHP-Mailer...
Ich schaffe es einfach nicht, das mir die Umlaute in der E-Mail angezeigt werden. Zum beispiel ein ü sieht wie folgt aus ü.

Die Datei heißt "utf-8.php"
Das Script sieht folgendermaßen aus:


PHP:
<?php
header('Content-Type: text/html; charset=UTF-8');
    include '../../mail/Mail.php'; 
 
    $host = 'xxx';
    $username = 'xxx';
    $password = 'xxx';

    $zielseite = 'success.php'';
 
    $from = 'NAME ABSENDER <name@abdender.de>';
    $to = 'NAME EMPFÄNGER <name@empfaenger.de>';
    $subject = 'BETREFF-ZEILE'
    $body = 'BODY-TEXT';

    $headers = array (
    'From' => $from,
    'To' => $to,
    'Subject' => $subject);
    $smtp = Mail::factory('smtp',
    array ('host' => $host,
    'auth' => true,
    'username' => $username,
    'password' => $password));
    $mail = $smtp->send($to, $headers, $body);
    if (PEAR::isError($mail)) {
   echo("<p>" . $mail->getMessage() . "</p>");
    } else {
    header("Location: $zielseite");
    }
?>


Was läuft hier schief??
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.614
Beiträge
1.538.351
Mitglieder
67.525
Neuestes Mitglied
mgtaucher
Oben