Mail und MySQL

bastiglasl

Erfahrenes Mitglied
Ich sitz grad an nem Webmail und lasse mir von verschiedenen Pop-Konten Emails auslesen und in ner Datenbank speichern. Soweit so gut...
Wie kann ich die Emails wieder auslesen, sodaß bei Plain-Nachrichten die Formatierung beibehalten wird. Momentan laufen die Mails in ein Blob-Feld, ist das Falsch? Kann es sein, daß ich die Mails irgendwie kodieren muß, damit ich sie richtig formatiert zurückbekomme?

Dasselbe Problem hab ich nicht nur mit dem Mailbody, sondern auch mit Anhängen.
Hab ich irgeneinen größeren Fehler gemacht?
Code:
function pop($UserID, $popserver, $username, $password, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail) {

	$Server = "{".$popserver."/pop3:110}" ;
	$mbox = imap_open($Server, $username, $password);
	if ($mbox) {
		echo("<b>Sie sind mit dem Postfach verbunden!</b><P><P>"); 
	} else { die(imap_last_error()); }
	
	for ($i = 1; $i <= imap_num_msg($mbox); $i++) {
	
		$header = imap_header($mbox, $i);
		$Structure = imap_fetchstructure($mbox, $i);
		/* ?><PRE><? print_r($header) ?></PRE><? */
		/* ?><PRE><? print_r($Structure) ?></PRE><? */
		
		$SenderInfo = imap_fetchbody($mbox, $i, 0);
		
		$answered = $header->Answered;
		$ccaddress = $header->ccaddress;
		$ccMailbox = "";
		$ccHost = "";
		for ($j = 0; $j < count($header->cc); $j++) {
			$ccMailbox .= $header->cc[$j]->mailbox.";";
		 	$ccHost  .= $header->cc[$j]->host.";";
		}
		$ccMailbox = substr($ccMailbox, 0, strlen($ccMailbox)-1);
		$ccHost = substr($ccHost, 0, strlen($ccHost)-1);
		
		
		$bccaddress = $header->bccaddress;
		$bccMailbox = "";
		$bccHost = "";
		for ($j = 0; $j < count($header->cc); $j++) {
			$bccMailbox .= $header->bcc[$j]->mailbox.";";
		 	$bccHost  .= $header->bcc[$j]->host.";";
		}
		$bccMailbox = substr($bccMailbox, 0, strlen($bccMailbox)-1);
		$bccHost = substr($bccHost, 0, strlen($bccHost)-1);
		
		
		/* print_r ($ccMailbox); */
		$date =  $header->Date;
		$fromaddress = $header->fromaddress;
		$fromPersonal ="";
		$fromHost = "";
		$fromMailbox ="";
		for ($j = 0; $j < count($header->from); $j++) {
			$fromPersonal .= $header->from[$j]->personal.";";
			$fromMailbox .= $header->from[$j]->mailbox.";";
		 	$fromHost  .= $header->from[$j]->host.";";
		}
		/* print_r($fromPersonal); */
 		$fromPersonal = substr($fromPersonal, 0, strlen($fromPersonal)-1);
		$fromMailbox = substr($fromMailbox, 0, strlen($fromMailbox)-1);
		$fromHost = substr($fromHost, 0, strlen($fromHost)-1);
		
		
		$MailDate = $header->MailDate;
		$message_id = $header->message_id;
		$Msgno = $header->Msgno;
		$recent = $header->Recent;
		$replytoaddress = $header->reply_toaddress;
		
		
		$replytoPersonal ="";
		$replytoMailbox ="";
		$replytoHost ="";
		
		for ($j = 0; $j < count($header->reply_to); $j++) {
			$replytoMailbox .= $header->reply_to[$j]->personal.";";
			$replytoPersonal .= $header->reply_to[$j]->mailbox.";";
		 	$replytoHost  .= $header->reply_to[$j]->host.";";
		}
		$replytoMailbox = substr($replytoMailbox, 0, strlen($replytoMailbox)-1);
		$replytoPersonal = substr($replytoPersonal, 0, strlen($replytoPersonal)-1);
		$replytoHost = substr($replytoHost, 0, strlen($replytoHost)-1);
		
		$senderaddress = $header->senderaddress;
		$senderMailbox ="";
		$senderPersonal ="";
		$senderHost ="";
		
		for ($j = 0; $j < count($header->sender); $j++) {
			$senderMailbox .= $header->sender[$j]->mailbox.";";
			$senderPersonal .= $header->sender[$j]->personal.";";
		 	$senderHost  .= $header->sender[$j]->host.";";
		}
		$senderMailbox = substr($senderMailbox, 0, strlen($senderMailbox)-1);
		//$senderPersonal = substr($senderPersonal, 0, strlen($senderPersonal)-1);
		$senderHost = substr($senderHost, 0, strlen($senderHost)-1);
		
		
		$Size = $header->Size;
		$subject = $header->Subject;
		$toaddress = $header->toaddress;
		
		$toaddress = $header->senderaddress;
		$toMailbox ="";
		
		$toHost ="";
		
		for ($j = 0; $j < count($header->to); $j++) {
			$toMailbox .= $header->to[$j]->mailbox.";";
			$toHost  .= $header->to[$j]->host.";";
		}
		$toMailbox = substr($toMailbox, 0, strlen($toMailbox)-1);
		$toHost = substr($toHost, 0, strlen($toHost)-1);
		
       	$udate = $header->udate;
		$unseen = $header->Unseen;
		$Flagged = $header->Flagged;
		$Deleted = $header->Deleted;
		$Draft = $header->Draft;
		
		
				
		$body = ( imap_body ($mbox, $i));

		$body = ereg_replace("'","\'",$body);
		$body = ereg_replace('"',"\"",$body);
		
		$subject = ereg_replace("'","\'",$subject);
		$subject = ereg_replace('"',"\"",$subject);
		
		$SenderInfo = ereg_replace("'","\'",$SenderInfo);
		$SenderInfo = ereg_replace('"',"\"",$SenderInfo);
		
		
		
		$Werte = "answered".chr(2).$answered.chr(2)."ccaddress".chr(2).$ccaddress.chr(2)."ccMailbox".chr(2).$ccMailbox.chr(2)."ccHost".chr(2).$ccHost.chr(2)."date".chr(2).$date.chr(2)."fromaddress".chr(2).$fromaddress.chr(2)."fromPersonal".chr(2).$fromPersonal.chr(2)."fromMailbox".chr(2).$fromMailbox.chr(2)."fromHost".chr(2).$fromHost.chr(2)."MailDate".chr(2).$MailDate.chr(2)."message_id".chr(2).$message_id.chr(2)."Msgno".chr(2).$Msgno.chr(2)."recent".chr(2).$recent.chr(2)."replytoaddress".chr(2).$replytoaddress.chr(2)."replytoPersonal".chr(2).$replytoPersonal.chr(2)."replytoMailbox".chr(2).$replytoMailbox.chr(2)."replytoHost".chr(2).$replytoHost.chr(2)."senderaddress".chr(2).$senderaddress.chr(2)."senderMailbox".chr(2).$senderMailbox.chr(2)."senderPersonal".chr(2).$senderPersonal.chr(2)."senderHost".chr(2).$senderHost.chr(2)."Size".chr(2).$Size.chr(2)."subject".chr(2).$subject.chr(2)."toaddress".chr(2).$toaddress.chr(2)."toMailbox".chr(2).$toMailbox.chr(2)."toHost".chr(2).$toHost.chr(2)."udate".chr(2).$udate.chr(2)."unseen".chr(2).$unseen.chr(2)."Flagged".chr(2).$Flagged.chr(2)."Deleted".chr(2).$Deleted.chr(2)."Draft".chr(2).$Draft.chr(2)."body".chr(2).$body.chr(2)."UserNr".chr(2).$UserID.chr(2)."SenderInfo".chr(2).$SenderInfo.chr(2)."bccaddress".chr(2).$bccaddress.chr(2)."bccMailbox".chr(2).$bccMailbox.chr(2)."bccHost".chr(2).$bccHost;


		
	$pruefUID = selectString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Mail", "message_id", "message_id", $message_id);
	if ($pruefUID != $message_id) {
		SectionEintrag($mbox, $i, $Structure, $message_id, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail);
		insertString ($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Mail", $Werte);
	}
		
		
	}
imap_close($mbox);
}

function SectionEintrag($mbox, $Msgno, $Structure, $message_id, $host_webmail, $user_webmail, $pwd_webmail, $database_webmail) {
	if (! $Structure->parts) {
		$type = $Structure->type;
		$subtype = $Structure->subtype;
		$encoding = $Structure->encoding;
		$bytes = $Structure->bytes;
		$attribute = $Structure->parameters[0]->attribute;
		$value = $Structure->parameters[0]->value;
		$disposition = $Structure->disposition;
		$section = imap_fetchbody($mbox, $Msgno, 1);
			
		$section = ereg_replace("'","\'",$section);
		$section = ereg_replace('"',"\"",$section);
		$Werte = "type".chr(2).$type.chr(2)."subtype".chr(2).$subtype.chr(2)."encoding".chr(2).$encoding.chr(2)."bytes".chr(2).$bytes.chr(2)."attribute".chr(2).$attribute.chr(2)."value".chr(2).$value.chr(2)."disposition".chr(2).$disposition.chr(2)."Section".chr(2).$section.chr(2)."message_id".chr(2).$message_id.chr(2)."SectionID".chr(2)."1";
	
		insertString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Sections", $Werte);
		
		
	} else {
		for ($zz = 0; $zz < (count($Structure->parts)); $zz++) { 
			$type = $Structure->parts[$zz]->type;
			$subtype = $Structure->parts[$zz]->subtype;
			$encoding = $Structure->parts[$zz]->encoding;
			$bytes = $Structure->parts[$zz]->bytes;
			$attribute = $Structure->parts[$zz]->parameters[0]->attribute;
			$value = $Structure->parts[$zz]->parameters[0]->value;
			$disposition = $Structure->parts[$zz]->disposition;
	
	
			?><PRE><? print_r($Structure) ?></PRE><? 
			$section = imap_fetchbody($mbox, $Msgno, $zz+1);
			/* print($section);
			echo("<hr>"); */
			$section = ereg_replace("'","\'",$section);
			$section = ereg_replace('"',"\"",$section);
			
			
			
			
			$Werte = "type".chr(2).$type.chr(2)."subtype".chr(2).$subtype.chr(2)."encoding".chr(2).$encoding.chr(2)."bytes".chr(2).$bytes.chr(2)."attribute".chr(2).$attribute.chr(2)."value".chr(2).$value.chr(2)."disposition".chr(2).$disposition.chr(2)."Section".chr(2).$section.chr(2)."message_id".chr(2).$message_id.chr(2)."SectionID".chr(2).$zz;
	
			insertString($host_webmail, $user_webmail, $pwd_webmail, $database_webmail, "Sections", $Werte);
		}
	}
}
 
Ich hab zwar mit den imap funktionen noch nicht gearbeitet, aber ein paar Sachen mit Email gemacht.
Die einzelnen Teile der Emails koennen kodiert sein, meistens mit base64 oder quo-pri. So wie ich das sehe gibt imap_fetchbody einfach einen Teil aus dem Body der Mail zurueck, so wie er drinsteht, also kodiert. Du muesstest demnach den String, der dabei rauskommt abhaengig von der Kodierung, die im Header dieses Bodyteils steht, dekodieren.

Dafuer musst du schauen, was $encoding enthaelt, und dann mit den entsprechenden PHP-Funktionen dekodieren:
http://de2.php.net/manual/en/function.quoted-printable-decode.php
http://de2.php.net/manual/en/function.base64-decode.php
http://de2.php.net/manual/en/function.imap-base64.php

In die DB kannst du dann das Resultat als BLOB speichern, aber Achtung: Anhaenge koennen sehr grosz sein, und Bytecodedaten enthalten (wie zB Bilder, Zipdateien, Executables, etc).

Ich weisz nciht, wie du das genau planst, aber ich wuerde eher die Emails auf Anhaenge pruefen und die Anhaenge im Dateisystem und nicht in der DB speichern. Ob ein Ahang dabei ist und wie er heisst muesste dir imap_fetchstructure() im String "disposition" sagen.

Keine Ahnung ob das war, was du brauchst. Ich kann dir nur empfehlen dich ueber Emails zu informieren, wenn du so was machen willst. Les dazu die RFCs 822, 2045-2049
 
Zurück