136 lines
4.3 KiB
PHP
136 lines
4.3 KiB
PHP
<?php
|
|
// import PHPMailer classes into the global namespace
|
|
use PHPMailer\PHPMailer\PHPMailer;
|
|
use PHPMailer\PHPMailer\SMTP;
|
|
use PHPMailer\PHPMailer\Exception;
|
|
|
|
$dname = dirname(__FILE__);
|
|
require $dname . '/Exception.php';
|
|
require $dname . '/PHPMailer.php';
|
|
require $dname . '/SMTP.php';
|
|
|
|
// general constants
|
|
$general = [
|
|
// site domain (used for building confirmation links)
|
|
/* 'domain' => 'tobias-radloff.de', */
|
|
'domain' => 'localhost',
|
|
// string concatenated with email address to create a non-recreatable md5 hash
|
|
'uniqueKey' => '***REMOVED***', // works like password salt
|
|
// file name of confirm script
|
|
'confirmScript' => '/confirm.php',
|
|
// status code to be used when redirection to success or error page
|
|
'statusCode' => 'HTTP/1.1 303 See Other',
|
|
// array of SQL statements used
|
|
'sql' => [
|
|
'create_table' => 'CREATE TABLE IF NOT EXISTS subscribers (id INTEGER PRIMARY KEY, email TEXT NOT NULL UNIQUE, name TEXT);',
|
|
'create_record' => 'INSERT INTO subscribers(email, name) VALUES(:e, :n);',
|
|
'read_record' => 'SELECT 1 FROM subscribers WHERE email = :e;',
|
|
'update_record' => '',
|
|
'delete_record' => 'DELETE FROM subscribers WHERE email = :e;'
|
|
]
|
|
];
|
|
// complete site URL
|
|
$general['siteURL'] = 'https://' . $general['domain'];
|
|
|
|
// SMTP server information
|
|
$smtp = [
|
|
'host' => '***REMOVED***
|
|
'port' => 587,
|
|
'username' => 'tobias',
|
|
'password' => '***REMOVED***',
|
|
'auth' => TRUE,
|
|
'fromAddress' => '***REMOVED***', // 'newsletter@tobias-radloff.de'
|
|
'fromName' => 'Tobias Radloffs Newsletter',
|
|
];
|
|
|
|
// body of confirmation email
|
|
$bodyConfirmation = [
|
|
'Hallo!',
|
|
'Bitte bestätige die Anmeldung für meinen Newsletter, indem du auf den folgenden Link klickst:',
|
|
'%Placeholder%',
|
|
'Bis bald und viele Grüße, Tobias'
|
|
];
|
|
|
|
// contents of confirmation email
|
|
$mailConfirmation = [
|
|
'subject' => 'Newsletter-Anmeldung bestaetigen',
|
|
'bodyHTML' => '<p>' . implode('</p><p>', $bodyConfirmation) . '</p>',
|
|
'bodyText' => implode("\n\n", $bodyConfirmation)
|
|
];
|
|
|
|
// database information
|
|
$db = [
|
|
'sqlite' => [
|
|
'dsn' => 'sqlite:../newsletter.sqlite',
|
|
],
|
|
'mysql' => [
|
|
'dsn' => '',
|
|
'host' => '',
|
|
'port' => '',
|
|
'username' => '',
|
|
'password' => ''
|
|
]
|
|
];
|
|
|
|
function GetConfirmationHash($confEmail) {
|
|
global $general;
|
|
return md5($confEmail . $general['uniqueKey'] );
|
|
}
|
|
|
|
// connects to database and returns PDO object
|
|
function getPDO($dbType = 'sqlite') {
|
|
global $db;
|
|
return new \PDO($db[$dbType]['dsn']);
|
|
}
|
|
|
|
// Sends an email to single recipient with subject and body specified in an array. Returns an error message on failure, TRUE on success.
|
|
function SendEmail($recipientAddress, $mailContents, $link = NULL) {
|
|
global $general, $smtp;
|
|
|
|
$mail = new PHPMailer(true);
|
|
|
|
try {
|
|
//Server settings
|
|
// $mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output
|
|
$mail->isSMTP();
|
|
$mail->Host = $smtp["host"];
|
|
$mail->SMTPAuth = $smtp["auth"];
|
|
$mail->Username = $smtp["username"];
|
|
$mail->Password = $smtp["password"];
|
|
//$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
|
|
$mail->Port = $smtp["port"]; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
|
|
|
|
//Recipients
|
|
$mail->setFrom($smtp["fromAddress"], $smtp["fromName"]);
|
|
$mail->addAddress($recipientAddress); //Add a recipient
|
|
|
|
//Content
|
|
if (isset($link)) {
|
|
$mailContents["bodyHTML"] = str_replace("%Placeholder%", $link, $mailContents["bodyHTML"]);
|
|
$mailContents["bodyText"] = str_replace("%Placeholder%", $link, $mailContents["bodyText"]);
|
|
}
|
|
$mail->CharSet = "UTF-8";
|
|
$mail->isHTML(true);
|
|
$mail->Subject = $mailContents["subject"];
|
|
$mail->Body = $mailContents["bodyHTML"];
|
|
$mail->AltBody = $mailContents["bodyText"];
|
|
|
|
$mail->send();
|
|
return TRUE;
|
|
} catch (Exception $e) {
|
|
error_log("Message error: {$e}");
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// redirects to specified URL via GET request and conveys an optional message
|
|
function GracefulExit($location, $message = NULL) {
|
|
global $general;
|
|
header($general['statusCode']);
|
|
if (isset($message)) {
|
|
$location .= "?" . http_build_query(['msg' => $message]);
|
|
error_log($location);
|
|
}
|
|
header("Location: {$location}");
|
|
}
|
|
?>
|