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
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
|