gandolfo
Goto Top

Problem mit imap-fetchstructure, Mail-Codierung

Hallo,

ich möchte mit meiner Homepage regelmäßig ein eMail-Postfach abrufen, und die Mails auslesen und in eine Datenbank speichern. Das sollte ein eigenes kleines Ticketsystem sein. An sich funktioniert das ganze Script auch - Absendername, Mail-Adresse, Betreff und Text werden korrekt zugehörig ausgelesen - nur das mit der Mail-Codierung fläuft schief.

Mit imap_qprint($content); und imap_base64($content); kann ich die Mails einzeln korrekt darstellen. Ich weiß also, wie die Mails entschlüsselt werden. Das ist nicht mein Problem.

Aber die korrekte Bedingung trifft nicht zu.

Die Mail-Struktur wird aufgerufen mit $struct = imap_fetchstructure($mailbox, $i); und das funktioniert ja auch alles.
Und mit $encoding_id = $struct->encoding; sollte man dann die Verschlüsselungsart herausfinden:

$struct = imap_fetchstructure($mailbox, $i);
$encoding_id = $struct->encoding;


Und genau da liegt das Problem.

Die eine Mail wird mit imap_qprint korrekt dargestellt, die andere Mail wird mit imap_base64 korrekt dargestellt. Beide Mails sollen aber angeblich die $encoding_id 0 haben. Und genau das kann nicht sein. Jemand der sich hier auskennt, weiß dass es jeweils die Id 4 und 3 haben müsste.

Also wieso gibt $struct->encoding; eine falsche ID zurück, wenn alle anderen Werte korrekt angezeigt werden?

Das ganze sollte dann so ausgewertet werden:

if($encoding_id =="3") {
$content = imap_base64($content);
$content = utf8_decode($content); //formatiert umlaute

} elseif($encoding_id =="4") {

$content = imap_qprint($content);
} else {

$content;
}

Das funktioniert aber erst, wenn er die korrekte ID ermittelt.


