array(addresses, address, name) * @param array $options (to, cc, bcc, from, subject, email, type['html', or 'text']) * @return bool */ function send_email(array $options): bool { if (!is_array($options)) { return false; } if (! Reg::get('loader')->is_loaded('PHPMailer\PHPMailer')) { Reg::get('loader')->add_namespace('PHPMailer\PHPMailer', CodeHydrater_PROJECT . 'vendor/phpmailer/phpmailer/src'); } $mail = new \PHPMailer\PHPMailer\PHPMailer(); $message = ''; $subject = ''; $to = ''; $from = ''; $from_name = ''; $reply = ''; $reply_name = ''; $content_type = ''; $cc = ''; $cc_name = ''; $bcc = ''; $bcc_name = ''; foreach ($options as $key => $value) { $default = (isset($value[0])) ? $value[0] : null; switch (strtolower($key)) { case 'to': if (is_array($value)) { $mto = (isset($value['addresses']) && is_array($value['addresses'])) ? $value['addresses'] : false; $to = (isset($value['address'])) ? $value['address'] : $default; $to_name = (isset($value['name'])) ? $value['name'] : false; if ($mto !== false) { foreach ($mto as $name => $address) { $mail->addAddress($address, $name); $to .= $address . "({$name});"; } } elseif ($to_name === false) { $mail->addAddress($to); } else { $mail->addAddress($to, $to_name); } } else { $to = $value; $mail->addAddress($to); // Add a recipient } break; case 'cc': if (is_array($value)) { $mcc = (isset($value['addresses']) && is_array($value['addresses'])) ? $value['addresses'] : false; $cc = (isset($value['address'])) ? $value['address'] : $default; $cc_name = (isset($value['name'])) ? $value['name'] : false; if ($mcc !== false) { foreach ($mcc as $name => $address) { $mail->addCC($address, $name); } } elseif ($cc_name === false) { $mail->addCC($cc); } else { $mail->addCC($cc, $cc_name); } } else { $mail->addCC($value); } break; case 'bcc': if (is_array($value)) { $mbcc = (isset($value['addresses']) && is_array($value['addresses'])) ? $value['addresses'] : false; $bcc = (isset($value['address'])) ? $value['address'] : $default; $bcc_name = (isset($value['name'])) ? $value['name'] : false; if ($mbcc !== false) { foreach ($mbcc as $name => $address) { $mail->addBBC($address, $name); } } elseif ($bbc_name === false) { $mail->addBCC($bcc); } else { $mail->addBCC($bcc, $bcc_name); } } else { $mail->addBCC($value); } break; case 'from': if (is_array($value)) { $from = (isset($value['address'])) ? $value['address'] : $default; $from_name = (isset($value['name'])) ? $value['name'] : false; if ($from_name === false) { $mail->setFrom($from); } else { $mail->setFrom($from, $from_name); } } else { $from = $value; $mail->setFrom($from); } break; case 'subject': $subject = $value; $mail->Subject = $subject; break; case 'email': case 'message': $message = $value; $mail->Body = $message; $mail->AltBody = strip_tags($message); break; case 'reply to': case 'reply': if (is_array($value)) { $mreply = (isset($value['addresses']) && is_array($value['addresses'])) ? $value['addresses'] : false; $reply = (isset($value['address'])) ? $value['address'] : $default; $reply_name = (isset($value['name'])) ? $value['name'] : false; if ($mreply !== false) { foreach ($mreply as $name => $address) { $mail->addReplyTo($address, $name); } } elseif ($reply_name === false) { $mail->addReplyTo($reply); } else { $mail->addReplyTo($reply, $reply_name); } } else { $mail->addReplyTo($value); } break; case 'bounce': case 'bounce address': case 'bounce backs': $bounce = $value; break; case 'attachment': case 'attach': if (is_array($value)) { $attachment = (isset($value['file'])) ? $value['file'] : $default; $file_name = (isset($value['name'])) ? $value['name'] : false; if ($file_name === false) { $mail->addAttachment($attachment); } else { $mail->addAttachment($attachment, $file_name); } } else { $mail->addAttachment($value); } break; case 'type': case 'content type': $content_type = $value; break; } } if (empty($to) || empty($from) || empty($subject) || empty($message)) { return false; } switch ($content_type) { case 'html': $mail->isHTML(true); // Set email format to HTML break; case 'text': default: $mail->isHTML(false); // Set email format to Plain Text break; } $settings = Reg::get('email'); if (isset($settings['send_emails']) && $settings['send_emails'] === false) { try { $log = Regy::get('di')->get_service('log', ['emails']); $log->write("To: {$to} Subject: {$subject} Message: {$message}"); } catch (Exception $e) { } return false; } if (isset($settings['host']) && !empty($settings['host'])) { if (isset($settings['smtp_debug'])) { $mail->SMTPDebug = $settings['smtp_debug']; // Enable verbose debug output } $mail->isSMTP(); // Set mailer to use SMTP $mail->Host = $settings['host']; // Specify main and backup SMTP servers $auth = ( isset($settings['username']) && !empty($settings['username']) && isset($settings['password']) && !empty($settings['password']) && (!isset($settings['auth']) || $settings['auth'] === true) ) ? true : false; // Enable SMTP authentication if ($auth === true) { $mail->SMTPAuth = true; $mail->Username = $settings['username']; // SMTP username $mail->Password = $settings['password']; // SMTP password $mail->SMTPSecure = (isset($settings['secure'])) ? $settings['secure'] : 'tls'; // Enable TLS encryption, `ssl` also accepted } $mail->Port = (isset($settings['port'])) ? $settings['port'] : 587; // TCP port to connect to } else { $mail->isMail(); // Use SendMail } if ($mail->send()) { return true; // Yes, it worked! } else { try { $log = Reg::get('di')->get_service('log', ['failed_emails']); $log->write('Mailer Error: ' . $mail->ErrorInfo); } catch (Exception $e) { } error_log('Mailer Error: ' . $mail->ErrorInfo); return false; } } }