Php mail Problem UTF-8

C

Carbon

Guest
Guten Tag,

Erstmal bin ich keine Entwickler bzw. habe keine ahnung vom Php.

Ich habe eine Flirtseite die automatische mails per mail.PHP senden wenn man neu registriert winkserhält etc.

Aber leider kommen die emails immer mit laute karakter. Mit der software firma aus Amerika habe ich gesprochen die meinen das da kein Problem bei denen gibt. (Also kein support)

Es funksioniert nur bei Yahoo mail aber alle andere email adressen bekommen so eine Mail text.

Laut der Firma läuft der script nur mit UTF-8

X-Mailer: PHP v5.2.0
Date: Fri, 17 Oct 2008 10:58:17 +0200
Sender-IP: 145.253.3.244
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="d8b4dc37ca7cbced7f5f3804d01bc753"




--d8b4dc37ca7cbced7f5f3804d01bc753
Content-Type: multipart/alternative; boundary="d8b4dc37ca7cbced7f5f3804d01bc753alt"

--d8b4dc37ca7cbced7f5f3804d01bc753alt
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Hello... You have new interest from Gümüs.

--d8b4dc37ca7cbced7f5f3804d01bc753alt
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit

Hello... You have new interest from Gümüs.

--d8b4dc37ca7cbced7f5f3804d01bc753alt--

--d8b4dc37ca7cbced7f5f3804d01bc753--


Hier meine mail.php auch.

CODE <?php

/*function send_mail($to, $from, $subject, $message)
{
global $g;
if (isset($g['options']['mail_html']) and $g['options']['mail_html'] == "Y") $ct = "text/html";
else $ct = "text/plain";

if (isset($g['options']['mail_utf8']) and $g['options']['mail_utf8'] == "Y") {
$headers = "From: " . $from . "\r\n";
$headers .= "Content-Type: " . $ct . "; charset=utf-8\r\n";
$headers .= "Reply-To: " . $from . "\r\n";
$headers .= "Return-Path: " . $from . "\r\n";
} else {
$headers = "From: " . $from . "\r\n";
$headers .= "Content-Type: " . $ct . "\r\n";
$headers .= "Reply-To: " . $from . "\r\n";
$headers .= "Return-Path: " . $from . "\r\n";
}

if (isset($g['options']['mail_utf8_subject']) and $g['options']['mail_utf8_subject'] == "Y") $subject = '=?UTF-8?B?'.base64_encode(trim(preg_replace('#[\n\r]+#s', '', $subject)))."?=\n";
mail($to, $subject, $message, $headers);
}*/