Und weil das nicht funktioniert hat, habe ich noch Beispiele gefunden mit if(imap_base64($content) { ... } elseif..

Das funktioniert aber genauso wenig, weil er dann die erste Bedingung imap_base64 auch dann ausführt, wenn es sich um eine imap_qprint-Verschlüsselte Mail handelt. Also auch dann führt er die falsche Bedingung aus.

Jetzt bin ich ratlos und wüsste nicht, wie ich die Mails korrekt entschlüsseln sollte.

Viele Grüße
Matthias

Content-Key: 220913

Url: https://administrator.de/contentid/220913

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: Gandolfo
Gandolfo 01.11.2013, aktualisiert am 02.11.2013 um 00:34:54 Uhr
Goto Top
Hier ist der PHP-Code

<?
// POP3-Server
$host = "";  
$port = "110";  

// Logindaten
$user = "";  
$passwort = "";  


// Verbinden zur Mailbox 
$mailbox=imap_open("{".$host."/pop3:110/novalidate-cert}INBOX",$user,$passwort, OP_SILENT);   
 
// Überprüfen ob Verbindung erfolgreich, 
// dann weiter... 
if ($mailbox) {
	
	// Posteingang überprüfen 
	$check=imap_check($mailbox); 

	$anzahl_nachrichten = $check->Nmsgs; // Anzahl vorhandener Emails im Postfach 
	
	$anzahl_neue_nachrichten = $check->Recent; // Anzahl neuer Emails im Postfach 
	
	// Emails auslesen
	$nMessages = imap_num_msg($mailbox);
	for($i = 1; $i <= $nMessages; $i++) { 
		 

		// Header erfassen 
		$mail_header = imap_headerinfo($mailbox, $i); 
		
		// Datum erfassen 
		$mail_date = $mail_header->Date;
		$mail_date = date("Y-m-d H:i:s",strtotime($mail_date));  
		
		// Mail-ID erfassen 
		$mail_id = $mail_header->message_id;
		$elements1 = imap_mime_header_decode($mail_id);
		
		for ($i9=0; $i9<count($elements1); $i9++) {
			$mail_id = $elements1[$i9]->text;
		}
		$string_laenge = strlen ($mail_id);
		$mail_id = substr ($mail_id,1,$string_laenge-2);
		
				
		// Empfänger erfassen 
		$mail_to = $mail_header->toaddress; //Mehrere Emnpfänger einbauen
		$elements2 = imap_mime_header_decode($mail_to);
		
		for ($i9=0; $i9<count($elements2); $i9++) {
			$mail_to = $elements2[$i9]->text;
		}
		
		// Absendername erfassen 
		$mail_from_name = $mail_header->from ->personal;
		$elements3 = imap_mime_header_decode($mail_from_name);
		
		for ($i9=0; $i9<count($elements3); $i9++) {
			$mail_from_name = $elements3[$i9]->text;
		}
		 
		// Absender-eMail-Adresse erfassen 
		$mail_from_address = $mail_header->from ->mailbox."@".$mail_header->from ->host;  
		$elements4 = imap_mime_header_decode($mail_from_address);
		
		for ($i9=0; $i9<count($elements4); $i9++) {
			$mail_from_address = $elements4[$i9]->text;
		}
		 
		// Kopieempfänger erfassen 
		$mail_copy_to = $mail_header->cc ->mailbox."@".$mail_header->cc ->host;//Mehrere Emnpfänger einbauen  
		$elements5 = imap_mime_header_decode($mail_copy_to);
		
		for ($i9=0; $i9<count($elements5); $i9++) {
			$mail_copy_to = $elements5[$i9]->text;
		}
		 
		 
		// Betreff erfassen 
		$mail_subject = "";  
		$mail_subject2 = $mail_header->subject;
		
		$elements7 = imap_mime_header_decode($mail_subject2);
		
		for ($i9=0; $i9<count($elements7); $i9++) {
			$mail_subject2 = $elements7[$i9]->text;
			$mail_subject = $mail_subject.$mail_subject2;
		}
		
		
		//Anhang + Content
		
		
$struct = imap_fetchstructure($mailbox, $i); 
$encoding_id = $struct->encoding; // Hier sollte die Codierung-ID übergeben werden
			   
				$parts = $struct->parts;
				$iu = 0;
		
				if (!$parts) { // Simple message, only 1 piece
				  $attachment = array(); // No attachments
				  $content = imap_body($mailbox, $i);
				} else { // Complicated message, multiple parts
			   
				  $endwhile = false;
			   
				  $stack = array(); // Stack while parsing message
				  $content = "";    // Content of message  
				  $attachment = array(); // Attachments
			   
				  while (!$endwhile) {
					if (!$parts[$iu]) {
					  if (count($stack) > 0) {
						$parts = $stack[count($stack)-1]["p"];  
						$iu     = $stack[count($stack)-1]["i"] + 1;  
						array_pop($stack);
					  } else {
						$endwhile = true;
					  }
					}
				 
					if (!$endwhile) {
						
						
					  // Create message part first (example '1.2.3') 
					  $partstring = "";  
					  foreach ($stack as $s) {
						$partstring .= ($s["i"]+1) . ".";  
					  }
					  $partstring .= ($iu+1);
				   
					  if (strtoupper($parts[$iu]->disposition) == "ATTACHMENT") { // Attachment  
						$attachment = array("filename" => $parts[$iu]->parameters->value,  
											  "filedata" => imap_fetchbody($mailbox, $i, $partstring),  
											  "fileencoding" => $parts[$iu]->encoding,  
											  "type" => $parts[$iu]->type);  
										
					  } elseif (strtoupper($parts[$iu]->subtype) == "PLAIN") { // Message  
						$content .= imap_fetchbody($mailbox, $i, $partstring);
						
					  }
					}

		   		
					if ($parts[$iu]->parts) {
					  $stack = array("p" => $parts, "i" => $iu);  
					  $parts = $parts[$iu]->parts;
					  $iu = 0;
					} else {
					  $iu++;
					}
				  } // while
				} // complicated message


		}
	imap_expunge($mailbox);
	imap_close($mailbox);
}
?>