From 395d9ed5128395adcda1483e8fd51df1185fdc87 Mon Sep 17 00:00:00 2001 From: Alex Puiu <=> Date: Tue, 17 May 2022 11:52:56 +0300 Subject: [PATCH] Delete mail after processing and use psr-4 for autoload. fixes #17 --- composer.json | 5 ++ config.example.php | 1 + index.php | 207 +++++++++++++++++++++++--------------------- lib/ConvertToMD.php | 4 +- lib/DeckClass.php | 6 +- lib/MailClass.php | 19 +++- 6 files changed, 137 insertions(+), 105 deletions(-) diff --git a/composer.json b/composer.json index 5efac28..4454949 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,10 @@ { "require": { "league/html-to-markdown": "^5.1" + }, + "autoload": { + "psr-4": { + "Mail2Deck\\": "lib/" + } } } diff --git a/config.example.php b/config.example.php index c5e37ed..42edc8e 100644 --- a/config.example.php +++ b/config.example.php @@ -11,4 +11,5 @@ define("MAIL_PASSWORD", "****"); define("DECODE_SPECIAL_CHARACTERS", true); //requires mbstring, if false special characters (like öäüß) won't be displayed correctly define("ASSIGN_SENDER", true); // if true, sender will be assigned to card if has NC account define("MAIL_NOTIFICATION", true); // if true, send notifications when a new card was created or an error occured +define("DELETE_MAIL_AFTER_PROCESSING", true); ?> diff --git a/index.php b/index.php index 2ce1130..45b7e65 100644 --- a/index.php +++ b/index.php @@ -2,117 +2,124 @@ error_reporting(E_ERROR | E_PARSE); require __DIR__ . '/vendor/autoload.php'; require_once("config.php"); -require_once('lib/DeckClass.php'); -require_once('lib/MailClass.php'); -require_once('lib/ConvertToMD.php'); + +use Mail2Deck\MailClass; +use Mail2Deck\DeckClass; +use Mail2Deck\ConvertToMD; $inbox = new MailClass(); $emails = $inbox->getNewMessages(); -if ($emails) - for ($j = 0; $j < count($emails) && $j < 5; $j++) { - $structure = $inbox->fetchMessageStructure($emails[$j]); - $base64encode = false; - if($structure->encoding == 3) { - $base64encode = true; // BASE64 - } - $attachments = array(); - $attNames = array(); - if (isset($structure->parts) && count($structure->parts)) { - for ($i = 0; $i < count($structure->parts); $i++) { - if ($structure->parts[$i]->ifdparameters) { - foreach ($structure->parts[$i]->dparameters as $object) { - if (strtolower($object->attribute) == 'filename') { - $attachments[$i]['is_attachment'] = true; - $attachments[$i]['filename'] = $object->value; - } - } - } +if(!$emails) return; // nothing to do - if ($structure->parts[$i]->ifparameters) { - foreach ($structure->parts[$i]->parameters as $object) { - if (strtolower($object->attribute) == 'name') { - $attachments[$i]['is_attachment'] = true; - $attachments[$i]['name'] = $object->value; - } - } - } - - if ($attachments[$i]['is_attachment']) { - $attachments[$i]['attachment'] = $inbox->fetchMessageBody($emails[$j], $i+1); - if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64 - $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); - } - elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE - $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); +for ($j = 0; $j < count($emails) && $j < 5; $j++) { + $structure = $inbox->fetchMessageStructure($emails[$j]); + $base64encode = false; + if($structure->encoding == 3) { + $base64encode = true; // BASE64 + } + $attachments = array(); + $attNames = array(); + if (isset($structure->parts) && count($structure->parts)) { + for ($i = 0; $i < count($structure->parts); $i++) { + if ($structure->parts[$i]->ifdparameters) { + foreach ($structure->parts[$i]->dparameters as $object) { + if (strtolower($object->attribute) == 'filename') { + $attachments[$i]['is_attachment'] = true; + $attachments[$i]['filename'] = $object->value; } } } - } - for ($i = 1; $i <= count($attachments); $i++) { - if(! file_exists(getcwd() . '/attachments')) { - mkdir(getcwd() . '/attachments'); + + if ($structure->parts[$i]->ifparameters) { + foreach ($structure->parts[$i]->parameters as $object) { + if (strtolower($object->attribute) == 'name') { + $attachments[$i]['is_attachment'] = true; + $attachments[$i]['name'] = $object->value; + } + } } - if ($attachments[$i]['is_attachment'] == 1) { - $filename = $attachments[$i]['name']; - if (empty($filename)) $filename = $attachments[$i]['filename']; - $fp = fopen(getcwd() . '/attachments/' . $filename, "w+"); - fwrite($fp, $attachments[$i]['attachment']); - fclose($fp); - array_push($attNames, $attachments[$i]['filename']); + if ($attachments[$i]['is_attachment']) { + $attachments[$i]['attachment'] = $inbox->fetchMessageBody($emails[$j], $i+1); + if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64 + $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); + } + elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE + $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); + } } } - - $overview = $inbox->headerInfo($emails[$j]); - $board = null; - if(isset($overview->{'X-Original-To'}) && strstr($overview->{'X-Original-To'}, '+')) { - $board = strstr(substr($overview->{'X-Original-To'}, strpos($overview->{'X-Original-To'}, '+') + 1), '@', true); - } else { - if(strstr($overview->to[0]->mailbox, '+')) { - $board = substr($overview->to[0]->mailbox, strpos($overview->to[0]->mailbox, '+') + 1); - } - }; - - if(strstr($board, '+')) $board = str_replace('+', ' ', $board); - - $data = new stdClass(); - $data->title = DECODE_SPECIAL_CHARACTERS ? mb_decode_mimeheader($overview->subject) : $overview->subject; - $data->type = "plain"; - $data->order = -time(); - $body = $inbox->fetchMessageBody($emails[$j], 1.1); - if ($body == "") { - $body = $inbox->fetchMessageBody($emails[$j], 1); - } - if(count($attachments)) { - $data->attachments = $attNames; - $description = DECODE_SPECIAL_CHARACTERS ? quoted_printable_decode($body) : $body; - } else { - $description = DECODE_SPECIAL_CHARACTERS ? quoted_printable_decode($body) : $body; - } - if($base64encode) { - $description = base64_decode($description); - } - if($description != strip_tags($description)) { - $description = (new ConvertToMD($description))->execute(); - } - $data->description = $description; - $mailSender = new stdClass(); - $mailSender->userId = $overview->reply_to[0]->mailbox; - - $newcard = new DeckClass(); - $response = $newcard->addCard($data, $mailSender, $board); - $mailSender->origin .= "{$overview->reply_to[0]->mailbox}@{$overview->reply_to[0]->host}"; - - if(MAIL_NOTIFICATION) { - if($response) { - $inbox->reply($mailSender->origin, $response); - } else { - $inbox->reply($mailSender->origin); - } - } - if(!$response) { - foreach($attNames as $attachment) unlink(getcwd() . "/attachments/" . $attachment); - } } + for ($i = 1; $i <= count($attachments); $i++) { + if(! file_exists(getcwd() . '/attachments')) { + mkdir(getcwd() . '/attachments'); + } + if ($attachments[$i]['is_attachment'] == 1) { + $filename = $attachments[$i]['name']; + if (empty($filename)) $filename = $attachments[$i]['filename']; + + $fp = fopen(getcwd() . '/attachments/' . $filename, "w+"); + fwrite($fp, $attachments[$i]['attachment']); + fclose($fp); + array_push($attNames, $attachments[$i]['filename']); + } + } + + $overview = $inbox->headerInfo($emails[$j]); + $board = null; + if(isset($overview->{'X-Original-To'}) && strstr($overview->{'X-Original-To'}, '+')) { + $board = strstr(substr($overview->{'X-Original-To'}, strpos($overview->{'X-Original-To'}, '+') + 1), '@', true); + } else { + if(strstr($overview->to[0]->mailbox, '+')) { + $board = substr($overview->to[0]->mailbox, strpos($overview->to[0]->mailbox, '+') + 1); + } + }; + + if(strstr($board, '+')) $board = str_replace('+', ' ', $board); + + $data = new stdClass(); + $data->title = DECODE_SPECIAL_CHARACTERS ? mb_decode_mimeheader($overview->subject) : $overview->subject; + $data->type = "plain"; + $data->order = -time(); + $body = $inbox->fetchMessageBody($emails[$j], 1.1); + if ($body == "") { + $body = $inbox->fetchMessageBody($emails[$j], 1); + } + if(count($attachments)) { + $data->attachments = $attNames; + $description = DECODE_SPECIAL_CHARACTERS ? quoted_printable_decode($body) : $body; + } else { + $description = DECODE_SPECIAL_CHARACTERS ? quoted_printable_decode($body) : $body; + } + if($base64encode) { + $description = base64_decode($description); + } + if($description != strip_tags($description)) { + $description = (new ConvertToMD($description))->execute(); + } + $data->description = $description; + $mailSender = new stdClass(); + $mailSender->userId = $overview->reply_to[0]->mailbox; + + $newcard = new DeckClass(); + $response = $newcard->addCard($data, $mailSender, $board); + $mailSender->origin .= "{$overview->reply_to[0]->mailbox}@{$overview->reply_to[0]->host}"; + + if(MAIL_NOTIFICATION) { + if($response) { + $inbox->reply($mailSender->origin, $response); + } else { + $inbox->reply($mailSender->origin); + } + } + if(!$response) { + foreach($attNames as $attachment) unlink(getcwd() . "/attachments/" . $attachment); + } + + //remove email after processing + if(DELETE_MAIL_AFTER_PROCESSING) { + $inbox->delete($emails[$j]); + } +} ?> diff --git a/lib/ConvertToMD.php b/lib/ConvertToMD.php index 0549e19..36c3fd4 100644 --- a/lib/ConvertToMD.php +++ b/lib/ConvertToMD.php @@ -1,5 +1,7 @@ converter->convert($this->html); } } - -?> \ No newline at end of file diff --git a/lib/DeckClass.php b/lib/DeckClass.php index bac0d64..2b66cc2 100644 --- a/lib/DeckClass.php +++ b/lib/DeckClass.php @@ -1,5 +1,10 @@ diff --git a/lib/MailClass.php b/lib/MailClass.php index f1fc3f0..b2be570 100644 --- a/lib/MailClass.php +++ b/lib/MailClass.php @@ -1,5 +1,7 @@ A new card has been created on board board}" . "\">{$response->boardTitle}. -

Check out this board}/card/{$response->id}" . "\">link to see the newly created card.

+ $body = "

A new card has been created on board board}" . "\">{$response->boardTitle}.

+

Check out this board}/card/{$response->id}" . "\">link to see the newly created card.

Card ID is {$response->id}

"; $subject = 'A new card has been created!'; } else { @@ -76,4 +78,17 @@ class MailClass { mail($sender, $subject, $message, $headers); } + + /** + * Deletes a mail + * + * @param $email email id that you want to delete + * + * @return void + */ + public function delete(int $email) + { + imap_delete($this->inbox, $email); + imap_expunge($this->inbox); + } }