function send_mail($to_mail, $from_mail, $subject, $html_message) {
$headers = "";
$headers .= "From: " . "<" . $from_mail . ">" . "\r\n";
$headers .= "Reply-To: " . "<" . $from_mail . ">" . "\r\n";
$headers .= "Return-Path: " . "<" . $from_mail . ">" . "\r\n";
$headers .= "Message-ID: <" . time() . "-" . $from_mail . ">" . "\r\n";
$headers .= "X-Mailer: PHP v" . phpversion() . "\r\n";
$headers .= 'Date: ' . date("r") . "\r\n";
$headers .= 'Sender-IP: ' . $_SERVER["REMOTE_ADDR"] . "\r\n";
$headers .= 'MIME-Version: 1.0' . "\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"" . md5(time()) . "\"" . "\r\n" . "\r\n";

$alt_message = $html_message;
$alt_message = str_replace('<br>', "\n", $alt_message);
$alt_message = str_replace('<br />', "\n", $alt_message);
$alt_message = str_replace('<p>', "\n\n", $alt_message);
$alt_message = str_replace('<div>', "\n\n", $alt_message);
$alt_message = strip_tags($alt_message);

$msg = "";
$msg .= "--" . md5(time()) . "\r\n";
$msg .= "Content-Type: multipart/alternative; boundary=\"" . md5(time()) . "alt" . "\"" . "\r\n" . "\r\n";
$msg .= "--" . md5(time()) . "alt" . "\r\n";
$msg .= "Content-Type: text/plain; charset=utf-8" . "\r\n";
$msg .= "Content-Transfer-Encoding: 8bit" . "\r\n" . "\r\n";
$msg .= strip_tags($alt_message) . "\r\n" . "\r\n";
$msg .= "--" . md5(time()) . "alt" . "\r\n";
$msg .= "Content-Type: text/html; charset=utf-8" . "\r\n";
$msg .= "Content-Transfer-Encoding: 8bit" . "\r\n" . "\r\n";
$msg .= $html_message . "\r\n" . "\r\n";
$msg .= "--" . md5(time()) . "alt" . "--" . "\r\n" . "\r\n";
$msg .= "--" . md5(time()) . "--" . "\r\n" . "\r\n";

$to = trim(ereg_replace("/[\r\n]/", "", $to_mail));

if ($subject != '') {
$subject = '=?utf-8?b?' . base64_encode(trim(str_replace(array("\r", "\n"), "", $subject))) . "?=";
} else {
$subject = '';
}

ini_set('sendmail_from', "<" . $from_mail . ">");
if (!mail($to, $subject, $msg, $headers)) {
trigger_error('send_mail(): Can\'t send mail via mail() function');
}
ini_restore('sendmail_from');
}


Kann jemand mir helfen bitte ist sehr sehr wichtig.

 
QUOTE X-Mailer: PHP v5.2.0
Date: Fri, 17 Oct 2008 10:58:17 +0200
Sender-IP: 145.253.3.244
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="d8b4dc37ca7cbced7f5f3804d01bc753"


--d8b4dc37ca7cbced7f5f3804d01bc753
Content-Type: multipart/alternative; boundary="d8b4dc37ca7cbced7f5f3804d01bc753alt"

--d8b4dc37ca7cbced7f5f3804d01bc753alt
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

Hello... You have new interest from Gümüs.

--d8b4dc37ca7cbced7f5f3804d01bc753alt
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit

Hello... You have new interest from Gümüs.

--d8b4dc37ca7cbced7f5f3804d01bc753alt--

--d8b4dc37ca7cbced7f5f3804d01bc753--


Das kommt mir sehr spanisch vor.
Das stimmt doch vorne und hinten nicht. Und den Schmarn zeigt Yahoo _korrekt_ an?

Am besten du lässt nen Entwickler das komplett neu machen. Das is ne Arbeit von 10-20min, wenn nur dieses Script erneuert werden muss.

Also erstmal sollte im header: Content-Type: text/html stehen und nicht einfach multipart/mixed
Was Content-Type: text/html nun wiederrum im Content zu suchen hat ist für mich nur ein Haufen Fragezeichen.

Ich hab das nur kurz überflogen und kann keine 100% Aussagen geben, aber das geht auch schlanker und effizienter und vor
allem funktionierend...
 
Ich steige bei diesen Skript auch vorne und hinten nicht durch, da gebe ich nitrit vollkommen recht.

Die Mailfunktion in PHP ist eigentlich eine sehr simple Sache, die nur wenige Zeilen Code benötigt. Um so weniger kann ich verstehen, was dieses endlos-aufgeblasene Skript verursachen soll.

Leider geht aus deinem Thread nicht wirklich hervor, wann das Skript an wen eine Mail senden soll.
Da das Skript jedoch eine md5-Prüfsummer auf den TimeStamp erstellt, gehe ich davon aus, dass das Skript bei Neuregistrierung eine Email versenden soll, um die Registrierung zu bestätigen. Richtig?
 
Hallo

Poste mal das "korrekte" E-Mail von Yahoo, damit ich sehe, wie es aussehen sollte. Danke!

Gruss
Lenny
 
