Files
ExpenseCount/app/Controller/EmailsController.php
2026-06-25 13:03:45 +06:00

237 lines
6.4 KiB
PHP

<?php
/**
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://cakephp.org CakePHP(tm) Project
* @since 0.2.9
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
use Cake\Network\Exception\NotFoundException;
use Cake\View\Exception\MissingTemplateException;
use Cake\ORM\TableRegistry;
use Cake\Network\Email\Email;
use Aura\Intl\Exception;
/**
* User Management and REST API controller
*
* This controller will be used to send out email to the uses
*
* @link http://book.cakephp.org/3.0/en/controllers/pages-controller.html
*/
class EmailsController extends AppController {
public $uses = array('TempExpenseEmail','ExpenseEmail');
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler');
}
/**
* This function will be called to login and authenticate user
*
* @param params will be as post request
* @return json response output
* @link http://host/Emails/processRegEmails
*/
public function processRegEmails(){
$this->defineConstant();
$content = "";// $this->readFileContent();
try{
if($content == ""){
//first time writing in the file
//$this->writeFileContent("FALSE");
$this->startFetchAndProcess();
//$this->writeFileContent("TRUE");
} else {
//every 5 second, it will come here and try to fetch DB // set 5 sec in cron job
$contentArray = explode(':',$content);
if($contentArray[0] == "FALSE"){
//if FALSE returns morn than 2 min, then write TRUE in the file
$currentTime = time();
$lastUpdatedTimeTime = $contentArray[1];
if((round(abs($currentTime - $lastUpdatedTimeTime) / 60,2)) > EMAIL_ROWS_PROCESS_TIME_MIN_MAX){ // SET it in constant
$this->writeFileContent("TRUE");
}
return;
} else {
$this->writeFileContent("FALSE");
$this->startFetchAndProcess();
$this->writeFileContent("TRUE");
}
}
} catch(Exception $ex){
}
exit;
}
private function startFetchAndProcess(){
//fetch first 10 rows from DB where sending_count < 3
$update_time_target = date("Y-m-d H:i:s", strtotime("-3 min"));
$emailInfo = $this->TempExpenseEmail->find('all',
array(
'conditions' => array('count_email_attempt < ' => MAX_SENDING_COUNT, 'update_date <' => $update_time_target),
'limit' => NUM_OF_EMAIL_ROW_FETCH,
'order'=>array('create_date ASC')
)); // SET it in constant
/* $dbo = $this->TempExpenseEmail->getDatasource();
$logs = $dbo->_queriesLog;
var_dump($logs);
echo "<pre>";
print_r($emailInfo); exit;
*/
if(!empty($emailInfo)){
foreach($emailInfo as $key=>$value){
$value = $value["TempExpenseEmail"];
$count = $value["count_email_attempt"];
$count++;
try{
$currentDate = "'".date("Y-m-d H:i:s")."'";
//process each row and update sending count
$userUpdated = $this->TempExpenseEmail->updateAll(
array('count_email_attempt' => $count,'update_date' => $currentDate ),
array('id' => $value["id"]));
$emailData = array();
$emailData["title"] = $value["title"];
$emailData["unique_url"] = $value["unique_url"];
$emailData["email"] = $value["email"];
//send email
$this->sendEmail($emailData);
//insert into ExpenseEmail
$inputData = array();
$inputData["id"] = $value["id"];
$inputData["unique_url"] = $value["unique_url"];
$inputData["email"] = $value["email"];
$inputData["title"] = $value["title"];
$inputData["count_email_attempt"] = $value["count_email_attempt"];
$this->ExpenseEmail->insertExpenseEmail($inputData);
// delete the email record after successful sending
$result = $this->TempExpenseEmail->deleteAll(array('id' => $value["id"]));
} catch(Exception $ex){
}
}
}
}
private function writeFileContent($flag){
$handle = fopen(REGISTRATION_EMAIL_SCHEDULE_TRACKING_FILE,"w+");
try{
fwrite($handle, $flag.":".time());
} catch(Exceptoin $ex){
}
fclose($handle);
}
private function readFileContent(){
$handle = fopen(REGISTRATION_EMAIL_SCHEDULE_TRACKING_FILE, "r");
try{
$contents = fread($handle, filesize(REGISTRATION_EMAIL_SCHEDULE_TRACKING_FILE));
} catch(Exceptoin $ex){
}
fclose($handle);
return trim($contents);
}
private function sendEmail($emailData){
$data = array();
$data["email"] = $emailData["email"];
$data["expense_title"] = $emailData["title"];
$data["unique_url"] = $emailData["unique_url"];
$default = array(
'host' => Configure::read('expensecount.email.smtp.host'),
'port' => 587,
'auth' => 'plain',
'username' => Configure::read('expensecount.email.smtp.username'),
'password' => Configure::read('expensecount.email.smtp.password'),
'tsl' => false,
'transport' => 'Smtp',
'from' => array(Configure::read('expensecount.email.smtp.from') => 'ExpenseCount'),
'returnPath' => Configure::read('expensecount.email.smtp.from'),
'layout' => false,
'emailFormat' => 'html',
//'template' => 'only_text',
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
);
App::uses('CakeEmail', 'Network/Email');
//echo $Email->
$Email = new CakeEmail($default);
$Email->to($data["email"]);
$Email->emailFormat('html');
$Email->template('email',null)->viewVars( array('data' => $data));
$Email->subject('ExpenseCount "'.$data["expense_title"].'" ');
$Email->replyTo(Configure::read('expensecount.email.smtp.from'));
$Email->from(array(Configure::read('expensecount.email.smtp.from') => "ExpenseCount.com"));
//$Email->smtpOptions = $default;
$Email->delivery = 'Smtp';
$Email->send();
}
private function getEmailTemplate($templatePath,$local){
return $templatePath."_".$local;
}
private function defineConstant(){
define("EMAIL_ROWS_PROCESS_TIME_MIN_MAX",2); //value in minute
define("NUM_OF_EMAIL_ROW_FETCH",10);
define("MAX_SENDING_COUNT",3);
}
}