From 90e85d93f19ddd10a007a067b50ac5ba6981f17d Mon Sep 17 00:00:00 2001 From: velz Date: Wed, 4 Sep 2024 17:30:53 +0530 Subject: [PATCH] CHNAGE_GMAILAPI_IMPLEMENTED --- app/Config/Routes.php | 4 + app/Config/Services.php | 10 ++ app/Controllers/MasterController.php | 56 +++++++++ app/Helpers/MailHelper.php | 68 +++++++++- app/Libraries/GmailAPI.php | 180 +++++++++++++++++++++++++++ app/Models/SettingsModel.php | 20 +++ app/Views/mail_test.php | 44 +++++++ app/Views/rack_rate_test.php | 2 +- 8 files changed, 381 insertions(+), 3 deletions(-) create mode 100644 app/Libraries/GmailAPI.php create mode 100644 app/Models/SettingsModel.php create mode 100644 app/Views/mail_test.php diff --git a/app/Config/Routes.php b/app/Config/Routes.php index f4eb5e87..9b25db2c 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -278,12 +278,16 @@ $routes->group("/util", ["filter" => "authMVC"], function ($routes) { $routes->get("copy_insurer_templete/(:any)", "MasterController::copyInsurerTemplete/$1"); $routes->get("get_single_excel_template/(:any)", "MasterController::getSingleExcelTemplate/$1"); $routes->get("dublicate_template/(:any)", "MasterController::duplicateTemplate/$1"); + $routes->get("test_mail", "MasterController::testGmailAPI"); + $routes->post("test_mail", "MasterController::testGmailAPI"); }); $routes->cli('cli/processjob', 'JobWorker::processJob'); $routes->cli('cli/processjobs', 'JobWorker::processJobs'); $routes->cli('cli/enrollment_status', 'JobWorker::enrollment_status'); $routes->get("processjob", "JobWorker::processJob"); +$routes->cli('cli/new_gmail_token', 'MasterController::generateNewGmailAPIToken'); +$routes->cli('cli/send_mail_cli', 'MasterController::testGmailAPIViaCLI'); diff --git a/app/Config/Services.php b/app/Config/Services.php index e9a21d37..23159f8b 100644 --- a/app/Config/Services.php +++ b/app/Config/Services.php @@ -5,6 +5,7 @@ namespace Config; use CodeIgniter\Config\BaseService; use App\Libraries\Slug; use App\Libraries\MyLogger; +use App\Libraries\GmailAPI; use App\Libraries\DataServiceSqlite; use App\Controllers\Home; @@ -60,5 +61,14 @@ class Services extends BaseService return new DataServiceSqlite(); } + + public static function gmailapi($getShared = true) + { + if ($getShared) { + return static::getSharedInstance('gmailapi'); + } + + return new GmailAPI(); + } } diff --git a/app/Controllers/MasterController.php b/app/Controllers/MasterController.php index 842dd047..ed30157c 100644 --- a/app/Controllers/MasterController.php +++ b/app/Controllers/MasterController.php @@ -10,6 +10,7 @@ use CodeIgniter\API\ResponseTrait; use CodeIgniter\Files\File; use App\Helpers\DepositHelper; +use App\Helpers\MailHelper; use App\Models\UserModel; use App\Models\ClientModel; @@ -1440,4 +1441,59 @@ class MasterController extends AdminController ]); } } + + + public function generateNewGmailAPIToken() + { + $gmailapi = \Config\Services::gmailapi(); + $gmailapi->generateNewToken(); + + } + + //testing a sample mail from front end + public function testGmailAPI() + { + + if ($this->request->getMethod() == 'post') { + $gmailapi = \Config\Services::gmailapi(); + + $to = $this->request->getPost('to'); + $subject = $this->request->getPost('subject'); + $mail_content = $this->request->getPost('content'); + + /*****CHOOSE ANY ONE AT A TIME, COMMENT ANOTHER ONE******/ + + /*****CALLING DIRECLT USING LIB******/ + // $res = $gmailapi->sendMessage($to, $subject, $mail_content, 'info@nhanceindia.in', 'info@nhanceindia.in', $cc = [], $bcc = []); + + // if($res['status']) + // { + // return $this->respond(['status' => 'success','code' => 200,'data' => $res],200); + // } + // else + // { + // $this->respond(['status' => 'failed','code' => 500,'data' => $res],200); + // } + /*****CALLING DIRECLT USING LIB******/ + + /*****CALLING VIA MAIL HELPER******/ + $res = MailHelper::send_email(['mail' => $to, 'subject' => $subject, 'message' => $mail_content]); + return $this->respond(['status' => 'success','code' => 200,'data' => $res],200); + /*****CALLING VIA MAIL HELPER******/ + + } + + $this->loadLayout('mail_test'); + + } + + + //testing a sample mail from cli + public function testGmailAPIViaCLI() + { + $gmailapi = \Config\Services::gmailapi(); + $res = MailHelper::send_email(['mail' => 'velmurugan.s@venbainfotech.com', 'subject' => 'Mail Via CLI', 'message' => 'This is sample mail sent via CLI mode']); + print_r($res); + + } } \ No newline at end of file diff --git a/app/Helpers/MailHelper.php b/app/Helpers/MailHelper.php index 7b1a9bc7..2eb86cf1 100644 --- a/app/Helpers/MailHelper.php +++ b/app/Helpers/MailHelper.php @@ -14,7 +14,7 @@ use App\Models\JobModel; class MailHelper { - public static function send_email($params) + public static function send_email_smtp($params) { // print_r($params);die; @@ -63,7 +63,7 @@ class MailHelper } } - public static function bulk_mail(array $mails = []) + public static function bulk_mail_smtp(array $mails = []) { // print_r();die; $model = new JobModel(); @@ -82,5 +82,69 @@ class MailHelper } } + //using GmailAPI + public static function send_email($params) + { + + // print_r($params);die; + $myLogger = \Config\Services::mylogger(); + $gmailapi = \Config\Services::gmailapi(); + + $emaill = $params['mail']; + $subject = $params['subject']; + $message = $params['message']; + if (isset($params['bcc'])) { + $bcc = $params['bcc']; + }else{ + $bcc = []; + } + + if (isset($params['cc'])) { + $cc = $params['cc']; + }else{ + $cc = []; + } + try { + + + $res = $gmailapi->sendMessage($emaill, $subject, $message, 'info@nhanceindia.in', 'info@nhanceindia.in', $cc, $bcc); + + if($res['status']) + { + return json_encode(['status' => 'success','code' => 200, 'message'=>('Email Sent Successfully...'.$emaill),'data' => $res,],200); + } + else + { + $myLogger->logme('error', "mail sent failed - $emaill"); + return json_encode(['status' => 'failed','code' => 404,'message'=>( 'Email Sent Failed...' . $emaill ),'data' => $res ],404); + } + + } catch (Exception $e) { + $msg = $e->getMessage(); + $myLogger->logme('error', "mail sent failed - $msg"); + return json_encode(['status' => 'failed','code' => 500,'data' => $msg],500); + } + } + + + public static function bulk_mail(array $mails = []) + { + // print_r();die; + $model = new JobModel(); + $start = microtime(true); + $runtime= 0; + try { + foreach ( $mails as $index=>$mail) { + $runtime = microtime(true) - $start; + $send_mail = self::send_email($mail); + } + + return json_encode(['status' => 'success','code' => 200, 'message'=>'Email Sent Successfully...'],200); + + } catch (\Throwable $th) { + return json_encode(['status' => 'failed','code' => 500],500); + } + } + } ?> \ No newline at end of file diff --git a/app/Libraries/GmailAPI.php b/app/Libraries/GmailAPI.php new file mode 100644 index 00000000..ffa180c7 --- /dev/null +++ b/app/Libraries/GmailAPI.php @@ -0,0 +1,180 @@ +myLogger = \Config\Services::mylogger(); + $this->client = new Client(); + $this->client->setApplicationName('Nhance GmailAPI'); + $this->client->setScopes([ + 'https://www.googleapis.com/auth/gmail.addons.current.message.readonly', + 'https://www.googleapis.com/auth/gmail.readonly', + 'https://www.googleapis.com/auth/gmail.labels', + 'https://www.googleapis.com/auth/gmail.send' + ]); + $this->setAuthConfig(); + //die(); + $this->client->setAccessType('offline'); + $this->client->setPrompt('select_account consent'); + + if (php_sapi_name() !== 'cli' || (uri_string() == 'cli/send_mail_cli' || uri_string() == 'cli/processjob') ) + { + $this->setTokenFromDB(); // Call only if not in CLI + } + + $this->service = new Gmail($this->client); + + } + + protected function setAuthConfig() + { + $settingsModel = new SettingsModel(); + $credentials = $settingsModel->where('id', 1)->first(); + + if (!$credentials) { + $this->myLogger->logme('error','OAuth credentials for GmailAPI not found in database.'); + throw new \Exception('OAuth credentials for GmailAPI not found in database.'); + } + // print_r($credentials[$this->authField]);//die(); + // $accessToken = $credentials[$this->authField]; + $this->client->setAuthConfig(json_decode($credentials[$this->authField],true)); + + // if ($this->client->isAccessTokenExpired()) { + // if ($this->client->getRefreshToken()) { + // $this->client->fetchAccessTokenWithRefreshToken($this->client->getRefreshToken()); + // $this->storeTokenToDB($this->client->getAccessToken()); + // } else { + // $this->myLogger->logme('error', 'Access token expired and no refresh token available.'); + // throw new \Exception('Access token expired and no refresh token available.'); + // } + // } + } + + protected function setTokenFromDB() + { + $settingsModel = new SettingsModel(); + $token = $settingsModel->where('id', 1)->first(); + // dd(is_array($token) && is_null($token[$this->tokenField])); + + if (is_array($token) && is_null($token[$this->tokenField])) { + $this->myLogger->logme('error','Email Token not found in database.'); + throw new \Exception('Email Token not found in database.'); + } + + $accessToken = json_decode($token[$this->tokenField], true); + $this->client->setAccessToken($accessToken); + + if ($this->client->isAccessTokenExpired()) { + if ($this->client->getRefreshToken()) { + $this->client->fetchAccessTokenWithRefreshToken($this->client->getRefreshToken()); + $this->storeTokenToDB($this->client->getAccessToken()); + } else { + $this->myLogger->logme('error', 'Access token expired and no refresh token available.'); + throw new \Exception('Access token expired and no refresh token available.'); + } + } + } + + protected function storeTokenToDB($token) + { + $settingsModel = new SettingsModel(); + $token = json_encode($token); + // $settingsModel->update(['id' => $this->tokenField], ['value' => json_encode($token)]); + $settingsModel->where('id', 1)->set([$this->tokenField => $token])->update(); + } + + public function createMessage($to, $subject, $htmlContent, $from, $replyTo, $cc = [], $bcc = []) + { + $boundary = uniqid(rand(), true); + + $rawMessageString = "From: $from\r\n"; + $rawMessageString .= "To: $to\r\n"; + $rawMessageString .= "Reply-To: $replyTo\r\n"; + + if (!empty($cc)) { + $rawMessageString .= "Cc: " . implode(',', $cc) . "\r\n"; + } + + if (!empty($bcc)) { + $rawMessageString .= "Bcc: " . implode(',', $bcc) . "\r\n"; + } + + $rawMessageString .= "Subject: $subject\r\n"; + $rawMessageString .= "MIME-Version: 1.0\r\n"; + $rawMessageString .= "Content-Type: multipart/alternative; boundary=\"$boundary\"\r\n\r\n"; + $rawMessageString .= "--$boundary\r\n"; + $rawMessageString .= "Content-Type: text/html; charset=UTF-8\r\n"; + $rawMessageString .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; + $rawMessageString .= $htmlContent . "\r\n"; + $rawMessageString .= "--$boundary--"; + + $rawMessage = base64_encode($rawMessageString); + $rawMessage = str_replace(['+', '/', '='], ['-', '_', ''], $rawMessage); + + $message = new Message(); + $message->setRaw($rawMessage); + + return $message; + } + + public function sendMessage($to, $subject, $htmlContent, $from, $replyTo, $cc = [], $bcc = []) + { + try { + $message = $this->createMessage($to, $subject, $htmlContent, $from, $replyTo, $cc, $bcc); + $res = $this->service->users_messages->send('me', $message); + return array('status' => true, 'data' => $res); + } catch (\Exception $e) { + $err_msg = 'An error occurred while sending the mail: ' . $e->getMessage(); + $this->myLogger->logme('error', $err_msg); + // throw new \Exception('An error occurred while sending the mail: ' . $e->getMessage()); + return array('status' => false, 'data' =>$e->getMessage()); + } + } + + public function generateNewToken() + { + // dd('called'); + if (!is_cli()) { + throw new \RuntimeException('This method can only be accessed via the command line.'); + } + + if (php_sapi_name() != 'cli') { + throw new Exception('This application must be run on the command line.'); + } + + $authUrl = $this->client->createAuthUrl(); + CLI::write('Open the following link in your browser'); + CLI::write("\n"); + CLI::write($authUrl); + // printf ("Open the following link in your browser:\n%s\n", $authUrl); + CLI::write('Enter verification code: '); + // print 'Enter verification code: '; + $authCode = trim(fgets(STDIN)); + + $accessToken = $this->client->fetchAccessTokenWithAuthCode($authCode); + if (array_key_exists('error', $accessToken)) { + $this->myLogger->logme('error', 'Error in getting access token from authCode' . join(', ', $accessToken)); + throw new \Exception(join(', ', $accessToken)); + } + + $this->storeTokenToDB($accessToken); + $this->myLogger->logme('error', 'New token generated and stored in the database.'); + print 'New token generated and stored in the database.'; + } +} diff --git a/app/Models/SettingsModel.php b/app/Models/SettingsModel.php new file mode 100644 index 00000000..140e59ef --- /dev/null +++ b/app/Models/SettingsModel.php @@ -0,0 +1,20 @@ + +

Send Test Mail Using Gmail API

+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ + + + + diff --git a/app/Views/rack_rate_test.php b/app/Views/rack_rate_test.php index 9100eadd..c6c22d0e 100644 --- a/app/Views/rack_rate_test.php +++ b/app/Views/rack_rate_test.php @@ -728,7 +728,7 @@ var old_data = data.old; const tableBody = document.getElementById(tableID); // $(("#".tableID)).empty(); - $("#restable tbody").empty() + $("#restable tbody").empty(); $('#oldrestable tbody').empty(); const existingRowCount = tableBody.rows.length; for(i = 0; i < data.length; i++)