Avatar billede jensenxp Novice
10. september 2012 - 10:15 Der er 5 kommentarer og
1 løsning

åbne mail og gemme vedhæftet fil, samt parse xls

Hej
Jeg modtager min elmåler aflæsning ugentligt i et excel regne ark og kunne godt tænke mig et script som kunne læse mail, finden den rigtige, læse excel filen og præsenterer den i en html tabel med lidt ekstra regning, men går fuldstændigt over mine evner. Er der nogen der kan hjælpe lidt.
Avatar billede j-j Nybegynder
10. september 2012 - 10:42 #1
Det er ikke noget man lige laver på 20 minutter.

Har du spurgt afsenderen om det er muligt at få i et andet format?
Avatar billede olsensweb.dk Ekspert
10. september 2012 - 11:13 #2
prøv at google php mail save attachment
prøv at google php excel reader
der må være noget du kan starte med der
Avatar billede moddi100 Seniormester
10. september 2012 - 15:49 #3
php.net har nogle gode eksempler på hvordan man åbner en mailbox via f.eks. imap og så henter listen over emails. Hedder mailen det samme hver gang, er det jo bare at gå listen igennem. Se her funktionen imap_headers()

Som ronols siger kan du sikkert google dig frem til en løsning der også downloader en attachment fra mailen.

Med hensyn til håndtering af excel-filen anvendte jeg for nogle år tilbage projektet "Spreadsheet_Excel_Reader", selvom jeg dog ikke ved om det stadigvæk eksisterer. Men det var i hvert fald uhyre simpelt at anvende efter at have læst deres introduktion.
Avatar billede jensenxp Novice
13. september 2012 - 12:38 #4
dropper du et svar, for takke være dine søge tip fik jeg bakset dette sammen (så skal der bare finpudses):

<?php

require_once 'excel_reader2.php';

$server = '{mail.****.****/pop3:110}';
// and put your login and password here
$login = '****';
$password = '****';

$connection = imap_open($server, $login, $password);

// the number in constructor is the message number
$emailMessage = new EmailMessage($connection, 1);
// set to true to get the message parts (or don't set to false, the default is true)
$emailMessage->getAttachments = true;
$emailMessage->fetch();

//could drop file_put, but want to keep org. spreadsheet and want to add more to $data after

file_put_contents('el.xls', $emailMessage->attachments[0]['data']);

$data = new Spreadsheet_Excel_Reader("el.xls");

echo $data->dump(true,true);

imap_close($connection);
exit;

class EmailMessage {

    protected $connection;
    protected $messageNumber;
   
    public $bodyHTML = '';
    public $bodyPlain = '';
    public $attachments;
   
    public $getAttachments = true;
   
    public function __construct($connection, $messageNumber) {
   
        $this->connection = $connection;
        $this->messageNumber = $messageNumber;
       
    }

    public function fetch() {
       
        $structure = @imap_fetchstructure($this->connection, $this->messageNumber);
        if(!$structure) {
            return false;
        }
        else {
            $this->recurse($structure->parts);
            return true;
        }
       
    }
   
    public function recurse($messageParts, $prefix = '', $index = 1, $fullPrefix = true) {

        foreach($messageParts as $part) {
           
            $partNumber = $prefix . $index;
           
            if($part->type == 0) {
                if($part->subtype == 'PLAIN') {
                    $this->bodyPlain .= $this->getPart($partNumber, $part->encoding);
                }
                else {
                    $this->bodyHTML .= $this->getPart($partNumber, $part->encoding);
                }
            }
            elseif($part->type == 2) {
                $msg = new EmailMessage($this->connection, $this->messageNumber);
                $msg->getAttachments = $this->getAttachments;
                $msg->recurse($part->parts, $partNumber.'.', 0, false);
                $this->attachments[] = array(
                    'type' => $part->type,
                    'subtype' => $part->subtype,
                    'filename' => '',
                    'data' => $msg,
                    'inline' => false,
                );
            }
            elseif(isset($part->parts)) {
                if($fullPrefix) {
                    $this->recurse($part->parts, $prefix.$index.'.');
                }
                else {
                    $this->recurse($part->parts, $prefix);
                }
            }
            elseif($part->type > 2) {
                if(isset($part->id)) {
                    $id = str_replace(array('<', '>'), '', $part->id);
                    $this->attachments[$id] = array(
                        'type' => $part->type,
                        'subtype' => $part->subtype,
                        'filename' => $this->getFilenameFromPart($part),
                        'data' => $this->getAttachments ? $this->getPart($partNumber, $part->encoding) : '',
                        'inline' => true,
                    );
                }
                else {
                    $this->attachments[] = array(
                        'type' => $part->type,
                        'subtype' => $part->subtype,
                        'filename' => $this->getFilenameFromPart($part),
                        'data' => $this->getAttachments ? $this->getPart($partNumber, $part->encoding) : '',
                        'inline' => false,
                    );
                }
            }
           
            $index++;
           
        }
       
    }
   
    function getPart($partNumber, $encoding) {

        $data = imap_fetchbody($this->connection, $this->messageNumber, $partNumber);
        switch($encoding) {
            case 0: return $data; // 7BIT
            case 1: return $data; // 8BIT
            case 2: return $data; // BINARY
            case 3: return base64_decode($data); // BASE64
            case 4: return quoted_printable_decode($data); // QUOTED_PRINTABLE
            case 5: return $data; // OTHER
        }


    }
   
    function getFilenameFromPart($part) {

        $filename = '';

        if($part->ifdparameters) {
            foreach($part->dparameters as $object) {
                if(strtolower($object->attribute) == 'filename') {
                    $filename = $object->value;
                }
            }
        }

        if(!$filename && $part->ifparameters) {
            foreach($part->parameters as $object) {
                if(strtolower($object->attribute) == 'name') {
                    $filename = $object->value;
                }
            }
        }

        return $filename;

    }

}
Avatar billede jensenxp Novice
13. september 2012 - 12:39 #5
hov, det var til ronols
Avatar billede olsensweb.dk Ekspert
15. september 2012 - 02:30 #6
får du her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester