* @copyright Copyright (c) Alex Tselegidis * @license https://opensource.org/licenses/GPL-3.0 - GPLv3 * @link https://easyappointments.org * @since v1.4.0 * ---------------------------------------------------------------------------- */ /** * Email messages library. * * Handles the email messaging related functionality. * * @package Libraries */ class Email_messages { /** * @var EA_Controller|CI_Controller */ protected EA_Controller|CI_Controller $CI; /** * Email_messages constructor. */ public function __construct() { $this->CI = &get_instance(); $this->CI->load->model('admins_model'); $this->CI->load->model('appointments_model'); $this->CI->load->model('providers_model'); $this->CI->load->model('secretaries_model'); $this->CI->load->model('secretaries_model'); $this->CI->load->model('settings_model'); $this->CI->load->library('email'); $this->CI->load->library('ics_file'); $this->CI->load->library('timezones'); } /** * Send an email with the appointment details. * * @param array $appointment Appointment data. * @param array $provider Provider data. * @param array $service Service data. * @param array $customer Customer data. * @param array $settings App settings. * @param string $subject Email subject. * @param string $message Email message. * @param string $appointment_link Appointment unique URL. * @param string $recipient_email Recipient email address. * @param string $ics_stream ICS file contents. * @param string|null $timezone Custom timezone. * * @throws Exception */ public function send_appointment_saved( array $appointment, array $provider, array $service, array $customer, array $settings, string $subject, string $message, string $appointment_link, string $recipient_email, string $ics_stream, string $timezone = null ): void { $appointment_timezone = new DateTimeZone($provider['timezone']); $appointment_start = new DateTime($appointment['start_datetime'], $appointment_timezone); $appointment_end = new DateTime($appointment['end_datetime'], $appointment_timezone); if ($timezone && $timezone !== $provider['timezone']) { $custom_timezone = new DateTimeZone($timezone); $appointment_start->setTimezone($custom_timezone); $appointment['start_datetime'] = $appointment_start->format('Y-m-d H:i:s'); $appointment_end->setTimezone($custom_timezone); $appointment['end_datetime'] = $appointment_end->format('Y-m-d H:i:s'); } $html = $this->CI->load->view( 'emails/appointment_saved_email', [ 'subject' => $subject, 'message' => $message, 'appointment' => $appointment, 'service' => $service, 'provider' => $provider, 'customer' => $customer, 'settings' => $settings, 'timezone' => $timezone, 'appointment_link' => $appointment_link ], true ); $this->CI->email->from($settings['company_email'], $settings['company_email']); $this->CI->email->to($recipient_email); $this->CI->email->subject($subject); $this->CI->email->message($html); $this->CI->email->attach($ics_stream, 'attachment', 'invitation.ics', 'text/vcalendar'); if (!$this->CI->email->send(false)) { throw new RuntimeException('Email was not sent: ' . $this->CI->email->print_debugger()); } } /** * Send an email with the appointment removal details. * * @param array $appointment Appointment data. * @param array $provider Provider data. * @param array $service Service data. * @param array $customer Customer data. * @param array $settings App settings. * @param string $recipient_email Recipient email address. * @param string|null $reason Removal reason. * @param string|null $timezone Custom timezone. * * @throws Exception */ public function send_appointment_deleted( array $appointment, array $provider, array $service, array $customer, array $settings, string $recipient_email, string $reason = null, string $timezone = null ): void { $appointment_timezone = new DateTimeZone($provider['timezone']); $appointment_start = new DateTime($appointment['start_datetime'], $appointment_timezone); $appointment_end = new DateTime($appointment['end_datetime'], $appointment_timezone); if ($timezone && $timezone !== $provider['timezone']) { $custom_timezone = new DateTimeZone($timezone); $appointment_start->setTimezone($custom_timezone); $appointment['start_datetime'] = $appointment_start->format('Y-m-d H:i:s'); $appointment_end->setTimezone($custom_timezone); $appointment['end_datetime'] = $appointment_end->format('Y-m-d H:i:s'); } $html = $this->CI->load->view( 'emails/appointment_deleted_email', [ 'appointment' => $appointment, 'service' => $service, 'provider' => $provider, 'customer' => $customer, 'settings' => $settings, 'timezone' => $timezone, 'reason' => $reason ], true ); $this->CI->email->from($settings['company_email'], $settings['company_email']); $this->CI->email->to($recipient_email); $this->CI->email->subject(lang('appointment_cancelled_title')); $this->CI->email->message($html); if (!$this->CI->email->send(false)) { throw new RuntimeException('Email was not sent: ' . $this->CI->email->print_debugger()); } } /** * Send the account recovery details. * * @param string $password New password. * @param string $recipient_email Recipient email address. * @param array $settings App settings. */ public function send_password(string $password, string $recipient_email, array $settings): void { $html = $this->CI->load->view( 'emails/account_recovery_email', [ 'subject' => lang('new_account_password'), 'message' => str_replace('$password', '' . $password . '', lang('new_password_is')), 'settings' => $settings ], true ); $this->CI->email->from($settings['company_email'], $settings['company_email']); $this->CI->email->to($recipient_email); $this->CI->email->subject(lang('new_account_password')); $this->CI->email->message($html); if (!$this->CI->email->send(false)) { throw new RuntimeException('Email was not sent: ' . $this->CI->email->print_debugger()); } } }