QUOTE (nitrit @ Fr 17.10.2008, 14:29)Das kommt mir sehr spanisch vor.
Das stimmt doch vorne und hinten nicht. Und den Schmarn zeigt Yahoo _korrekt_ an?

Am besten du lässt nen Entwickler das komplett neu machen. Das is ne Arbeit von 10-20min, wenn nur dieses Script erneuert werden muss.



Da muss ich dir wiedersprechen. Multipart Emails richtig verschicken ist eine Kunst für sich, damit die Sachen halbwegs vernünftig dargestellt werden (Richtige Encodings, Content-Types, Content-Transfer-Encoding usw.).


QUOTE (nitrit @ Fr 17.10.2008, 14:29)
Also erstmal sollte im header: Content-Type: text/html stehen und nicht einfach multipart/mixed
Was Content-Type: text/html nun wiederrum im Content zu suchen hat ist für mich nur ein Haufen Fragezeichen.


Scheinbar handelt es sich um eine multipart Nachricht, also eine HTML-Mail mit alternativen Plaintext-Teil. Von daher könnte multipart/mixed schon stimmen. Das --d8b4dc37ca7cbced7f5f3804d01bc753alt-- ist ein Trenner zwischen den verschiedenen Parts und danach muss wieder ein Content-Type stehen, welcher angibt, wie dieser Teil zu interpretieren ist.
 
@nitrit, @littlefish: Offenbar habt Ihr euch noch nie mit den Regeln für Mailcodierungen beschäftigt.

Das sind ganz normale Multipart-Darstellungen.

QUOTE (nitrit @ Fr 17.10.2008, 13:29)Also erstmal sollte im header: Content-Type: text/html stehen und nicht einfach multipart/mixed
Was Content-Type: text/html nun wiederrum im Content zu suchen hat ist für mich nur ein Haufen Fragezeichen.


Natürlich hat jeder Part seinen eigenen Content-Type, deshalb ist ja der Header multipart/mixed und gerade nicht text/html.


QUOTE (littlefish @ So 19.10.2008, 10:39)Die Mailfunktion in PHP ist eigentlich eine sehr simple Sache, die nur wenige Zeilen Code benötigt.


Die Mailfunktion mail in PHP ist eine Katastrophe. Da muß man diese ganzen, teils historisch bedingten, protokollnahen Dinge selbst machen, die einem in anderen Programmierumgebungen abgenommen werden.

Für einen Kunden habe ich jetzt etwas gebaut, so daß dessen Shopbestellungen automatisiert ausgelesen und per Mail an ein Konto geschickt werden, das dann abgefragt und der Mailinhalt in die server-daten - Datenbank reinkommt. Weil PHP bsp. nicht von sich her Umlaute mail-protokoll-gerecht berücksichtigt, weil die Zeilenlängen > 78 Zeichen sein können, erledige ich das inzwischen so:


QUOTE $nachricht = chunk_split( base64_encode(utf8_encode($mail)), 68, "\n");


Eine Nachricht sieht dann so aus:


QUOTE Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: base64

PD94bWwgdmVyc2lvbj0nMS4wJz8+PHJvb3Q+CjxjdXN0b21lcnM+CjwvY3VzdG9tZXJz
Pgo8L3Jvb3Q+Cg==


was dann decodiert gleich


QUOTE <?xml version='1.0'?><root>
<customers>
</customers>
</root>


ist. Innerhalb von .NET muß ich mich um solchen protokollnahen Kram nicht kümmern.
 
Zum obigen Script: Ich vermute, daß der Inhalt von $html_message zu lang ist.

Zeilen dürfen maximal 78 Zeichen lang sein (plus \r\n = 80). Wenn das sehr viel länger ist, dann kann der Mail Transfer Agent (MTA) die Mail zurückweisen. Vermutlich ist Yahoo da toleranter.

Damit kann man $html_message nach dem oben geposteten Codeschnipsel als base64 codieren, muß dann aber natürlich Content-Transfer-Encoding entsprechend anpassen.
 
Zurück
Oben