openstamanager/src/Mail.php

348 lines
9.0 KiB
PHP
Raw Normal View History

<?php
use Models\MailAccount;
use Models\MailTemplate;
/**
2018-02-22 12:35:22 +01:00
* Classe per gestire le email in base alle impostazioni, basata sul framework open-source PHPMailer.
*
* @since 2.3
*/
class Mail extends PHPMailer\PHPMailer\PHPMailer
{
/** @var array Elenco degli account email disponibili */
protected static $accounts = [];
2018-02-20 16:46:23 +01:00
/** @var array Elenco dei template email disponibili */
protected static $templates = [];
2018-06-23 15:41:32 +02:00
protected static $references = [];
2018-02-20 16:46:23 +01:00
/** @var array Elenco dei template email per modulo */
protected static $modules = [];
protected $infos = [];
/**
* Restituisce tutte le informazioni di tutti gli account email presenti.
*
* @return array
*/
public static function getAccounts()
{
return MailAccount::getAll();
}
/**
* Restituisce le informazioni relative a un singolo account email specificato.
*
* @param string|int $account
*
* @return array
*/
public static function get($account = null)
{
$accounts = self::getAccounts();
$result = MailAccount::get($account);
if (empty($return)) {
$result = $accounts->first(function ($item) use ($group) {
return !empty($item->main);
});
}
return $result;
}
2018-02-20 16:46:23 +01:00
/**
* Restituisce tutte le informazioni di tutti i template presenti.
2018-02-20 16:46:23 +01:00
*
* @return array
*/
public static function getTemplates()
{
if (empty(self::$templates)) {
2018-09-20 12:05:22 +02:00
$database = database();
2018-02-20 16:46:23 +01:00
$results = $database->fetchArray('SELECT * FROM zz_emails WHERE deleted_at IS NULL');
2018-02-20 16:46:23 +01:00
$templates = [];
2018-06-23 18:35:08 +02:00
$references = [];
2018-02-20 16:46:23 +01:00
2018-06-23 15:41:32 +02:00
// Inizializzazione dei riferimenti
foreach (Modules::getModules() as $module) {
self::$modules[$module['id']] = [];
}
2018-02-20 16:46:23 +01:00
foreach ($results as $result) {
$templates[$result['id']] = $result;
2018-06-23 15:41:32 +02:00
$references[$result['name']] = $result['id'];
2018-02-20 16:46:23 +01:00
self::$modules[$result['id_module']][] = $result['id'];
}
self::$templates = $templates;
2018-06-23 15:41:32 +02:00
self::$references = $references;
2018-02-20 16:46:23 +01:00
}
return self::$templates;
}
/**
* Restituisce le informazioni relative a un singolo template specificato.
*
* @param string|int $template
*
* @return array
*/
public static function getTemplate($template)
{
2018-06-23 18:35:08 +02:00
$templates = self::getTemplates();
2018-06-23 15:41:32 +02:00
if (!is_numeric($template) && !empty(self::$references[$template])) {
$template = self::$references[$template];
2018-02-20 16:46:23 +01:00
}
2018-06-23 18:35:08 +02:00
return $templates[$template];
2018-02-20 16:46:23 +01:00
}
2018-02-20 17:57:16 +01:00
/**
* Restituisce le variabili relative a un singolo template specificato.
2018-02-20 17:57:16 +01:00
*
* @param string|int $template
*
* @return array
*/
public static function getTemplateVariables($template, $id_record)
2018-02-20 17:57:16 +01:00
{
$template = self::getTemplate($template);
2018-09-20 12:05:22 +02:00
$dbo = $database = database();
2018-02-20 17:57:16 +01:00
// Lettura delle variabili nei singoli moduli
$variables = include Modules::filepath($template['id_module'], 'variables.php');
2018-02-20 17:57:16 +01:00
return (array) $variables;
}
2018-02-20 16:46:23 +01:00
/**
* Restituisce le informazioni relative ai template di un singolo modulo specificato.
*
* @param string|int $module
*
* @return array
*/
public static function getModuleTemplates($module)
{
$module_id = Modules::get($module)['id'];
2018-02-20 17:57:16 +01:00
self::getTemplates();
2018-02-20 16:46:23 +01:00
$result = [];
foreach ((array) self::$modules[$module_id] as $value) {
$result[] = self::getTemplate($value);
}
return $result;
}
public function __construct($account = null, $exceptions = null)
{
parent::__construct($exceptions);
2018-07-10 16:44:09 +02:00
$this->CharSet = 'UTF-8';
// Configurazione di base
$config = self::get($account);
// Preparazione email
$this->IsHTML(true);
if (!empty($config['server'])) {
$this->IsSMTP(true);
// Impostazioni di debug
$this->SMTPDebug = 4;
$this->Debugoutput = function ($str, $level) {
$this->infos[] = $str;
};
// Impostazioni dell'host
$this->Host = $config['server'];
$this->Port = $config['port'];
// Impostazioni di autenticazione
if (!empty($config['username'])) {
$this->SMTPAuth = true;
$this->Username = $config['username'];
$this->Password = $config['password'];
}
// Impostazioni di sicurezza
if (in_array(strtolower($config['encryption']), ['ssl', 'tls'])) {
$this->SMTPSecure = strtolower($config['encryption']);
}
}
2018-02-20 17:57:16 +01:00
$this->From = $config['from_address'];
2018-07-08 15:42:20 +02:00
$this->FromName = $config['from_name'];
2018-02-20 17:57:16 +01:00
$this->WordWrap = 78;
}
/**
* Testa la connessione al server SMTP.
*
* @return bool
*/
public function testSMTP()
{
if ($this->smtpConnect()) {
$this->smtpClose();
return true;
}
return false;
}
/**
* Invia l'email impostata.
*
* @return bool
*/
public function send()
{
if (empty($this->AltBody)) {
$this->AltBody = strip_tags($this->Body);
}
$result = parent::send();
$this->SmtpClose();
// Segnalazione degli errori
2018-07-19 14:34:52 +02:00
$logger = logger();
foreach ($this->infos as $info) {
$logger->addRecord(\Monolog\Logger::ERROR, $info);
}
return $result;
}
2018-06-29 16:19:48 +02:00
public function setTemplate(array $template)
{
// Reply To
if (!empty($template['reply_to'])) {
$this->AddReplyTo($template['reply_to']);
}
// CC
if (!empty($template['cc'])) {
$this->AddCC($template['cc']);
}
// BCC
if (!empty($template['bcc'])) {
$this->AddBCC($template['bcc']);
}
}
/**
* Aggiunge gli allegati all'email.
*
* @param array $prints
* @param array $files
*/
public function attach($prints, $files)
{
2018-09-05 10:36:41 +02:00
$id_module = Modules::getCurrent()['id'];
$id_record = App::getCurrentElement();
// Elenco degli allegati
$attachments = [];
// Stampe
foreach ($prints as $print) {
$print = Prints::get($print);
// Utilizzo di una cartella particolare per il salvataggio temporaneo degli allegati
$filename = DOCROOT.'/files/attachments/'.$print['title'].' - '.$id_record.'.pdf';
Prints::render($print['id'], $id_record, $filename);
$attachments[] = [
'path' => $filename,
'name' => $print['title'].'.pdf',
];
}
// Allegati del record
$selected = [];
if (!empty($files)) {
$selected = $dbo->fetchArray('SELECT * FROM zz_files WHERE id IN ('.implode(',', $files).') AND id_module = '.prepare($id_module).' AND id_record = '.prepare($id_record));
}
foreach ($selected as $attachment) {
$attachments[] = [
'path' => $upload_dir.'/'.$attachment['filename'],
2018-08-31 11:39:38 +02:00
'name' => $attachment['name'],
];
}
// Allegati dell'Azienda predefinita
$anagrafiche = Modules::get('Anagrafiche');
$selected = [];
if (!empty($files)) {
$selected = $dbo->fetchArray('SELECT * FROM zz_files WHERE id IN ('.implode(',', $files).') AND id_module != '.prepare($id_module));
}
foreach ($selected as $attachment) {
$attachments[] = [
'path' => DOCROOT.'/files/'.$anagrafiche['directory'].'/'.$attachment['filename'],
2018-08-31 11:39:38 +02:00
'name' => $attachment['name'],
];
}
// Aggiunta allegati
foreach ($attachments as $attachment) {
$this->AddAttachment($attachment['path'], $attachment['name']);
}
}
/**
* Aggiunge i destinatari.
*
* @param array $receivers
* @param array $types
*/
public function addReceivers($receivers, $types = [])
{
foreach ($receivers as $key => $destinatario) {
$type = $types[$key] ?: 'a';
$pieces = explode('<', $destinatario);
$count = count($pieces);
$name = null;
if ($count > 1) {
$email = substr(end($pieces), 0, -1);
$name = substr($destinatario, 0, strpos($destinatario, '<'.$email));
} else {
$email = $destinatario;
}
if (!empty($email)) {
if ($type == 'a') {
$this->AddAddress($email, $name);
} elseif ($type == 'cc') {
$this->AddCC($email, $name);
} elseif ($type == 'bcc') {
$this->AddBCC($email, $name);
}
}
}
}
}