expertenaustausch > comp.lang.* > comp.lang.php.misc

Florian Lindner (28.11.2004, 18:49)
Hallo,
folgende Fälle:

a) Ich sende vom Linux-Server eine Mail ab (mittels Kommando mail). Die
Mail kommt bei mir an und enthält weder einen Content-Type noch einen
Content-Transfer-Encoding Header.

b) Ich erstelle mir eine Mail mit php

Code:

$strFrom = '"Beispiel" <absender>';
$strEmpfaenger = "florian.lindner";
$strSubject = "Betreff"
$strMailtext = "Special German Characters: äöü ÄÖÜ ß\n";
if(get_magic_quotes_gpc()) {
$strMailtext = stripslashes($strMailtext);
};
$strSubject = 'Test des Mail-Befehls (ohne Content-Type)';

und sende mir diese mittels der php mail()-Funktion zu:
Code:

mail($strEmpfaenger, $strSubject, $strMailtext, "From: $strFrom");

Hier gibt es nun die folgenden Einträge:
Content-Type: text/plain: charset=UTF-8
Content-Transfer-encoding: BASE64

Dann ändere ich den php-mail()-Befehl ab in
Code:

$strSubject = 'Betreff';
mail($strEmpfaenger, $strSubject, $strMailtext, "From:
$strFrom\r\nContent-Type: text/plain;
charset=utf-8\r\nContent-Transfer-encoding: quoted-printable\r\n");

Und hier finde ich nun VIER Einträge:
Content-Type: text/plain: charset=utf-8
Content-Transfer-encoding: quoted-printable
Content-Type: text/plain: charset=UTF-8
Content-Transfer-encoding: BASE64

Das Problem besteht darin, dass auf dem Server in JEDER vom php
erzeugten Mail vor allem diese BAS64-Encoding eingefügt wird. Das macht
die Mail beim Empfänger unlesbar - weil eben quoted-printable richtig wäre.

Dabei ist es gleich, ob ich von meiner php-Seitensoftware was absende
oder von einer phpBB Forensoftware hier. Überall ist der Tag drin und
das Problem ist: Wie werden wir den los??

Es muss eine Einstellung geben irgendwo im Apachen oder php.ini, bei dem
es heißt, dass er das Encoding entsprechend ändert. Die Frage ist nur:
Wo ist die?

Gruß und Danke,

Florian
Mario Mueller (28.11.2004, 19:32)
Am Sun, 28 Nov 2004 20:49:06 +0400 schrieb Florian Lindner:

> $strSubject = 'Betreff';
> mail($strEmpfaenger, $strSubject, $strMailtext, "From:
> $strFrom\r\nContent-Type: text/plain;
> charset=utf-8\r\nContent-Transfer-encoding: quoted-printable\r\n");


Zwei Fragen:

Warum gibst du als Zeichensatzkodierung UTF-8 an und willst den Inhalt
dann quoted-printable übertragen? Das ergibt keinen Sinn.

Ist dein Body wirklich QP-kodiert? Das musst du nämlich selbst machen
und in deinem Beispiel sieht es nicht danach aus, als ob das irgendwo
geschieht.

m.m
Hartmut Holzgraefe (29.11.2004, 00:47)
Mario Mueller wrote:
> Zwei Fragen:
> Warum gibst du als Zeichensatzkodierung UTF-8 an und willst den Inhalt
> dann quoted-printable übertragen? Das ergibt keinen Sinn.


Du kennst den Unterschied zwischen Content-Type:
und Content-Transfer-Encoding:?

Es gibt immer noch (wenn auch nur noch selten) MTAs die
mit 8bit Daten nicht klarkommen. In diesem Fall macht
es durchaus Sinn UTF-8 codierte Inhalte als Quoted-Pribtable
und nicht base64 codiert zu übertragen und damit 7bit-fest
zu machen da bei europäischen Sprachen i.A. nur relativ wenige
Zeichen eines UTF-8 Textes tatsächlich UTF-8 Sequenzen sind.
Base64 würde dagegen den Text grundsätzlich um ca. 30%
aufblähen.
Hartmut Holzgraefe (29.11.2004, 01:00)
Florian Lindner wrote:
> Und hier finde ich nun VIER Einträge:
> Content-Type: text/plain: charset=utf-8
> Content-Transfer-encoding: quoted-printable
> Content-Type: text/plain: charset=UTF-8
> Content-Transfer-encoding: BASE64


Die mail() Funktion setzt diese beiden Header überhaupt nicht,
das macht entweder dein sendmail binary (PHP benutzt als default
/usr/sbin/sendmail und nicht /usr/bin/mail und setzt auch
einige Kommandozeilen-Optionen, evtl. erklärt das den Unterschied
zum reinen mail Kommando?).

> Es muss eine Einstellung geben irgendwo im Apachen oder php.ini,
> bei dem es heißt, dass er das Encoding entsprechend ändert.
> Die Frage ist nur: Wo ist die?


Entsprechende php.ini Parameter gibt es nicht (s.o.), das ist
allein eine Sache der Mailserver-Konfiguration.

Wenn du ernsthaft Email verschicken willst ist die mail()
Funktion aber sowieso nicht die richtige Wahl da ihr Verhalten
zu sehr vom eingesetzten Mailserver und dessen Konfiguration
abhängt.

Eher geeignet ist die direkte Kommunikation zw. PHP und Mailserver
per SMTP ohne Aufruf eines weiteren Binaries. Siehe hierzu z.B.
die PEAR Mail Klasse.
Mario Mueller (29.11.2004, 01:25)
Am Sun, 28 Nov 2004 23:47:22 +0100 schrieb Hartmut Holzgraefe:

> Du kennst den Unterschied zwischen Content-Type:
> und Content-Transfer-Encoding:?


Ich denke schon, dass ich den kenne.

> Es gibt immer noch (wenn auch nur noch selten) MTAs die
> mit 8bit Daten nicht klarkommen.


Welche in der Praxis relevanten MTAs kommen damit nicht klar?

> In diesem Fall macht
> es durchaus Sinn UTF-8 codierte Inhalte als Quoted-Pribtable
> und nicht base64 codiert zu übertragen und damit 7bit-fest
> zu machen da bei europäischen Sprachen i.A. nur relativ wenige
> Zeichen eines UTF-8 Textes tatsächlich UTF-8 Sequenzen sind.
> Base64 würde dagegen den Text grundsätzlich um ca. 30%
> aufblähen.


Den Inhalt würde ich weder Quoted-Pribtable, noch Base64 übertragen. Der
sicherste Weg ist 8 Bit als Transfer-Encoding und ISO-8859-1 als
Zeichensatzkodierung, da wohl wesentlich mehr MUAs nicht mit UTF-8 und
QP klar kommen, als MTAs mit 8 bittigen Daten.

m.m
Ulf Kadner (29.11.2004, 12:13)
Am Mon, 29 Nov 2004 00:25:45 +0100 schrieb Mario Mueller:

> Welche in der Praxis relevanten MTAs kommen damit nicht klar?


Na der des OP! :)

MfG, Ulf
Mario Mueller (29.11.2004, 13:09)
Am Mon, 29 Nov 2004 11:13:47 +0100 schrieb Ulf Kadner:

> Na der des OP! :)


