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.
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.
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;
}
}