2017-09-14 11:40:13 +02:00
< ? php
/**
2018-02-22 12:35:22 +01:00
* Classe per gestire le email in base alle impostazioni , basata sul framework open - source PHPMailer .
2017-09-14 11:40:13 +02:00
*
* @ since 2.3
*/
2018-01-02 17:01:47 +01:00
class Mail extends PHPMailer\PHPMailer\PHPMailer
2017-09-14 11:40:13 +02:00
{
2017-09-22 15:16:56 +02:00
/** @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 = [];
2017-09-14 11:40:13 +02:00
protected $infos = [];
2017-09-22 15:16:56 +02:00
/**
2018-07-10 12:07:48 +02:00
* Restituisce tutte le informazioni di tutti gli account email presenti .
2017-09-22 15:16:56 +02:00
*
* @ return array
*/
public static function getAccounts ()
{
if ( empty ( self :: $accounts )) {
$database = Database :: getConnection ();
2018-07-10 12:07:48 +02:00
$results = $database -> fetchArray ( 'SELECT * FROM zz_smtps WHERE deleted = 0' );
2017-09-22 15:16:56 +02:00
$accounts = [];
foreach ( $results as $result ) {
$accounts [ $result [ 'id' ]] = $result ;
$accounts [ $result [ 'name' ]] = $result [ 'id' ];
if ( ! empty ( $result [ 'main' ])) {
$accounts [ 'default' ] = $result [ 'id' ];
}
}
self :: $accounts = $accounts ;
}
return self :: $accounts ;
}
/**
2018-07-10 12:07:48 +02:00
* Restituisce le informazioni relative a un singolo account email specificato .
2017-09-22 15:16:56 +02:00
*
2018-02-20 16:46:23 +01:00
* @ param string | int $template
2017-09-22 15:16:56 +02:00
*
* @ return array
*/
public static function get ( $account = null )
{
if ( ! is_numeric ( $account ) && ! empty ( self :: getAccounts ()[ $account ])) {
$account = self :: getAccounts ()[ $account ];
}
if ( empty ( $account )) {
$account = self :: getAccounts ()[ 'default' ];
}
return self :: getAccounts ()[ $account ];
}
2018-02-20 16:46:23 +01:00
/**
2018-07-10 12:07:48 +02: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 )) {
$database = Database :: getConnection ();
$results = $database -> fetchArray ( 'SELECT * FROM zz_emails WHERE deleted = 0' );
$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
/**
2018-07-10 12:07:48 +02:00
* Restituisce le variabili relative a un singolo template specificato .
2018-02-20 17:57:16 +01:00
*
* @ param string | int $template
*
* @ return array
*/
2018-02-21 17:47:43 +01:00
public static function getTemplateVariables ( $template , $id_record )
2018-02-20 17:57:16 +01:00
{
$template = self :: getTemplate ( $template );
2018-02-21 17:47:43 +01:00
$database = Database :: getConnection ();
$dbo = $database ;
2018-02-20 17:57:16 +01:00
// Lettura delle variabili nei singoli moduli
2018-06-26 14:26:40 +02:00
$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 ;
}
2017-09-22 15:16:56 +02:00
public function __construct ( $account = null , $exceptions = null )
2017-09-14 11:40:13 +02:00
{
parent :: __construct ( $exceptions );
2018-07-10 16:44:09 +02:00
$this -> CharSet = 'UTF-8' ;
2017-09-14 11:40:13 +02:00
// Configurazione di base
2017-09-22 15:16:56 +02:00
$config = self :: get ( $account );
2017-09-14 11:40:13 +02:00
// Preparazione email
$this -> IsHTML ( true );
2018-02-27 16:19:13 +01:00
if ( ! empty ( $config [ 'server' ])) {
2017-09-14 11:40:13 +02:00
$this -> IsSMTP ( true );
// Impostazioni di debug
2018-06-14 15:47:59 +02:00
$this -> SMTPDebug = 4 ;
2017-09-14 11:40:13 +02:00
$this -> Debugoutput = function ( $str , $level ) {
$this -> infos [] = $str ;
};
// Impostazioni dell'host
2018-02-27 16:19:13 +01:00
$this -> Host = $config [ 'server' ];
2017-09-14 11:40:13 +02:00
$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
2017-09-22 15:16:56 +02:00
if ( in_array ( strtolower ( $config [ 'encryption' ]), [ 'ssl' , 'tls' ])) {
$this -> SMTPSecure = strtolower ( $config [ 'encryption' ]);
2017-09-14 11:40:13 +02:00
}
}
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
2017-09-14 11:40:13 +02:00
$this -> WordWrap = 78 ;
}
public function send ()
{
global $logger ;
if ( empty ( $this -> AltBody )) {
$this -> AltBody = strip_tags ( $this -> Body );
}
$result = parent :: send ();
$this -> SmtpClose ();
// Segnalazione degli errori
foreach ( $this -> infos as $info ) {
$logger -> addRecord ( \Monolog\Logger :: ERROR , $info );
}
return $result ;
}
2018-06-29 16:19:48 +02:00
2018-07-10 12:07:48 +02:00
/**
* Aggiunge gli allegati all ' email .
*
* @ param array $prints
* @ param array $files
*/
public function attach ( $prints , $files )
{
$id_module = App :: getCurrentModule ()[ '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' ],
'name' => $attachment [ 'nome' ],
];
}
// 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' ],
'name' => $attachment [ 'nome' ],
];
}
// Aggiunta allegati
foreach ( $attachments as $attachment ) {
$this -> AddAttachment ( $attachment [ 'path' ], $attachment [ 'name' ]);
}
}
/**
* Aggiunge i detinatari .
*
* @ param array $receivers
* @ param array $types
*/
public function addReceivers ( $receivers , $types )
{
// Destinatari
foreach ( $receivers as $key => $destinatario ) {
$type = $types [ $key ];
$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 );
}
}
}
}
/**
* Effettua un test di connessione all ' email SMTP .
*
* @ return bool
*/
2018-06-29 16:19:48 +02:00
public function testSMTP ()
{
if ( $this -> IsSMTP () && $this -> smtpConnect ()) {
$this -> smtpClose ();
return true ;
}
return false ;
}
2017-09-14 11:40:13 +02:00
}