[code]
<?
class imapMail
{
	private $username;
	private $password;
	private $server;
	private $port;
	private $options;
	private $mailboxName;
	private $connection;
	
	public function imapMail($username, $password, $server, $port, $mailboxName, $options)
	{
		$this->username = $username;
		$this->password = $password;
		$this->server = $server;
		$this->port = $port;
		$this->options = $options;
		$this->mailboxName = $mailboxName;
	}
	public function connect()
	{
		$options = "";
		if(!empty($this->options) && is_array($this->options))
		{
			while(list($key, $option) = each($this->options))
			{
				$options .= "/" . $option;
			}
		}
		
		$adress = '{' . $this->server . ':' . $this->port . $options . '}' . $this->mailboxName;
		$mbox = @imap_open($adress, $this->username, $this->password);
		$this->connection = $mbox;
		if($mbox)
		{
			return true;
		} else
		{
			return false;
		}
	}
	public function closeConnection()
	{
		@imap_close($this->connection);
	}
	public function changeMailbox($mailBoxName)
	{
		if($this->connection)
		{
			return imap_reopen($this->connection, $mailBoxName);
		} else
		{
			return false;
		}
	}
	public function getMails($deleteFromServer = false, $uids = false)
	{
		if($this->connection)
		{
			$num_mgs = imap_num_msg($this->connection);
			$counter = 1;
			while($counter <= $num_mgs)
			{
				if($message = $this->retrieve_message($this->connection, $counter, $uids))
				{
					$berichten [$counter - 1] = $message;
				
				}
				if($deleteFromServer)
				{
					imap_delete($this->connection, $counter);
				}
				$counter++;
			}
			if($deleteFromServer)
			{
				imap_expunge($this->connection);
			}
			return $berichten;
		} else
		{
			return false;
		}
	}
	public function getUnseenMails($turnSeen = false)
	{
		$aMessages = imap_search($this->connection, 'UNSEEN');
		if($aMessages)
		{
			$cMessages = count($aMessages);
			
			while($cMessages > 0)
			{
				$cMessages--;
				$berichten [$cMessages] = $this->retrieve_message($this->connection, $aMessages [$cMessages]);
				if($turnSeen)
				{
					imap_setflag_full($this->connection, $aMessages [$cMessages] . "," . $aMessages [$cMessages], "\\Seen");
				}
			}
			return $berichten;
		} else
		{
			return false;
		}
	}
	
	private function retrieve_message($mbox, $messageid, $uids = false)
	{
		$header = imap_header($mbox, $messageid);
		if($uids)
		{
			if(in_array($header->message_id, $uids))
			{
				return false;
			}
		}
		
		if(!empty($header->subject))
		{
			$message ['subject'] = $this->mine_header_to_text($header->subject);
		}
		if(!empty($header->from [0]->mailbox) && !empty($header->from [0]->host))
		{
			$message ['fromaddress'] = $this->mine_header_to_text($header->from [0]->mailbox) . "@" . $this->mine_header_to_text($header->from [0]->host);
		}
		if(!empty($header->toaddress))
		{
			$message ['toaddress'] = $this->mine_header_to_text($header->toaddress);
		}
		if(!empty($header->ccaddress))
		{
			$message ['ccaddress'] = $this->mine_header_to_text($header->ccaddress);
		}
		if(!empty($header->bccaddress))
		{
			$message ['bccaddress'] = $this->mine_header_to_text($header->bccaddress);
		}
		if(!empty($header->message_id))
		{
			$message ['messageId'] = $this->mine_header_to_text($header->message_id);
		}
		if(!empty($header->date))
		{
			$message ['date'] = $this->mine_header_to_text($header->date);
		}
		$structure = imap_fetchstructure($mbox, $messageid);
		
		$message ['attachment'] = $this->get_attachment($structure, $this->connection, $messageid);
		
		if($this->check_type($structure))
		{
			$dataTxt = $this->get_part($mbox, $messageid, "TEXT/PLAIN");
			$dataHtml = $this->get_part($mbox, $messageid, "TEXT/HTML");
			
			if($dataHtml != "")
			{
				$msgBody = $dataHtml;
				$mailformat = "html";
			} else
			{
				$msgBody = ereg_replace("\n", "<br>", $dataTxt);
				$mailformat = "text";
			}
			
			if($structure->encoding == 3)
			{
				$msgBody = imap_base64($msgBody);
			} else if($structure->encoding == 4)
			{
				$msgBody = quoted_printable_decode($msgBody);
			}
			
			$message ['body'] = $msgBody;
		
		} else
		{
			$msgBody = imap_body($mbox, $messageid);
			if($structure->encoding == 3)
			{
				$msgBody = imap_base64($msgBody);
			} else if($structure->encoding == 4)
			{
				$msgBody = quoted_printable_decode($msgBody);
			}
			
			$message ['body'] = $msgBody;
		}
		return $message;
	}
	
