imap Verbindung Charset ändern?
george
- php
Hallo,
ich habe gerade versucht, ein winziges Online-Mail-System auf meinen Server zu laden, welches einfach die Mails von meinem aktuellen Mail-Server runterlädt.
http://ch2.php.net/manual/de/ref.imap.php --> Erster Comment-Eintrag
Klappt auch so wies soll, außer, dass Umlaute nicht dargestellt werden [�]. Habe die php-Datei zu UTF ohne BOM konvertiert und im Head <meta http-equiv="content-Type" content="text/html; charset=UTF-8">
eingefügt. Hat sich jedoch nichts geändert..
Hab auch geschaut, ob sich beim Befehl imap_open eine Flag für das zu verwendende Charset setzen lässt. Ohne Erfolg.
Wenn im Betreff ein solcher Umlaut vorkommt, dann kann er die Mail nichtmal abrufen..
Freue mich auf eure Hilfestellung
george
Hi,
[...] und im Head
<meta http-equiv="content-Type" content="text/html; charset=UTF-8">
eingefügt. Hat sich jedoch nichts geändert..
Und die bekanntlich mit höherer Priorität versehene Angabe im HTTP-Response-Header, hast du die auch angepasst?
MfG ChrisB
Und die bekanntlich mit höherer Priorität versehene Angabe im HTTP-Response-Header, hast du die auch angepasst?
Hab den Header gesetzt header('Content-Type: text/html; charset=utf-8');
und auch beim Mail-Versand imap_mail($to,$subject,$message,"MIME-Version: 1.0\nContent-Type: text/html; charset=UTF-8\nFrom:$from");
angegeben.
Jetzt kommen Sie in Outlook richtig an. Online steht als Betreff allerdings "=?x-unknown?B?dMOkc3Q=?="
Und wenn ich von Outlook aus Antworte kommt als Betreff "=?UTF-8?Q?AW:_t=C3=A4st?=", wobei "AW:_t=C3=A4st" als "AW: täst" versendet wurde.
Bei Outlook steht jetzt alles richtig dargestellt und Online innerhalb des Bodys der Mail auch. Wenn ich dann allerdings mit Outlook auf die Mail antworte bekomme ich nicht nur den komischen Betreff Online, sondern auch diesen Body:
This is a multi-part message in MIME format.
------=_NextPart_000_0006_01CB0980.0E4B9790
Content-Type: text/plain;
charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
t=C3=A4t
------=_NextPart_000_0006_01CB0980.0E4B9790--
george
http://ch2.php.net/manual/de/ref.imap.php --> Erster Comment-Eintrag
Was soll mit dem Kommentar sein? Da steht, was man machen kann, wenn man die PHP-eigene IMAP-Erweiterung nicht nutzen kann. Willst du damit andeuten, du würdest etwas anderes benutzen?
Klappt auch so wies soll, außer, dass Umlaute nicht dargestellt werden [�]. Habe die php-Datei zu UTF ohne BOM konvertiert und im Head
<meta http-equiv="content-Type" content="text/html; charset=UTF-8">
eingefügt. Hat sich jedoch nichts geändert..
IMAP liefert E-Mail-Rohdaten, grundsätzlich musst du eine E-Mail deshalb erstmal dekodieren, bevor du sie anzeigen kannst (Stichwort MIME). Es bringt dir nichts, in der HTML-Seite den Zeichensatz einzustellen, wenn die E-Mail vielleicht gar nicht in diesem Zeichensatz vorliegt.
Speziell bei utf-8 möchte ich gar behaupten, dass die wenigsten Mails in diesem Format geliefert werden, iso-8859-1 dürfte nach wie vor die meistgenutzte Zeichenkodierung sein – und dann sind möglicherweise auch noch die Zeichen jenseits 127 quoted-printable kodiert.
Hi!
ich habe gerade versucht, ein winziges Online-Mail-System auf meinen Server zu laden, welches einfach die Mails von meinem aktuellen Mail-Server runterlädt.
Was genau soll da ablaufen? Wer stellt welche Anfrage und sendet/empfängt welche Daten?
http://ch2.php.net/manual/de/ref.imap.php --> Erster Comment-Eintrag
Der zeitlich erste oder der gelistet erste? Beide erhellen mich aber wenig um deine Konstellation zu verstehen.
Klappt auch so wies soll, außer, dass Umlaute nicht dargestellt werden [�].
Sieht aus, als ob keine gültige UTF-8-Sequenz vorliegt.
Habe die php-Datei zu UTF ohne BOM konvertiert und im Head
<meta http-equiv="content-Type" content="text/html; charset=UTF-8">
eingefügt. Hat sich jedoch nichts geändert..
Warum hast du das gemacht? Einfach mal so? Oder hast du dir vorher die Hexwerte der betroffenen Zeichen angezeigt, um Rückschlüsse auf die tatsächlich verwendete Kodierung zu ziehen?
Hab auch geschaut, ob sich beim Befehl imap_open eine Flag für das zu verwendende Charset setzen lässt. Ohne Erfolg.
Die Mails selbst haben einen Content-Type-Header, in dem wie bei HTTP eine charset-Angabe beigefügt sein kann oder auch nicht. Das ist der für alle (Text-)Inhaltstypen gültige Hinweis auf deren (vom Absender verwendete) Kodierung. HTML-Meta-Angaben können lediglich ein Ersatz sein, wenn die Header nicht ordentlich gesetzt sind.
Wenn im Betreff ein solcher Umlaut vorkommt, dann kann er die Mail nichtmal abrufen.
Für den Betreff (und alle anderen Text enthaltenden Header) gelten nochmal andere Regeln.
Lo!
sry, war der zweite Eintrag (von oben nach unten gelesen):
<html>
<head><title>Mail</title></head>
<body>
<table><tr><td>
<?php
$host='{mail.example.com/notls/imap4}INBOX'; //Host to connect
$user='user';
$pass='password';
$from='someone@example.com'; //Mail to send from
$mail=@imap_open($host,$user,$pass) or die("Can't connect: " . imap_last_error());
if($_REQUEST['delete']) {
$number=$_REQUEST['delete'];
imap_delete($mail,$number);
imap_expunge($mail);
}
if($_REQUEST['see']) {
$number=$_REQUEST['see'];
echo "<pre>";
echo imap_body($mail,$number);
echo "</pre><p>\n\n";
echo "<a href='javascript:history.back()'>Back</a>";
echo "<br><a href='page.php?delete=$number'>Delete</a>";
} else {
if($_REQUEST['create']=="new") {
if($_POST['send_m']) {
$to=$_POST['to'];
$subject=$_POST['title'];
$message=$_POST['mail'];
imap_mail($to,$subject,$message,"From: $from");
}
?>
<form method=POST>
To: <input type="text" name="to"><br>
Title:<input type="text" name="title"><p>
Mail:<br>
<textarea name='mail'>
</textarea><p>
<input type="submit" name='send_m' value='Poąlji'>
</form>
<?php
} else {
$mails=imap_num_msg($mail);
echo "<b>" . $from . "</b> : ";
if($mails==0) {
echo "<i>no mails.</i>";
} else {
echo "$mails mails<p>";
for($i=1;$i<=$mails;$i++) {
$chead=imap_headerinfo($mail,$i);
$mid=ltrim($chead->Msgno);
echo "<a href='page.php?see=$mid'>";
echo $chead->subject;
echo "</a>";
echo "<br>\n";
}
}
echo "<p><a href='page.php?create=new'>New mail</a><p>";
}
}
imap_close($mail);
?>
</tr></td></table>
</body>
</html>
Hi!
sry, war der zweite Eintrag (von oben nach unten gelesen):
Ach der, wo der Code einfach nur so kommentarlos rumsteht.
Es hilft aber nichts, wenn du ihn hier nochmal wiederholst. Betreibe mehr Debugging, um die Ursache für nicht funktionierendes zu finden. Und informiere dich zu den genannten Stichwörter (quoted-printable, E-Mail-Header-Encoding). Bei Priblemem mit Zeichen ist es immer hilfreich, sie die Hex-Werte anzeigen zu lassen anstatt irgendwelcher Interpretationen dieser durch anzeigende Systeme.
Lo!
Nach längerer Recherche habe ich nun fast alle Probleme gelöst (Multipart, Bodyumlaute,...)
Letztes Problem ist das Abrufen des Betreffs:
Damit Umlaute im Betreff in Outlook korrekt angezeigt werden, wird der Betreff vor Übergabe an imap_mail wie folgt umgewandelt:
$subject=imap_8bit($subject);
$subject="=?iso-8859-1?Q?". $subject. "?=";
Das klappt, allerdings wird er online so angezeigt:
=?iso-8859-1?Q?ächo? (Betreff=ächo)
durch folgenden Code:
$chead=imap_headerinfo($mail,$i);
echo imap_qprint($chead->subject);
Das könnt ich jetzt noch mit ner regexp rausfiltern. Aber wenn ich von Outlook aus ne Mail schreibe und online Abrufe wird aus dem Betreff "bäh" --> "=?iso-8859-1?B?YuRo?". Also das ?Q? wird zu ?B? und bäh wird zu YuRo. Was ist das für eine Kodierung / wie decode ich das?
--> mb_decode_mimeheader()
Danke für eure Hilfe!