imap_body formatiert und mit Umlauten ausgeben

Catscrash

Mitglied
Hi,
ich benutze folgende Funktion um auf eine email zuzugreifen

$body= imap_body($mbox,$msg);

allerdings werden alle Umlaute durch Zeichen wie "=E4" ersetzt und alle Zeilenumbrüche sind verschwunden... Wie kann ich das umgehen?

Greetz
Catscrash
 
Du wirst, je nach Encoding der eMail den Body erstmal dekodieren muessen bevor Du ihn ausgeben kannst.

Ich mach das bei mir so:
PHP:
function checkbody($body,$struct)
{
	global $mailbox;
	if ($struct->subtype!='PLAIN')
		{
			if ($struct->parts[0]->encoding==3)
				{
					$body=base64_decode($body);
				}
			if ($struct->parts[0]->encoding==4)
				{
					$body=quoted_printable_decode($body);
				}
		}
	else
		{
			if ($struct->encoding==3)
				{
					$body=base64_decode($body);
				}
			if ($struct->encoding==4)
				{
					$body=quoted_printable_decode($body);
				}
		}
	$body=nl2br(htmlentities($body));
	if ($struct->subtype=='MIXED')
		{
			$body.="\n";
			for ($part=1;$part<count($struct->parts);$part++)
				{
					print_r($struct->parts[$part]);
					if ($struct->parts[$part]->type!=2)
						{
							$body.="\t";
							$body.='<a href="download-attachment.php?mailbox='.$mailbox.'&amp;msgid='.$_GET['show'].'&amp;part='.$part.'">&lt;&lt;'.$struct->parts[$part]->dparameters[0]->value.'&gt;&gt;</a>';
						}
				}
		}
	return $body;
}

$struct=imap_fetchstructure($mbox,$_GET['show']);
$body=imap_fetchbody($mbox,$_GET['show'],1);
$body=checkbody($body,$struct);
echo $body;
 
Um Dennis’ aus einer Klasse gerissene Funktion allgemeingültiger zu machen:
PHP:
<?php

	// <url:http://www.mhonarc.org/~ehood/MIME/MIME.html>

	function handleValue($string)
	{
		$pattern = '=\?([^?]+)\?([bq])\?([\x21-\x3E\x40-\x7E]+)\?=';
		$string = preg_replace('/('.$pattern.')(?:\x09|\x0A|\x0D|\x20)+('.$pattern.')/is', '\1\5', $string);
		return preg_replace('/'.$pattern.'/eis', 'decodeValue("\1", strtolower("\2"), "\3")', $string);

	}

	function decodeValue($charset, $encoding, $string)
	{
		if( strlen($string) <= 0 ) {
			return false;
		}
		switch( strtolower($encoding) ) {
			case 'b':
				$string = base64_decode($string);
				break;
			case 'q':
				$string = quoted_printable_decode($string);
				break;
			default:
				return false;
		}
		if( strtolower($charset) == 'utf-8' && strtolower($charset) != ini_get('default_charset') ) {
			$string = utf8_encode($string);
		}
		return $string;

	}

?>
 
Aus einer Klasse ist nicht ganz richtig, sondern aus meinem WebMailer.

Unter der Funktion ist ja auch nur kurz der Code angefuehrt der zuvor die einzelnen Teile der Mail holt um aufzuzeigen welche Teile benoetigt werden.
$_GET['show'] ist halt die Nummer der eMail, entspricht in Catscrashs Script $msg, sollte also im Grunde auch klar sein, was das sein soll.

Zum Thema Klassen: Ich hab ja (noch) nicht fuer alles Klassen. ;)
 
:) danke, hab einiges von den codes hier und aus den php.net-kommentaren kombiniert und jetzt hab ichs genau wie ichs brauche, danke nochmal :)
 

Neue Beiträge

Zurück