Also eine Email mit Anhang ist eine Multipart Mime-Typ email.
In dieser Email gibt es verschiedene Bereiche, die Headers, dann kommt ein Boundary, dann kommt der Inhalt der Email, wieder die gleiche boundary, und dann die Dateiinformationen.
Sieht dann so aus (z.B.):
[CODE]Return-Path:
X-Flags: 1001
Delivered-To: GMX delivery to praetorian@gmx.net
Received: (qmail invoked by alias); 09 Oct 2007 15:04:49 -0000
Received: from fmmailgate05.web.de (EHLO fmmailgate05.web.de) [217.72.192.243]
by mx0.gmx.net (mx070) with SMTP; 09 Oct 2007 17:04:49 +0200
Received: from web.de
by fmmailgate05.web.de (Postfix) with SMTP id CB0672F705AA
for ; Tue, 9 Oct 2007 17:04:49 +0200 (CEST)
Received: from [90.128.81.251] by freemailng0102.web.de with HTTP;
Tue, 09 Oct 2007 17:04:49 +0200
Date: Tue, 09 Oct 2007 17:04:49 +0200
Message-Id: 1680744406@web.de
MIME-Version: 1.0
From: sybex_ts@web.de
To: praetorian@gmx.net
Subject: FW: test
Content-Type: multipart/mixed;
boundary=„=-------------11919422898411948184“
This is a multi-part message in MIME format.
–=-------------11919422898411948184
Content-Type: text/plain; charset=iso-8859-15
Content-Transfer-Encoding: quoted-printable
DIE NACHRICHT
–=-------------11919422898411948184
Content-Type: image/jpeg;
name=„scr1.jpg“
Content-Disposition: attachment;
filename=„scr1.jpg“
Content-Transfer-Encoding: base64
/9j/4AAQSkZJRgABAgEASABIAAD/4SPuRXhpZgAATU0AKgAAAAgABwESAAMAAAABAAEAAAEa
AAUAAAABAAAAYgEbAAUAAAABAAAAagEoAAMAAAABAAIAAAExAAIAAAAcAAAAcgEyAAIAAAAU
AAAAjodpAAQAAAABAAAApAAAANAACvyAAAAnEAAK/IAAACcQQWRvYmUgUGhvdG9zaG9wIENT
MiBXaW5kb3dzADIwMDc6MTA6MDcgMjE6NDA6MTMAAAAAA6ABAAMAAAABAAEAAKACAAQAAAAB
AAABQKADAAQAAAABAAAA8AAAAAAAAAAGAQMAAwAAAAEABgAAARoABQAAAAEAAAEeARsABQAA
AAEAAAEmASgAAwAAAAEAAgAA
–=-------------11919422898411948184
[/CODE]
Hier ist die Boundary
=-------------11919422898411948184
Du musst die Email also auslesen, den letzten Teil filtern und ihn in eine Datei schreiben mit der endung. Vorher musst du den Teil noch mit base64_decode() bearbeiten.
Ich habe mich da mal ran gesetzt und ne Klasse geschrieben, aber allem Anschein nach bin ich zu doof das teil an den boundaries zu teilen (habs mit split,preg_split,explode und strpos versucht).
Da fällt mir grad ein, es gibt eine Klasse im OpenSource bereich die das alles kann. Mir fällt aber grad iwie der Name nicht ein… :s
Hier sind meine Anfänge, es geht soweit, dass er sich die boundary hohlt, das Trennen wie gesagt da bin ich gescheitert.
[PHP]<?php
error_reporting(E_ALL);
class MyMail {
var $socket;
var $errno;
var $error;
var $LastLine;
var $LastLineMultiple;
var $list;
var $email;
var $boundary;
function MyMail($host=„“,$port=110,$timeout=5) {
$this->socket = @fsockopen($host,$port,$this->errno,$this->error,$timeout);
if($this->socket)
$this->_LastLine();
}
function isConnected() {
if($this->socket)
return true;
return false;
}
function getLastError() {
return array($this->errno,$this->error);
}
function getLastErrorFormated() {
die(‚Error #‘.$this->errno.‚
‘.$this->error);
}
function _LastLine() {
$this->LastLine = fgets($this->socket);
}
function _LastLineMultiple() {
$lines = array();
while (substr($line = fgets($this->socket), 0, 1) != „.“) {
$lines = substr($line,0,strlen($line)-2);
}
$this->LastLineMultiple = $lines;
}
function getLastLine() {
return $this->LastLine;
}
function getLastLineMultiple() {
return $this->LastLineMultiple;
}
function login($email,$password) {
if($this->_eval($this->_exec("USER „.$email)) && $this->_eval($this->_exec(„PASS „.$password)))
return true;
return false;
}
function listmails() {
if($this->_eval($this->_exec(„LIST“,2))) {
$list = $this->getLastLineMultiple();
unset($list[0]);
$this->list = $list;
return true;
}
return false;
}
function getEmail($id=1) {
if($this->_eval($this->_exec(„RETR „.$id,2))) {
$email = $this->getLastLineMultiple();
unset($email[0]);
$this->email = $email;
return true;
}
return false;
}
function getBoundary() {
foreach($this->email as $seekline) {
if(preg_match('%boundary=“(.)„%iU’,$seekline)) {
$this->boundary = preg_replace('%boundary=“(.)“%isU’,‚\1‘,$seekline);
return true;
}
}
return false;
}
function _exec($cmd,$read=1) {
fputs($this->socket,$cmd.“\r\n“);
if($read==1) {
$this->_LastLine();
return $this->getLastLine();
}
if($read==2) {
$this->_LastLineMultiple();
return $this->getLastLineMultiple();
}
}
function _eval($string = „-ERR“) {
if(gettype($string) == „array“)
$string = $string[0];
if(substr($string,0,3) === „+OK“)
return true;
else {
$this->errno = " ?“;
$this->error = substr($string,4);
return false;
}
}
}
// Verbindung zum Mail Server
$mail = new MyMail(„pop.gmx.de“);
if(!$mail->isConnected()) {
$mail->getLastErrorFormated();
}
// Login mit benutzername und Passwort
$login = $mail->login(„praetorian@gmx.net“,„*****“);
if(!$login) {
$mail->getLastErrorFormated();
}
// Liste der vorhandenen Emails hohlen
$list = $mail->listmails();
if(!$list) {
$mail->getLastErrorFormated();
}
// LISTE AUSGEBEN
$liste = $mail->getLastLineMultiple();
unset($liste[0]);
echo implode(„
“,$liste);
echo „
“;
// EMAIL auswählen ID der Email als Parameter
$select = $mail->getEmail(1);
if(!$select) {
$mail->getLastErrorFormated();
}
// EMAIL AUSGEBEN
$email = $mail->getLastLineMultiple();
unset($email[0]);
echo implode(„
“,$email);
echo „
“;
// boundary bekommen
$boundary = $mail->getBoundary();
?>[/PHP]