fastix®: Zeichsatzproblem bei Umlauten im Header von Mails

Moin!

Ich will aus einem Mailformular den Name des Versenders gemeinsam mit der Mailadresse mit in die Adresse des Versenders übernehmen, also:

$name="Hansi Meier";
$email="localpart@mx.tld";
$to="$name <$email>";

mail (...);

Klappt auch. Jedenfalls solange der Hansi "Meier" heisst und nicht heiratet und dann unter "Hansi Meier-Müller" firmiert. Das Problem sind die Umlaute. Gesendet werden die Daten aus einem Formular mit Zeichensatz nach ISO 8859-1(5).

-> was kann ich tun, in welchen Zeichensatz muss ich die Daten wie transformieren, damit beim Empfänger nicht gar schräckliches ankömmt?

Die Frage betrifft den header, nicht jedoch den Body oder das Subjekt der Mail, da klappt alles bestens.

MFFG (Mit freundlich- friedfertigem Grinsen)

fastix®

--
Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
  1. Hi,

    Moin!

    Morituri te salutant!

    -> was kann ich tun, in welchen Zeichensatz muss ich die Daten wie transformieren, damit beim Empfänger nicht gar schräckliches ankömmt?

    Du musst zunächst mal ein (Bsp.) =?iso-8859-1?Q? davor schreiben, dann alle Leerzeichen in _ umwandeln, dann alle "bösen" Zeichen in ihre hexadezimale Entsprechung beim gewählten Zeichensatz umsetzen und mit = schützen und zu guter Letzt den String mit ?= beenden. Dann kommt z.B. Hans =?iso-8859-1?Q?M=FCller-Meier?= oder auch =?iso-8859-1?Q?Hans_M=FCller-Meier?= raus, das kriegen dann alle Briefklienten auf die Reihe.

    Gunnamd!
    Der Yeti

    --
    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
    Und bin so klug als wie zuvor!
    sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
    1. Moin!

      THX!

      Könnte das eben zurechtgezimmerte:

      function adressencode($str)
      {
       $str=trim($str);
       $arWoerter=explode(' ',$str);
          $arNewWoerter='';

      foreach ($arWoerter as $strWort)
       {
        $array=array();
        for ($i=0; $i<strlen($strWort);$i++)
        {
         $array[]=substr($strWort, $i, 1);
        }

      $newstr='';
        $bolFound=FALSE;

      foreach ($array as $char)
        {
         if (ord($char)>127) {
          $char=strtoupper(dechex(ord($char)));
          $bolFound=TRUE;
         }
            $newstr=$newstr.$char;
        }
           if ($bolFound)
        {
         $newstr='=?iso-8859-1?Q?'.$newstr.'?=';
        }
              $arNewWoerter=$arNewWoerter.' '.$newstr;
       }
       return trim($arNewWoerter);
      }

      richtig sein? Macht aus:

      Hans Müller -> Hans =?iso-8859-1?Q?MFCller?=
      Jörg Jörgson -> =?iso-8859-1?Q?JF6rg?= =?iso-8859-1?Q?JF6rgson?=

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
      1. echo $begrüßung;

        Könnte das eben zurechtgezimmerte:
        richtig sein? Macht aus:

        Das sieht mir recht umständlich aus

        Hans Müller -> Hans =?iso-8859-1?Q?MFCller?=
        Jörg Jörgson -> =?iso-8859-1?Q?JF6rg?= =?iso-8859-1?Q?JF6rgson?=

        Es sollte auch reichen, den Vor- und Abspann nur einmal und dann um den ganzen Subjektstring zu legen, also nicht für jedes Wort extra.

        Und dann brauchst du nur

        • $result = vorspann;  // vorspann könnte eine Konstante sein
        • eine for-Schleife von 0 bis kleiner als strlen($str).
        • Einzelne Zeichen in einem String kann man mit $str{position} ansprechen.
        • die guten an $result anhängen, für die schlechten die Ersatzdarstellung.
        • $result .= abspann;

        echo "$verabschiedung $name";

      2. Moin!

        Für das Archiv:

        Ich habe die Funktion nochmals angepasst, sie maskiert jetzt alle Zeichen außer [A-Za-z0-9]. Das scheint nach RFC822 nötig zu sein. Darüber hinaus maskiert sie jetzt kurzerhand auch das trennende Leerzeichen zwischen Namensbestandteilen. Das funkioniert prima, ich habe das gestestet.

        function iso8859_1_mask($str)
        {
         $str=trim($str);
         $array=array();
         $newStr='';
         $bolFound=FALSE;

        for ($i=0; $i<strlen($str);$i++)
         {
          $array[]=substr($str, $i, 1);
         }

        foreach ($array as $char)
         {

        if (!ereg ('[A-Za-z0-9]', $char))
          {
           $char='='.strtoupper(dechex(ord($char)));
           $bolFound=TRUE;
          }

        $newStr=$newStr.$char;
         }

        if ($bolFound)
         {
          $newStr = '=?ISO-8859-1?Q?'.$newStr.'?= ';
         }
         return $newStr;
        }

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    2. Moin!

      Du musst zunächst mal ein (Bsp.) =?iso-8859-1?Q? davor schreiben, dann alle Leerzeichen in _ umwandeln, dann alle "bösen" Zeichen in ihre hexadezimale Entsprechung beim gewählten Zeichensatz umsetzen und mit = schützen und zu guter Letzt den String mit ?= beenden. Dann kommt z.B. Hans =?iso-8859-1?Q?M=FCller-Meier?= oder auch =?iso-8859-1?Q?Hans_M=FCller-Meier?= raus, das kriegen dann alle Briefklienten auf die Reihe.

      THX! Hat geholfen.

      MFFG (Mit freundlich- friedfertigem Grinsen)

      fastix®

      --
      Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.