PHP 8.4+ Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

239 lines
7.6 KiB

<?php
declare(strict_types=1);
/**
* @author Robert Strutts
* @copyright Copyright (c) 2022, Robert Strutts.
* @license MIT
*/
namespace CodeHydrater\services;
use CodeHydrater\bootstrap\registry as Reg;
class emailer {
/**
* Send an Email.
* to=>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;
}
}
}