From 21c18aa4346e5215f363777fd56b26a816b2d3dd Mon Sep 17 00:00:00 2001 From: Devansh Bawari Date: Fri, 20 Sep 2024 19:20:17 +0530 Subject: [PATCH] fix: fixed imap for all folders now just little handling left --- .../Http/Controllers/Mail/EmailController.php | 2 +- .../Console/Commands/ProcessInboundEmails.php | 6 +- .../Contracts/InboundEmailProcessor.php | 6 +- .../SendgridEmailProcessor.php | 11 +++- .../WebklexImapEmailProcessor.php | 66 +++++++++++++------ 5 files changed, 58 insertions(+), 33 deletions(-) diff --git a/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php index a4245ba80..e2a9fd20d 100644 --- a/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php +++ b/packages/Webkul/Admin/src/Http/Controllers/Mail/EmailController.php @@ -203,7 +203,7 @@ public function update($id) */ public function inboundParse(InboundEmailProcessor $inboundEmailProcessor) { - $inboundEmailProcessor->process(request('email')); + $inboundEmailProcessor->processMessage(request('email')); return response()->json([], 200); } diff --git a/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php index cced2f822..a0361acb0 100644 --- a/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php +++ b/packages/Webkul/Email/src/Console/Commands/ProcessInboundEmails.php @@ -41,11 +41,7 @@ public function handle() { $this->info('Processing the incoming emails.'); - $messages = $this->inboundEmailProcessor->getMessages(); - - foreach ($messages as $message) { - $this->inboundEmailProcessor->process($message); - } + $this->inboundEmailProcessor->processMessagesFromAllFolders(); $this->info('Incoming emails processed successfully.'); } diff --git a/packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php b/packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php index 845e55174..fbf1b9880 100644 --- a/packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php +++ b/packages/Webkul/Email/src/InboundEmailProcessor/Contracts/InboundEmailProcessor.php @@ -5,16 +5,16 @@ interface InboundEmailProcessor { /** - * Get the messages from the mail server. + * Process messages from all folders. * * @return mixed */ - public function getMessages(); + public function processMessagesFromAllFolders(); /** * Process the inbound email. * * @param mixed|null $content */ - public function process($content = null): void; + public function processMessage($content = null): void; } diff --git a/packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php b/packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php index 9809121b3..ec4322b6e 100644 --- a/packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php +++ b/packages/Webkul/Email/src/InboundEmailProcessor/SendgridEmailProcessor.php @@ -23,17 +23,22 @@ public function __construct( ) {} /** - * Get the messages from the mail server. + * Process messages from all folders. */ - public function getMessages() + public function processMessagesFromAllFolders() { + /** + * SendGrid's Inbound Parse is a specialized tool for developers to handle incoming emails in + * their applications, but it doesn't replace the full functionality of IMAP for typical + * email client usage. Thats why we can't process the messages. + */ throw new \Exception('Currently bulk processing is not supported for Sendgrid.'); } /** * Process the inbound email. */ - public function process($message = null): void + public function processMessage($message = null): void { $this->emailParser->setText($message); diff --git a/packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php b/packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php index 7a8237579..de42dbc43 100644 --- a/packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php +++ b/packages/Webkul/Email/src/InboundEmailProcessor/WebklexImapEmailProcessor.php @@ -10,9 +10,9 @@ class WebklexImapEmailProcessor implements InboundEmailProcessor { /** - * Folder name. + * The IMAP client instance. */ - protected const FOLDER_NAME = 'INBOX'; + protected $client; /** * Create a new repository instance. @@ -22,29 +22,33 @@ class WebklexImapEmailProcessor implements InboundEmailProcessor public function __construct( protected EmailRepository $emailRepository, protected AttachmentRepository $attachmentRepository - ) {} + ) { + $this->client = Client::account('default'); + + $this->client->connect(); + + if (! $this->client->isConnected()) { + throw new \Exception('Failed to connect to the mail server.'); + } + } /** - * Get the messages from the mail server. + * Close the connection. */ - public function getMessages() + public function __destruct() { - try { - $client = Client::account('default'); - - $client->connect(); - - if (! $client->isConnected()) { - throw new \Exception('Failed to connect to the mail server.'); - } - - $folder = $client->getFolder(self::FOLDER_NAME); - - $messages = $folder->query()->since(now()->subDays(10))->get(); + $this->client->disconnect(); + } - $client->disconnect(); + /** + * Process messages from all folders. + */ + public function processMessagesFromAllFolders() + { + try { + $rootFolders = $this->client->getFolders(); - return $messages; + $this->processMessagesFromLeafFolders($rootFolders); } catch (\Exception $e) { throw new \Exception($e->getMessage()); } @@ -53,7 +57,7 @@ public function getMessages() /** * Process the inbound email. */ - public function process($message = null): void + public function processMessage($message = null): void { $attributes = $message->getAttributes(); @@ -84,7 +88,7 @@ public function process($message = null): void $email = $this->emailRepository->create([ 'from' => $attributes['from']->first()->mail, 'subject' => $attributes['subject']->first(), - 'name' => $attributes['subject']->first(), + 'name' => $attributes['from']->first()->personal, 'reply' => $message->bodies['html'] ?? $message->bodies['text'], 'is_read' => 0, 'folders' => [strtolower('inbox')], @@ -107,4 +111,24 @@ public function process($message = null): void ]); } } + + /** + * Process the messages from all folders. + * + * @param \Webklex\IMAP\Support\FolderCollection $rootFoldersCollection + */ + protected function processMessagesFromLeafFolders($rootFoldersCollection = null): void + { + $rootFoldersCollection->each(function ($folder) { + if (! $folder->children->isEmpty()) { + $this->processMessagesFromLeafFolders($folder->children); + + return; + } + + return $folder->query()->since(now()->subDays(10))->get()->each(function ($message) { + $this->processMessage($message); + }); + }); + } }