gandolfo

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
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 220913

Url: https://administrator.de/forum/problem-mit-imap-fetchstructure-mail-codierung-220913.html

Ausgedruckt am: 04.06.2025 um 21:06 Uhr

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);
}
?>