<?php
namespace OceanExpertBundle\Controller;
use DateTime;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\Query;
use Exception;
use OceanExpertBundle\Entity\MailQueueFiles;
use OceanExpertBundle\Entity\Mails;
use OceanExpertBundle\Entity\Messages;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class MailsController extends AbstractController
{
public function indexAction()
{
return $this->render('Mails/index.html.twig', array());
}
public function uploadEmailAttachmentsAction(Request $request): Response
{
if (null !== $request->files) {
foreach ($request->files as $uploadedFile) {
$fileName = time() . '_' . $uploadedFile->getClientOriginalName();
$directory = "uploads/emails/attachments/";
$uploadedFile->move($directory, $fileName);
}
}
return new Response($fileName);
}
public function removeEmailAttachmentAction(Request $request): Response
{
$fileName = $request->query->get('filename');
if ($fileName) {
$file = "uploads/emails/attachments/" . $fileName;
if (file_exists($file)) {
unlink($file);
}
}
return new Response($fileName);
}
/**
* make a file that contains the queue for the mails
*
* @param Request $request
*
* @return JsonResponse
*
* @throws Exception
*/
public function emailQueueAction(Request $request): JsonResponse
{
//check if the event is already active
$em = $this->getDoctrine()->getManager();
//if this is an email for an event, check the event is active
if ($request->request->get('eventid')) {
$event = $em->getRepository('OceanExpertBundle:Events')
->findOneBy(
array(
'idEvent' => $request->request->get('eventid'),
'status' => 1
)
);
if (!$event) {
return new JsonResponse(
array(
'status' => 4,
'error' => 'event not found or not active yet',
'returnMessage' => 'no return message'
)
);
}
}
//what is our environment?
$env = $this->container->get('kernel')->getEnvironment();
//for testing purposes
//$data['status'] = 3;
//$data['error'] = 'arno error';
//$data['returnMessage'] = 'arno return message';
//return new JsonResponse($data);
$data = $request->request->all();
if (isset($data['subject'])
&& trim($data['subject']) != ''
&& trim($data['message'])
) {
$returnMessage = '';
$em = $this->getDoctrine()->getManager();
$dirName = '/tmp/emailqueue';
if ($env !== 'prod') {
$dirName .= "_$env";
}
$fileName = uniqid() . '.json';
$fullFileName = $dirName . '/' . $fileName;
$returnMessage .= "dirname: $dirName, filename: $fileName, fullfilename: $fullFileName;";
clearstatcache();
if (!file_exists($dirName .'/')) {
$returnMessage .= $dirName . ' does not exist, trying to make it;';
$dirMade = mkdir(
$dirName . '/',
0777,
true
);
$returnMessage .= "dir made?: $dirMade;";
}
if ($fp = fopen($fullFileName, 'w')) {
$returnMessage .= "$fullFileName opened;";
if (fwrite($fp, json_encode($data))) {
fclose($fp);
$returnMessage .= "$fullFileName closed;";
$mailQueue = new MailQueueFiles();
$mailQueue->setIdInd($data['userid']);
$mailQueue->setFileName($fileName);
$mailQueue->setCreatedAt(new DateTime("now"));
$mailQueue->setProcessedAt(null);
$mailQueue->setProcessed(0);
$mailQueue->setApproved(1);
$em->persist($mailQueue);
$em->flush();
$data['status'] = 0;
$data['returnMessage'] = '0 means no errors; ' . $returnMessage;
} else {
//not good
$data['status'] = 1;
$data['error'] = 'unable to write file, no mail will be sent';
$data['returnMessage'] = 'for reference: ' . $returnMessage;
}
} else {
//not good
$data['status'] = 2;
$data['error'] = 'unable to open file, no mail will be sent';
$data['returnMessage'] = 'for reference: ' . $returnMessage;
}
} else {
//not good
$data['status'] = 3;
$data['error'] = 'missing either subject or message to send';
$data['returnMessage'] = 'for reference: no return message';
}
return new JsonResponse($data);
}
/*
public function getUnsubscribeLink($idUser)
{
$request = $this->get('request_stack')->getCurrentRequest();
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$baseurl .= $this->generateUrl(
'email_unsubscribe',
array(
'token' => $this->encrypt_decrypt(
'encrypt',
$idUser
)
)
);
return $baseurl;
}
*/
/**
* @param $action - encrypt | decrypt
* @param $string - String code
*
* @return bool|string - encrypted or decrypted string.
*/
public static function encrypt_decrypt($action, $string)
{
$output = false;
$encrypt_method = "AES-256-CBC";
$secret_key = 'aAqyTksTjbW6BN8fnbLaY6qHYNFNQMnR';
$secret_iv = 'KDAGPYqwgJGwpySZShr4b2pmTQTC2BLf';
// hash
$key = hash('sha256', $secret_key);
$iv = substr(
hash(
'sha256',
$secret_iv),
0,
16
);
if ($action == 'encrypt') {
$output = openssl_encrypt
($string,
$encrypt_method,
$key,
0, $iv);
$output = base64_encode($output);
} elseif ($action == 'decrypt') {
$output = openssl_decrypt(
base64_decode($string),
$encrypt_method,
$key,
0,
$iv
);
}
return $output;
}
/**
* @param $token
*
* @return Response
*
* @throws Exception
*/
public function unsubscribeAction($token): Response
{
$idUser = $this->encrypt_decrypt('decrypt', $token);
$data = array();
if ($idUser != '') {
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('OceanExpertBundle:Indiv')->findOneBy(array('idInd' => $idUser));
if ($user) {
$email = $user->getEmail2() != '' ? $user->getEmail2() : $user->getEmail1();
$data = array(
'fname' => $user->getFname(),
'sname' => $user->getSname(),
'email' => $email,
'subscribed' => $user->getDoNotInvite()
);
$request = $this->container->get('request_stack')->getCurrentRequest();
if ($request->isMethod('POST')) {
$status = $request->request->get('status', 0);
$user->setDoNotInvite($status);
$user->setDoNoInviteOn(new DateTime());
$user->setDoNoInviteBy($user->getIdInd());
$em->persist($user);
$em->flush();
if ($user->getDoNotInvite() == 1) {
$data['success'] = 'Thank you. you have been successfully unsubscribed.';
} else {
$data['success'] = 'Thank you. You are subscribed to OceanExpert emails.';
}
}
} else {
$data['error'] = 'Invalid token or token id does not exists. Please check the unsubscribe link.';
}
} else {
$data['error'] = 'Invalid token or token id does not exists. Please check the unsubscribe link.';
}
return $this->render('Mails/unsubscribe.html.twig', $data);
}
/**
* this will be called by Mandrill when a mail triggers
* send
* deferral
* hard_bounce
* soft_bounce
* open
* click
* spam
* unsub
* reject
* denylist
* allowlist
* for some dark reason this was handled by the IODE site ....
*
* @todo : check if we still need this, we already have an active check for mandrill in CheckMandrillForWebhooks
*
* @param LoggerInterface $logger
* @param Request $request
*
* @return void
*/
public function mandrillWebhookAction(LoggerInterface $logger, Request $request) {
define('DEBUG', 2);
$logMessage = date('d/m/Y H:i:s') . ' start';
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
$data = $request->request->get('mandrill_events');
$logMessage = "post data from Mandrill : $data";
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
$data = json_decode($data, true);
//$logMessage = 'json data from Mandrill : ' . var_dump($data);
$logMessage = 'json data from Mandrill';
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
$em = $this->getDoctrine()->getManager();
foreach ($data as $event) {
/*
//for the time being it's very hard to understand the relation between what mandrill sends and OE db
if (isset($event->msg)
&& isset($event->msg->metadata)
&& isset($event->msg->metadata->id)
) {
$id = $event->msg->metadata->id;
$mail = $em->getRepository('OceanExpertBundle:Mails')
->findOneBy(
array(
'id' => $id
)
);
if ($mail) {
switch ($event->event) {
case 'send':
if (DEBUG > 1) {
$logMessage = "deleted id $id from table mails";
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
}
$em->remove($mail);
$em->flush();
break;
case 'hard_bounce':
if (DEBUG > 1) {
$logMessage = "set id $id as bounced in table mails";
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
}
$mail->setMandrillStatus('hard_bounce');
$em->persist($mail);
$em->flush();
break;
case 'soft_bounce':
//$stmt = $pdo->prepare("UPDATE mails set try_sent = try_sent + 1, sent_time = now(), mandril_status = 'soft_bounce', sent_mandril = null WHERE id = :id");
$mail->setMandrilStatus('soft_bounce');
$mail->setSentMandril(null);
$mail->setTrySent($mail->getTrySent() + 1);
if (DEBUG > 1) {
$logMessage = "update id $id in table mails";
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
}
$em->persist($mail);
$em->flush();
break;
default:
if (DEBUG > 1) {
$logMessage = 'nothing to do for event ' . $event->event;
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
}
}
dump($logMessage);
} else {
dump('NOT found mail with id "' . $id . '"');
$record = array(
'recipient' => 'recipient not found',
'sender' => 'sender not found'
);
}
} else {
$id = 'unknown id';
$record = array(
'recipient' => 'unknown recipient',
'sender' => 'unknown sender'
);
}
if (DEBUG > 1) {
if (is_object($event)) {
$event = $event->event;
} else {
$event = 'unknown event';
}
$logMessage = "info we need: $id;" . $event . ';' . $record['recipient'] . ';' . $record['sender'];
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
dump($logMessage);
}
*/
$logger->info('MANDRILLWEBHOOK: ' . json_encode($event));
}
$logMessage = date('d/m/Y H:i:s') . ' end';
$logger->info('MANDRILLWEBHOOK: ' . $logMessage);
return new Response('1');
}
}