	private function mine_header_to_text($text)
	{
		$elements = imap_mime_header_decode($text);
		$returnText = "";
		for($i = 0; $i < count($elements); $i++)
		{
			$returnText .= $elements [$i]->text . " ";
		}
		return trim($returnText);
	}
	
	private function check_type($structure)
	{
		if($structure->type == 1)
		{
			return (true);
		} else
		{
			return (false);
		}
	}
	
	private function create_part_array($structure, $prefix = "")
	{
		$part_array = array();
		
		if(sizeof($structure->parts) > 0)
		{
			foreach ( $structure->parts as $count => $part )
			{
				$this->add_part_to_array($part, $prefix . ($count + 1), $part_array);
			}
		}
		
		return $part_array;
	}
	
	private function add_part_to_array($obj, $partno, & $part_array)
	{
		
		if($obj->type == TYPEMESSAGE)
		{
			$this->add_part_to_array($obj->parts [0], $partno . ".", & $part_array);
		} else
		{
			if(sizeof($obj->parts) > 0)
			{
				foreach ( $obj->parts as $count => $p )
				{
					$this->add_part_to_array($p, $partno . "." . ($count + 1), $part_array);
				}
			}
		}
		
		$part_array [] = array('part_number' => $partno, 'part_object' => $obj);
	}
	private function get_attachment($struct, $mbox, $msgno)
	{
		
		$files = $this->create_part_array($struct);
		$rAttachments = "";
		$rCounter = 0;
		while(list($key, $array) = each($files))
		{
			if($array ['part_object']->disposition == "INLINE" || $array ['part_object']->disposition == "ATTACHMENT")
			{
				$counter = 0;
				$nameFound = false;
				$dPar = count($array ['part_object']->dparameters);
				
				while($counter < $dPar)
				{
					if($array ['part_object']->dparameters [$counter]->attribute == "FILENAME" || $array ['part_object']->dparameters [$counter]->attribute == "NAME")
					{
						if(!empty($array ['part_object']->dparameters [$counter]->value))
						{
							$rAttachments [$rCounter] ['name'] = $array ['part_object']->dparameters [$counter]->value;
							$nameFound = true;
							break;
						}
					}
					$counter++;
				}
				
				if(!$nameFound)
				{
					
					$counter = 0;
					
					$par = count($array ['part_object']->parameters);
					
					while($counter < $par)
					{
						
						if($array ['part_object']->parameters [$counter]->attribute == "FILENAME" || $array ['part_object']->parameters [$counter]->attribute == "NAME")
						{
							
							if(!empty($array ['part_object']->parameters [$counter]->value))
							{
								$rAttachments [$rCounter] ['name'] = $array ['part_object']->parameters [$counter]->value;
								break;
							}
						
						}
						$counter++;
					}
				}
				if(!empty($rAttachments [$rCounter] ['name']))
				{
					$rAttachments [$rCounter] ['goods'] = imap_base64(imap_fetchbody($this->connection, $msgno, $array ['part_number']));
					$rCounter++;
				}
			}
		}
		return $rAttachments;
	}	
	private function get_mime_type(&$structure)
	{
		$primary_mime_type = array("TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER");
		if($structure->subtype)
		{
			return $primary_mime_type [(int)$structure->type] . '/' . $structure->subtype;
		}
		return "TEXT/PLAIN";
	}
	
	private function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false)
	{
		$prefix = "";
		if(!$structure)
		{
			$structure = imap_fetchstructure($stream, $msg_number);
		}
		
		if($structure)
		{
			if($mime_type == $this->get_mime_type($structure))
			{
				if(!$part_number)
				{
					$part_number = "1";
				}
				$text = imap_fetchbody($stream, $msg_number, $part_number);
				if($structure->encoding == 3)
				{
					return imap_base64($text);
				} else if($structure->encoding == 4)
				{
					return imap_qprint($text);
				} else
				{
					return $text;
				}
			}
			
			if($structure->type == 1) /* multipart */ 
			{
				while(list($index, $sub_structure) = each($structure->parts))
				{
					if($part_number)
					{
						$prefix = $part_number . '.';
					}
					
					$data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1));
					
					if($data)
					{
						return $data;
					}
				}
			}
		}
		return false;
	}
}
?>
[/code]