Das wissen wir erst, wenn er mal 8Bit-Daten sendet ;-)

m.m
Florian Lindner (29.11.2004, 14:49)
Ulf Kadner schrieb:
> Am Mon, 29 Nov 2004 00:25:45 +0100 schrieb Mario Mueller:
>>Welche in der Praxis relevanten MTAs kommen damit nicht klar?

> Na der des OP! :)


Der MTA ist postfix 2.1, also eigentlich ein üblicher und aktueller MTA.
Ich bin mir auch nicht bewußt dort an Enocding spezifischen
Einstellungen rumgepfuscht zu habem.

Florian
Florian Lindner (29.11.2004, 14:51)
Mario Mueller schrieb:
> Am Sun, 28 Nov 2004 20:49:06 +0400 schrieb Florian Lindner:
> Zwei Fragen:
> Warum gibst du als Zeichensatzkodierung UTF-8 an und willst den Inhalt
> dann quoted-printable übertragen? Das ergibt keinen Sinn.
> Ist dein Body wirklich QP-kodiert? Das musst du nämlich selbst machen
> und in deinem Beispiel sieht es nicht danach aus, als ob das irgendwo
> geschieht.


Und wie kann ich dann PHP bzw. den MTA dazu bringen überhaupt keine
Encoding vorzunehmen, weder quoted-printable, noch base64?
Florian Lindner (29.11.2004, 14:54)
Hartmut Holzgraefe schrieb:
> Florian Lindner wrote:
> Die mail() Funktion setzt diese beiden Header überhaupt nicht,
> das macht entweder dein sendmail binary (PHP benutzt als default
> /usr/sbin/sendmail und nicht /usr/bin/mail und setzt auch
> einige Kommandozeilen-Optionen, evtl. erklärt das den Unterschied
> zum reinen mail Kommando?).


AFAIK benutzt das mail-Kommando auch /usr/bin/sendmail. Warum werden da
keine Header gesetzt.
> > Es muss eine Einstellung geben irgendwo im Apachen oder php.ini,
> > bei dem es heißt, dass er das Encoding entsprechend ändert.
> > Die Frage ist nur: Wo ist die?

> Entsprechende php.ini Parameter gibt es nicht (s.o.), das ist
> allein eine Sache der Mailserver-Konfiguration.


Habe dort IMO nichts in der Richtung geändert.

> Wenn du ernsthaft Email verschicken willst ist die mail()
> Funktion aber sowieso nicht die richtige Wahl da ihr Verhalten
> zu sehr vom eingesetzten Mailserver und dessen Konfiguration
> abhängt.
> Eher geeignet ist die direkte Kommunikation zw. PHP und Mailserver
> per SMTP ohne Aufruf eines weiteren Binaries. Siehe hierzu z.B.
> die PEAR Mail Klasse.


