Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Problem mit imap-fetchstructure, Mail-Codierung

Frage Entwicklung PHP

Mitglied: Gandolfo

Gandolfo (Level 1) - Jetzt verbinden

01.11.2013 um 04:10 Uhr, 3074 Aufrufe, 1 Kommentar

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
Mitglied: Gandolfo
01.11.2013, aktualisiert 02.11.2013
Hier ist der PHP-Code

01.
<? 
02.
// POP3-Server 
03.
$host = ""
04.
$port = "110"
05.
 
06.
// Logindaten 
07.
$user = ""
08.
$passwort = ""
09.
 
10.
 
11.
// Verbinden zur Mailbox  
12.
$mailbox=imap_open("{".$host."/pop3:110/novalidate-cert}INBOX",$user,$passwort, OP_SILENT);  
13.
  
14.
// Überprüfen ob Verbindung erfolgreich,  
15.
// dann weiter...  
16.
if ($mailbox) { 
17.
	 
18.
	// Posteingang überprüfen  
19.
	$check=imap_check($mailbox);  
20.
 
21.
	$anzahl_nachrichten = $check->Nmsgs; // Anzahl vorhandener Emails im Postfach  
22.
	 
23.
	$anzahl_neue_nachrichten = $check->Recent; // Anzahl neuer Emails im Postfach  
24.
	 
25.
	// Emails auslesen 
26.
	$nMessages = imap_num_msg($mailbox); 
27.
	for($i = 1; $i <= $nMessages; $i++) {  
28.
		  
29.
 
30.
		// Header erfassen  
31.
		$mail_header = imap_headerinfo($mailbox, $i);  
32.
		 
33.
		// Datum erfassen  
34.
		$mail_date = $mail_header->Date
35.
		$mail_date = date("Y-m-d H:i:s",strtotime($mail_date)); 
36.
		 
37.
		// Mail-ID erfassen  
38.
		$mail_id = $mail_header->message_id; 
39.
		$elements1 = imap_mime_header_decode($mail_id); 
40.
		 
41.
		for ($i9=0; $i9<count($elements1); $i9++) { 
42.
			$mail_id = $elements1[$i9]->text; 
43.
44.
		$string_laenge = strlen ($mail_id); 
45.
		$mail_id = substr ($mail_id,1,$string_laenge-2); 
46.
		 
47.
				 
48.
		// Empfänger erfassen  
49.
		$mail_to = $mail_header->toaddress; //Mehrere Emnpfänger einbauen 
50.
		$elements2 = imap_mime_header_decode($mail_to); 
51.
		 
52.
		for ($i9=0; $i9<count($elements2); $i9++) { 
53.
			$mail_to = $elements2[$i9]->text; 
54.
55.
		 
56.
		// Absendername erfassen  
57.
		$mail_from_name = $mail_header->from [0]->personal; 
58.
		$elements3 = imap_mime_header_decode($mail_from_name); 
59.
		 
60.
		for ($i9=0; $i9<count($elements3); $i9++) { 
61.
			$mail_from_name = $elements3[$i9]->text; 
62.
63.
		  
64.
		// Absender-eMail-Adresse erfassen  
65.
		$mail_from_address = $mail_header->from [0]->mailbox."@".$mail_header->from [0]->host; 
66.
		$elements4 = imap_mime_header_decode($mail_from_address); 
67.
		 
68.
		for ($i9=0; $i9<count($elements4); $i9++) { 
69.
			$mail_from_address = $elements4[$i9]->text; 
70.
71.
		  
72.
		// Kopieempfänger erfassen  
73.
		$mail_copy_to = $mail_header->cc[0] ->mailbox."@".$mail_header->cc[0] ->host;//Mehrere Emnpfänger einbauen 
74.
		$elements5 = imap_mime_header_decode($mail_copy_to); 
75.
		 
76.
		for ($i9=0; $i9<count($elements5); $i9++) { 
77.
			$mail_copy_to = $elements5[$i9]->text; 
78.
79.
		  
80.
		  
81.
		// Betreff erfassen  
82.
		$mail_subject = ""
83.
		$mail_subject2 = $mail_header->subject; 
84.
		 
85.
		$elements7 = imap_mime_header_decode($mail_subject2); 
86.
		 
87.
		for ($i9=0; $i9<count($elements7); $i9++) { 
88.
			$mail_subject2 = $elements7[$i9]->text; 
89.
			$mail_subject = $mail_subject.$mail_subject2
90.
91.
		 
92.
		 
93.
		//Anhang + Content 
94.
		 
95.
		 
96.
$struct = imap_fetchstructure($mailbox, $i);  
97.
$encoding_id = $struct->encoding; // Hier sollte die Codierung-ID übergeben werden 
98.
			    
99.
				$parts = $struct->parts; 
100.
				$iu = 0; 
101.
		 
102.
				if (!$parts) { // Simple message, only 1 piece 
103.
				  $attachment = array(); // No attachments 
104.
				  $content = imap_body($mailbox, $i); 
105.
				} else { // Complicated message, multiple parts 
106.
			    
107.
				  $endwhile = false; 
108.
			    
109.
				  $stack = array(); // Stack while parsing message 
110.
				  $content = "";    // Content of message 
111.
				  $attachment = array(); // Attachments 
112.
			    
113.
				  while (!$endwhile) { 
114.
					if (!$parts[$iu]) { 
115.
					  if (count($stack) > 0) { 
116.
						$parts = $stack[count($stack)-1]["p"]; 
117.
						$iu     = $stack[count($stack)-1]["i"] + 1; 
118.
						array_pop($stack); 
119.
					  } else
120.
						$endwhile = true; 
121.
122.
123.
				  
124.
					if (!$endwhile) { 
125.
						 
126.
						 
127.
					  // Create message part first (example '1.2.3'
128.
					  $partstring = ""
129.
					  foreach ($stack as $s) { 
130.
						$partstring .= ($s["i"]+1) . "."
131.
132.
					  $partstring .= ($iu+1); 
133.
				    
134.
					  if (strtoupper($parts[$iu]->disposition) == "ATTACHMENT") { // Attachment 
135.
						$attachment[] = array("filename" => $parts[$iu]->parameters[0]->value, 
136.
											  "filedata" => imap_fetchbody($mailbox, $i, $partstring), 
137.
											  "fileencoding" => $parts[$iu]->encoding, 
138.
											  "type" => $parts[$iu]->type); 
139.
										 
140.
					  } elseif (strtoupper($parts[$iu]->subtype) == "PLAIN") { // Message 
141.
						$content .= imap_fetchbody($mailbox, $i, $partstring); 
142.
						 
143.
144.
145.
 
146.
		   		 
147.
					if ($parts[$iu]->parts) { 
148.
					  $stack[] = array("p" => $parts, "i" => $iu); 
149.
					  $parts = $parts[$iu]->parts; 
150.
					  $iu = 0; 
151.
					} else
152.
					  $iu++; 
153.
154.
				  } // while 
155.
				} // complicated message 
156.
 
157.
 
158.
159.
	imap_expunge($mailbox); 
160.
	imap_close($mailbox); 
161.
162.
?>
Bitte warten ..
Ähnliche Inhalte
Outlook & Mail
Mail-Synchronisation per IMAP nicht zuverlässig möglich (6)

Frage von dave84620 zum Thema Outlook & Mail ...

E-Mail
gelöst SBS2011-Exchange- Webmailer- IMAP POP3 (7)

Frage von Ramsys1991 zum Thema E-Mail ...

Outlook & Mail
gelöst Gelöschte Emails durch IMAP in einem Exchange-Postfach werden in Outlook nicht angezeigt (2)

Frage von StefanKittel zum Thema Outlook & Mail ...

Neue Wissensbeiträge
Windows Update

Novemberpatches und Nadeldrucker bereiten Kopfschmerzen

(14)

Tipp von MettGurke zum Thema Windows Update ...

Windows 10

Abhilfe für Abstürze von CDPUsersvc auf Win10 1607 und 2016 1607

(7)

Tipp von DerWoWusste zum Thema Windows 10 ...

RedHat, CentOS, Fedora

Fedora 27 ist verfügbar

Information von Frank zum Thema RedHat, CentOS, Fedora ...

Heiß diskutierte Inhalte
Windows Server
Kennwort vergessen bei Hyper vserver 2012r (12)

Frage von jensgebken zum Thema Windows Server ...

Linux Desktop
Bildschirmauflösung unter Linux festlegen (12)

Frage von itebob zum Thema Linux Desktop ...

Windows Userverwaltung
gelöst Administrator hat alle Rechte verloren (10)

Frage von mrdead zum Thema Windows Userverwaltung ...

DSL, VDSL
gelöst PfSense 2.4.1 an Telekom Entertain 50MBit VDSL BNG, IPTV funktioniert nicht (9)

Frage von stefanxx zum Thema DSL, VDSL ...