The script flags records as deleted which will then be picked up by the next deleted records clearance cron
Read more: espocrm/espocrm#1359
The script flags records as deleted which will then be picked up by the next deleted records clearance cron
Read more: espocrm/espocrm#1359
<?php | |
/* | |
Job: CleanUpEmails | |
System: Espo CRM | |
Author: Tony Byng | |
Based from: Arkadywtf github gist: https://gist.github.com/arkadywtf/3a9c4d10f778690b5f0b33e1ba94f699 | |
Following this issue: https://github.com/espocrm/espocrm/issues/1359 | |
Description: | |
This will look for email records that do not have a parent | |
and the email wasn't sent from the system | |
and its before the selected date period and its not an "is_system" email | |
Legal Notice: This code is provided as-is, with no warranty, express or implied on fitness for any | |
purpose. You should only run it in safe mode until you have identified that the code | |
works for you and you should confirm that safe mode does what you want it to do before | |
running any code at all that you have downloaded from the internet. | |
You are responsible for your own backups, of both source code | |
and database and if you don't take enough backups to be able to return your system to | |
a stable state if something goes wrong, then it's on your own head. YOU HAVE BEEN WARNED | |
On the up side, if it helps. More power to open source! | |
*/ | |
namespace Espo\Custom\Jobs; | |
use Espo\Core\Jobs\Base; | |
use \PDO; | |
class CleanUpEmails extends Base | |
{ | |
public function run() | |
{ | |
$safeMode = true; // switch safemode off to actually run the code when you set up as a scheduled job | |
$daysToKeep = 1; | |
$emailNotification="[email protected]"; // get a notification by email in safemode rather than on screen | |
// or leave empty to get result on screen if running via CLI | |
$this->cleanUpEmails($safeMode, $daysToKeep,$emailNotification); | |
// You can either call cleanUpEmails in safemode until you are happy the code is working for you | |
// and then simply change to live mode when you set up a cron | |
// or get a cron set up to call the job in safe mode on a Monday morning | |
// looking at a period of 7 days and then run it Monday afternoon in live mode giving you say 8 hours | |
// to spot any emails that should really have been associated with an account but its a new email address | |
// that the system doesn't recognise. Or possibly change the query to give you a week between deletion and | |
// notification | |
} | |
protected function cleanUpEmails($safeMode = true, $keepDays = 7,$emailNotification="") | |
{ | |
/* @var PDO $pdo */ | |
$pdo = $this->getEntityManager()->getPDO(); | |
$dateBefore = date('Y-m-d', strtotime(" -" . $keepDays . " days")); | |
$notification = ""; | |
if ($safeMode) { | |
$notification .= "SafeMode is ON - no deletion will take place. Looking for emails before $dateBefore\n\n"; | |
} | |
// this does the original email based filtering | |
/* $sql = " | |
SELECT email.id, email.from_email_address_id | |
FROM email LEFT OUTER JOIN entity_email_address | |
ON (email.from_email_address_id=entity_email_address.email_address_id) | |
WHERE email.status != 'Sent' AND entity_email_address.email_address_id IS NULL | |
AND email.created_at < :date and email.deleted=0 and is_system=0 | |
";*/ | |
// we are now opting for a more generic "if it doesn't have a parent" version instead | |
$sql = "SELECT email.id FROM email WHERE email.status != 'Sent' AND parent_id is null and parent_type is null | |
AND email.created_at < :date and email.deleted=0 and is_system=0 "; | |
$sth = $pdo->prepare($sql); | |
$sth->execute([":date" => $dateBefore]); | |
$selectedToDelete = $sth->rowCount(); | |
while ($row = $sth->fetch(PDO::FETCH_OBJ)) { | |
$id = $row->id; | |
$emailEntity = $this->getEntityManager()->getRepository('Email')->get($id); | |
if ($emailEntity) { | |
if (!$safeMode) { | |
// Delete email record. Note this just flags as deleted, there is a separate EspoCRM | |
// job that deletes the email and any relationships | |
$this->getEntityManager()->removeEntity($emailEntity); | |
} else { | |
$notification.=$emailEntity->get("name") . " :: On " . $emailEntity->get("createdAt") . | |
" :: Sent From: " . $emailEntity->get("fromString") . "\n"; | |
} | |
} | |
} | |
if ($safeMode) { | |
$notification .= $selectedToDelete . " emails would be flagged as deleted and cleared in the ". | |
" next trash pickup if safe mode was not on\n\nFinished\n\n"; | |
if ($emailNotification) | |
mail($emailNotification,"EspoCRM Email Removal Notification", | |
$notification,"From: ".$emailNotification); | |
else | |
echo $notification; // if not emailing, then echo to screen | |
} | |
} | |
} |