Danke für dne Tipp, aber es interessiert mich trotzdem, wie ich die Mail
ohne den Eintrag senden kann.

Florian
Mario Mueller (29.11.2004, 15:23)
Am Mon, 29 Nov 2004 16:51:34 +0400 schrieb Florian Lindner:

> Und wie kann ich dann PHP bzw. den MTA dazu bringen überhaupt keine
> Encoding vorzunehmen, weder quoted-printable, noch base64?


Content-Transfer-Encoding: 8bit

m.m
Hartmut Holzgraefe (29.11.2004, 16:52)
Florian Lindner wrote:
> AFAIK benutzt das mail-Kommando auch /usr/bin/sendmail. Warum werden da
> keine Header gesetzt.


k.a., aber die Header werden definitiv nicht von PHP hinzugefügt,
die einzige Stelle im PHP Quellcode an der transfer-encoding
vorkommt ist ein Parametername in einer der Multibyte-String
Funktionen.

Damit dürfte sich das Thema zumindest hier erledigt haben.
Florian Lindner (30.11.2004, 14:25)
Hartmut Holzgraefe schrieb:
> Florian Lindner wrote:
> Die mail() Funktion setzt diese beiden Header überhaupt nicht,
> das macht entweder dein sendmail binary (PHP benutzt als default
> /usr/sbin/sendmail und nicht /usr/bin/mail und setzt auch
> einige Kommandozeilen-Optionen, evtl. erklärt das den Unterschied
> zum reinen mail Kommando?).


Wenn ich über SSH dies ausführe:

anubis root # sendmail -t i -f webmaster
To:<florian.lindner>
ein ü und ein ä und ö

In der apache2-config im VHost folgendes drinsteht:

php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f
webmaster"

Und diese Email so bei mir ankommt:

From - Tue Nov 30 16:21:45 2004
X-Account-Key: account1
X-UIDL: UID7092-1086516433
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Return-Path: <root>
X-Original-To: florian.lindner
Delivered-To: xgmde
Received: by anubis.centershock.net (Postfix, from userid 0)
id 51ED24F746; Tue, 30 Nov 2004 13:16:51 +0100 (CET)
To: <florian.lindner>
Message-Id: <20041130121651.51ED24F746>
Date: Tue, 30 Nov 2004 13:16:51 +0100 (CET)
From: root (root)

ein ü und ein ä und ö

Wer verändert dann das Content-Transfer-Encoding, wenn die mail()
Funktion einfach nur das sendmail binary benutzt??

Grüße,

Florian
Florian Lindner (30.11.2004, 14:29)
Mario Mueller schrieb:
> Am Mon, 29 Nov 2004 16:51:34 +0400 schrieb Florian Lindner:
>>Und wie kann ich dann PHP bzw. den MTA dazu bringen überhaupt keine
>>Encoding vorzunehmen, weder quoted-printable, noch base64?

> Content-Transfer-Encoding: 8bit


Hallo,

Dann kommt eine Mail mit zwei Tags "8bit" und "BASE64" und der Inhalt
lautet dann:

QmVzdGVsbGVpbmdhbmc6IDAwNDAKCjMgKiBDb2RleCBTaW5haX RpY3VzIHp1IMOiwoLCrCA0MCA9
IMOiwoLCrCAxMjAKMyAqIEhlbGxlbmlzY2hzcHJhY2hpZ2UgRG Fyc3RlbGx1bmdlbiB6dSDDosKC
wqwgMTUgPSDDosKCwqwgNDUKMyAqIFdvcnRrdW5kZSBkZXIgQm liZWwgenUgw6LCgsKsIDQ1ID0g
w6LCgsKsIDEzNQoKVmVyc2FuZGtvc3Rlbjogw6LCgsKsIDEuNQ oKR2VzYW10YmV0cmFnOiDDosKC
wqwgMzAxLjUKCkdld2ljaHQ6IDExLjg1IGtnLgoKRGllIFJlY2 hudW5nc2FkcmVzc2UgbGF1dGV0
OgpkZApkZAoKCgpUZWxlZm9uOiAKCkUtTWFpbDogdGVzdEBkZX ZzdXAuZGUKLS0tCkFubWVya3Vu
Z2VuOgoKZGRkZAotLS0K

Grüße,

Florian
Mario Mueller (30.11.2004, 16:02)
Am Tue, 30 Nov 2004 16:29:21 +0400 schrieb Florian Lindner:

> Dann kommt eine Mail mit zwei Tags "8bit" und "BASE64" und der Inhalt
> lautet dann:


Dann stimmt irgendwas mit deiner Sendmail-Konfiguration nicht. Frag am
besten noch mal in einer dafür passenden Gruppe[1] nach.

m.m

[1] de.comm.software.mailserver

Ähnliche Themen