Bekijk Volledige Versie : Opslaan PDF attachment met PHP
Hallo,
Ik wil met een PHP script een mailbox controleren en de attachments
automatisch laten opslaan in een directory zodat deze beschikbaar zijn
voor de gebruikers (een soort archief).
Het lukt goed met .doc bestanden (met imap_base64) doch de .pdf files
geven een encoded error. Iemand die raad weet ?
Dit is mijn php code:
--------------------
$login = 'mailboxlogin';
$password = 'mailboxpass';
$mbox = imap_open("{127.0.0.1:110/pop3/notls}INBOX", "$login", "$password")
or die("Could not open Mailbox - try again later!");
$hdr = imap_check($mbox);
$msgCount = $hdr->Nmsgs;
$overview=imap_fetch_overview($mbox,"1:$msgCount",0);
$size=sizeof($overview);
for($i=$size-1;$i>=0;$i--)
{
$val=$overview[$i];
$msg=$val->msgno;
$date=$val->date;
$subj=$val->subject;
$struct = imap_fetchstructure($mbox,$msg);
$contentParts = count($struct->parts);
if ($contentParts >= 2) {
for ($ix=2;$ix<=$contentParts;$ix++) {
$att[$ix-2] = imap_bodystruct($mbox,$msg,$ix);
}
for ($k=0;$k<sizeof($att);$k++) {
if ($att[$k]->parameters[0]->value == "us-ascii" ||
$att[$k]->parameters[0]->value == "US-ASCII") {
if ($att[$k]->parameters[1]->value != "") {
$FileName[$k] = $att[$k]->parameters[1]->value;
$FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
}
} elseif ($att[$k]->parameters[0]->value != "iso-8859-1" &&
$att[$k]->parameters[0]->value != "ISO-8859-1") {
$FileName[$k] = $att[$k]->parameters[0]->value;
$FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
$fileContent = imap_fetchbody($mbox,$msg,$file+2);
$fileContent = imap_base64($fileContent);
$localfile = fopen("/var/www/bestanden/$FileName[$k]","w");
fputs($localfile,$fileContent);
fclose($localfile);
}
}
}
}
imap_close($mbox);
google@phaedro.com
26/07/05, 19:35
Dag JAKE,
JAKE schreef:
> Hallo,
>
> Ik wil met een PHP script een mailbox controleren en de attachments
> automatisch laten opslaan in een directory zodat deze beschikbaar zijn
> voor de gebruikers (een soort archief).
>
Je draait dit script met een cronjob oid of wordt het aangeroepen via
een webpagina b.v. webmail ?
Dit is echt niet iets wat ik met PHP zou aanpakken: www.python.org is
daar meer geschikt voor.
> Het lukt goed met .doc bestanden (met imap_base64) doch de .pdf files
> geven een encoded error. Iemand die raad weet ?
>
Je code, vluchtig, bekijkend zie ik wel twee gekke dingen:
1. Je gaat ervan uit dat de character-set of US-ASCII of ISO-nogwat is:
dit lijkt mij een verkeerde aanname , er is b.v. UTF-8 en een weelderig
aantal andere char-sets . Je doet hier iets fout, en bovendien iets dat
imap_ of een andere library voor je zou moeten doen.
2.
> $FileName[$k] = $att[$k]->parameters[0]->value;
....
> $localfile = fopen("/var/www/bestanden/$FileName[$k]","w");
is $att[k]->parameters[0]->value de fileName zoals in MIME headers? Wat
gebeurt er bij een tweede attachment met toevallig dezelfde fileName ?
verder:
- commentaar ?
- opdelen in functies (b.v. 'getMessages', 'getAttachmentsFromMessage'
: maakt het veel makkelijker leesbaar en te debuggen)
bovendien:
>
A > $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
B > $fileContent = imap_fetchbody($mbox,$msg,$file+2);
C > $fileContent = imap_base64($fileContent);
Welk van deze drie statements genereert de error ? Kan je dat eens
uitzoeken?
--
Thijs Cobben
www.phaedro.com
> Dit is mijn php code:
> --------------------
>
> $login = 'mailboxlogin';
>
> $password = 'mailboxpass';
>
> $mbox = imap_open("{127.0.0.1:110/pop3/notls}INBOX", "$login", "$password")
> or die("Could not open Mailbox - try again later!");
>
> $hdr = imap_check($mbox);
>
> $msgCount = $hdr->Nmsgs;
>
> $overview=imap_fetch_overview($mbox,"1:$msgCount",0);
>
> $size=sizeof($overview);
>
> for($i=$size-1;$i>=0;$i--)
>
> {
>
> $val=$overview[$i];
>
> $msg=$val->msgno;
>
> $date=$val->date;
>
> $subj=$val->subject;
>
> $struct = imap_fetchstructure($mbox,$msg);
>
> $contentParts = count($struct->parts);
>
> if ($contentParts >= 2) {
>
> for ($ix=2;$ix<=$contentParts;$ix++) {
>
> $att[$ix-2] = imap_bodystruct($mbox,$msg,$ix);
>
> }
>
> for ($k=0;$k<sizeof($att);$k++) {
>
> if ($att[$k]->parameters[0]->value == "us-ascii" ||
> $att[$k]->parameters[0]->value == "US-ASCII") {
>
> if ($att[$k]->parameters[1]->value != "") {
>
> $FileName[$k] = $att[$k]->parameters[1]->value;
>
> $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
>
> }
>
> } elseif ($att[$k]->parameters[0]->value != "iso-8859-1" &&
> $att[$k]->parameters[0]->value != "ISO-8859-1") {
>
> $FileName[$k] = $att[$k]->parameters[0]->value;
>
> $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
>
> $fileContent = imap_fetchbody($mbox,$msg,$file+2);
>
> $fileContent = imap_base64($fileContent);
>
> $localfile = fopen("/var/www/bestanden/$FileName[$k]","w");
>
> fputs($localfile,$fileContent);
>
> fclose($localfile);
>
> }
>
> }
>
> }
>
> }
>
> imap_close($mbox);
Hallo Thijs,
Bedankt voor je reactie.
Ik werk meestal wel met functies voor grotere scripts.
De comment lines // heb ik niet mee gepost in de nieuwsgroep maar gebruik ik
wel. (zijn tijdens de programmatiefase niet geschikt voor publicatie).
De mails zijn interne mails (rapporten) verzonden door een Administratie
pakket op een NT server die ofwel een .doc bestand bevatten of een .pdf.
Een bestandnaam kan maar 1 keer voorkomen en de character-set is steeds
dezelfde.
Op een interne Mail + web server (linux) wil ik een cron file maken voor een
script welke de attachments automatisch plaatst in een map welke beschikbaar
is als archief.
Mijn scripts werkt en plaatst alle bijlagen in de juiste map. De .doc
bestanden kan men al raadplegen doch de .pdf files geven nog een encoding
error.
Ik heb geen ervaring met python, dat lijkt me dus ook niet de oplossing.
Met vriendelijke groeten,
JAKE
<google@phaedro.com> schreef in bericht
news:1122398940.583345.32220@o13g2000cwo.googlegro ups.com...
> Dag JAKE,
>
> JAKE schreef:
>> Hallo,
>>
>> Ik wil met een PHP script een mailbox controleren en de attachments
>> automatisch laten opslaan in een directory zodat deze beschikbaar zijn
>> voor de gebruikers (een soort archief).
>>
>
> Je draait dit script met een cronjob oid of wordt het aangeroepen via
> een webpagina b.v. webmail ?
>
> Dit is echt niet iets wat ik met PHP zou aanpakken: www.python.org is
> daar meer geschikt voor.
>
>
>
>> Het lukt goed met .doc bestanden (met imap_base64) doch de .pdf files
>> geven een encoded error. Iemand die raad weet ?
>>
>
> Je code, vluchtig, bekijkend zie ik wel twee gekke dingen:
> 1. Je gaat ervan uit dat de character-set of US-ASCII of ISO-nogwat is:
> dit lijkt mij een verkeerde aanname , er is b.v. UTF-8 en een weelderig
> aantal andere char-sets . Je doet hier iets fout, en bovendien iets dat
> imap_ of een andere library voor je zou moeten doen.
>
> 2.
>> $FileName[$k] = $att[$k]->parameters[0]->value;
> ...
>> $localfile = fopen("/var/www/bestanden/$FileName[$k]","w");
>
> is $att[k]->parameters[0]->value de fileName zoals in MIME headers? Wat
> gebeurt er bij een tweede attachment met toevallig dezelfde fileName ?
>
>
> verder:
> - commentaar ?
> - opdelen in functies (b.v. 'getMessages', 'getAttachmentsFromMessage'
> : maakt het veel makkelijker leesbaar en te debuggen)
>
> bovendien:
>>
> A > $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
> B > $fileContent = imap_fetchbody($mbox,$msg,$file+2);
> C > $fileContent = imap_base64($fileContent);
>
> Welk van deze drie statements genereert de error ? Kan je dat eens
> uitzoeken?
>
> --
> Thijs Cobben
> www.phaedro.com
>
>> Dit is mijn php code:
>> --------------------
>>
>> $login = 'mailboxlogin';
>>
>> $password = 'mailboxpass';
>>
>> $mbox = imap_open("{127.0.0.1:110/pop3/notls}INBOX", "$login",
>> "$password")
>> or die("Could not open Mailbox - try again later!");
>>
>> $hdr = imap_check($mbox);
>>
>> $msgCount = $hdr->Nmsgs;
>>
>> $overview=imap_fetch_overview($mbox,"1:$msgCount",0);
>>
>> $size=sizeof($overview);
>>
>> for($i=$size-1;$i>=0;$i--)
>>
>> {
>>
>> $val=$overview[$i];
>>
>> $msg=$val->msgno;
>>
>> $date=$val->date;
>>
>> $subj=$val->subject;
>>
>> $struct = imap_fetchstructure($mbox,$msg);
>>
>> $contentParts = count($struct->parts);
>>
>> if ($contentParts >= 2) {
>>
>> for ($ix=2;$ix<=$contentParts;$ix++) {
>>
>> $att[$ix-2] = imap_bodystruct($mbox,$msg,$ix);
>>
>> }
>>
>> for ($k=0;$k<sizeof($att);$k++) {
>>
>> if ($att[$k]->parameters[0]->value == "us-ascii" ||
>> $att[$k]->parameters[0]->value == "US-ASCII") {
>>
>> if ($att[$k]->parameters[1]->value != "") {
>>
>> $FileName[$k] = $att[$k]->parameters[1]->value;
>>
>> $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
>>
>> }
>>
>> } elseif ($att[$k]->parameters[0]->value != "iso-8859-1" &&
>> $att[$k]->parameters[0]->value != "ISO-8859-1") {
>>
>> $FileName[$k] = $att[$k]->parameters[0]->value;
>>
>> $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
>>
>> $fileContent = imap_fetchbody($mbox,$msg,$file+2);
>>
>> $fileContent = imap_base64($fileContent);
>>
>> $localfile = fopen("/var/www/bestanden/$FileName[$k]","w");
>>
>> fputs($localfile,$fileContent);
>>
>> fclose($localfile);
>>
>> }
>>
>> }
>>
>> }
>>
>> }
>>
>> imap_close($mbox);
>
google@phaedro.com
30/07/05, 00:35
JAKE schreef:
> Mijn scripts werkt en plaatst alle bijlagen in de juiste map. De .doc
> bestanden kan men al raadplegen doch de .pdf files geven nog een encoding
> error.
>
Blijft staan:
> > A > $FileType[$k] = strrev(substr(strrev($FileName[$k]),0,4));
> > B > $fileContent = imap_fetchbody($mbox,$msg,$file+2);
> > C > $fileContent = imap_base64($fileContent);
> >
> > Welk van deze drie statements genereert de error ? Kan je dat eens
> > uitzoeken?
Haal alle code na het 'kandidaat statement' weg en run je script, zo
kan je 'debuggen' welke regel de fout maakt.
Heb je meer info over de error? Op basis van 'encoding' zou ik zeggen
'C' genereert de error, maar dat kan omdat B de fileContent niet goed
leest.
> Ik heb geen ervaring met python, dat lijkt me dus ook niet de oplossing.
>
Op lange termijn bespaart het je veel tijd, en de inleerdrempel is echt
niet hoog... Type maar eens 'python' op een linux masjien , er
verschijnt een prompt, type 'print "Hello, world"
--
T.
www.phaedro.com
"posten in niw.ss is een inefficiente manier om site references te
genereren."