php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen : Mit PHP eMail Anhänge in Datei speichern


sunshine_85
18-01-2006, 10:47
Hallo,

Habe ein echtes Problem.
Ich habe mir mühsam ein Script gebastelt mit dem man e-mails auslesen kann, und habe dann auch tausende Beiträge gefunden wie man EMails mit Anhang schicken kann, aber nicht wie man den Anhang dann schließlich wieder von der e-mail löst um ihn in eine Datei abzuspeichern.
Ich habe echt garkeine Idee wie ich das anstellen soll.
Den Inhalt des Mail Body kann ich schon in einer Datei speichern.

Es wäre ganz klasse, wenn mir dabei jemand helfen könnte.

Mein bisheriges Script zum Email auslesen sieht so aus:


<?php
function MailConnect()
{
// Connect Daten
$host="123.456.789.12";
$port="110";
$user="Sonja";
$passwort="Hallo";

// Verbinden zur Mailbox
$mailbox =
imap_open("{".$host."/pop3:".$port."}INBOX","$user","$passwort")
or die("Verbindung konnte nicht hergestellt werden.<br />\n");

// Posteingang überprüfen
$check=imap_check($mailbox);

// Anzahl vorhandener Emails im Postfach
$count_msg=$check->Nmsgs;

// Anzahl neuer Emails im Postfach
$count_new_msg=$check->Recent;

// Emails auslesen
for ($i=1; $i<=imap_num_msg($mailbox);$i++) {
// Header erfassen
$mail_header=imap_header($mailbox,$i);

// Datum erfassen
$mail_date=$mail_header->Date;

// Mail-ID erfassen
$mail_id=$mail_header->message_id;

// Empfänger erfassen

$mail_to=$mail_header->toaddress;

// Absendername erfassen
$mail_from_name=$mail_header->from
[0]->personal;

// Absender-eMail-Adresse erfassen
$mail_from_address=$mail_header->from
[0]->mailbox."@".$mail_header->from
[0]->host;

// Kopieempfänger erfassen
$mail_copy_to=$mail_header->cc[0]
->mailbox."@".$mail_header->cc[0]
->host;

// Antwortempfänger erfassen
$mail_answer_to=$mail_header
->reply_to;

// Betreff erfassen
$mail_subject=$mail_header->subject;

// gesamte Nachricht erfassen
$nachricht=imap_body($mailbox, $i);

//Ersetzten des \ durch nichts da sonst die Attribute
//nicht mit geparst werden.
$nachricht=str_replace("\\","", $nachricht);

//öffnet die schon bereits vorhandene Datei
//Text.php, in die
//dann die Nachricht geschrieben wird.

$handle = fopen("Text.php","w");
fputs($handle,$nachricht);
fclose($handle);


}

imap_close($mailbox);
?>

DANKESCHÖN!!!:dontknow:

Shurakai
18-01-2006, 14:09
Hmm.... werden die Mails nicht einfach base64 codiert und angehängt im MailBody oder so...?:dontknow:

galaxy2
18-01-2006, 14:21
Hatte mal irgendwann im Internet folgendes skript dazu gefunden. Vieleicht Hilft es dir weiter:




// opens connection to a mailbox
$mbox = imap_open ("{localhost:143}", "username", "pass");


function parsepart($p,$i)
{
global $mbox,$msgid,$partsarray,$j;
//where to write file attachments to:
$filestore = "Y:/txt-Files/";
//echo "link ".$mbox." msgnum ".$msgid. "p ".$p." i ".$i." ARR ".$partsarray."<br>";

//fetch only a part of the body
$part=imap_fetchbody($mbox,$msgid,$i);

//if type is not text
if ($p->type!=0)
{
//DECODE PART
//decode if base64
if ($p->encoding==3)
{$part=base64_decode($part);}
//decode if quoted printable
if ($p->encoding==4)
{$part=quoted_printable_decode($part);}
//no need to decode binary or 8bit!

//get filename of attachment if present
$filename='';


// if there are any dparameters present in this part
if (count($p->dparameters)>0)
{
foreach ($p->dparameters as $dparam)
{
if ((strtoupper($dparam->attribute)=='NAME')
||(strtoupper($dparam->attribute)=='FILENAME'))
{
$filename=$dparam->value;
}
}
}


//if no filename found
if ($filename=='')
{
// if there are any parameters present in this part
if (count($p->parameters)>0)
{
foreach ($p->parameters as $param)
{
if ((strtoupper($param->attribute)=='NAME')
||(strtoupper($param->attribute)=='FILENAME'))
{
$filename=$param->value;
}
}
}
}


//write to disk and set partsarray variable
if ($filename!='')
{
$partsarray[$i][attachment] = array('filename'=>$filename,'binary'=>$part);
$filename = explode(".", $filename);
$fp=fopen($filestore.$filename[0].$j.".".$filename[1],"w+");
fwrite($fp,$part);
fclose($fp);
}


}//end if type!=0

//if part is text
else if($p->type==0)
{
//decode text
//if QUOTED-PRINTABLE
if ($p->encoding==4)
{$part=quoted_printable_decode($part);}
//if base 64
if ($p->encoding==3)
{$part=base64_decode($part);}

//if plain text
if (strtoupper($p->subtype)=='PLAIN')1;
//if HTML
else if (strtoupper($p->subtype)=='HTML')1;
$partsarray[$i][text] = array('type'=>$p->subtype,'string'=>$part);
}

// if subparts... recurse into function and parse them too!
// this is a recursive call of the function
if (count($p->parts)>0){
foreach ($p->parts as $pno=>$parr){
parsepart($parr,($i.'.'.($pno+1)));
}
}
return;
}

/*=============================================*/
/*============= End of Function ===============*/
/*=============================================*/

$number_of_emails = imap_num_msg($mbox);

if($number_of_emails>0)
{
// Number of message which will be analysed
for ($j=1;$j<=$number_of_emails;$j++)
{
$msgid = $j;

//fetch structure of message
$s=imap_fetchstructure($mbox,$msgid);

/*================================================================*/

//checks if there are any parts
if (count($s->parts)>0)
{
foreach ($s->parts as $partno=>$partarr)
{
//parse parts of email
parsepart($partarr,$partno+1);
}
}
//for not multipart messages
else{
//gets the full/whole body of the message
$text=imap_body($mbox,$msgid);
//decode if quoted-printable
if ($s->encoding==4) $text=quoted_printable_decode($text);
//OPTIONAL PROCESSING
if (strtoupper($s->subtype)=='PLAIN') $text=$text;
if (strtoupper($s->subtype)=='HTML') $text=$text;

$partsarray['not multipart'][text]=array('type'=>$s->subtype,'string'=>$text);
}

/*================================================================*/

// shows all parts
print_r($partsarray);
}
}

// close connection
imap_close ($mbox);




gruss galaxy

sunshine_85
19-01-2006, 08:25
Hallo Galaxy,

Dankeschön. Hat mir schon ne ganze Ecke weitergeholfen.
Quäle mich nur gerade ein bisschen durch die variablen, weil nicht alle in dem Code deklariert sind.

Gruß

Sunshine

-archiv-
--

Alle Zeitangaben in WEZ +2. Es ist jetzt 09:27 Uhr.