Rev 72 | Rev 74 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
include_once ($_SERVER['DOCUMENT_ROOT'] . '/php/dnsexit.php');
include_once ($_SERVER['DOCUMENT_ROOT'] . '/php/sessions_db.php');
include_once ($_SERVER['DOCUMENT_ROOT'] . '/php/cryptor.php');
include_once ($_SERVER['DOCUMENT_ROOT'] . "/php/vendors.php");
include_once ($_SERVER['DOCUMENT_ROOT'] . '/php/tools.php');
$configFile = parse_ini_file($_SERVER['DOCUMENT_ROOT'] . FCM_CONFIGFILE, true);
$crypt = Cryptor::getInstance($configFile['cryptor']);
$tmpSessionTab = (isset($_POST["sessionTab"]) && $_POST["sessionTab"] > 0 ? $_POST["sessionTab"] : null);
$handler = MySessionHandler::getInstance($tmpSessionTab, $configFile['mysqli']);
$vendors = Vendors::getInstance();
$vendors->setVendor($configFile['ebay'], Vendors::EBAY);
$vendors->setVendor($configFile['discogs'], Vendors::DISCOGS);
$vendors->setVendor($configFile['linkshare'], Vendors::LINKSHARE);
$vendors->setVendor($configFile['cjaffiliate'], Vendors::CJAFFILIATE);
$vendors->setVendor($configFile['walmart'], Vendors::WALMART);
$vendors->setVendor($configFile['itunes'], Vendors::ITUNES);
$loginConfig = $configFile['login'];
unset($configFile);
ini_set("session.cookie_httponly", 1);
ini_set("session.cookie_secure", 1);
session_set_save_handler($handler, true);
if (!empty($_COOKIE['PHPSESSID'])) {
session_id($_COOKIE['PHPSESSID']);
}
@session_start();
initSessionVariables();
$sent = processWishlist();
// bugbug logfile
exit (0);
function processWishlist() {
global $wlFreqHoursArr;
$lastUid = -1;
$lastCount = 0;
$totalSent = 0;
$str = '';
$toc = '';
$conn = MySessionHandler::getDBSessionId();
$sql = "SELECT id, uid, barcode, title, artist, cond, format, currency, price, checked
FROM wishlist
WHERE price > 0.00
ORDER BY uid";
if ($result = mysqli_query($conn, $sql)) {
if (mysqli_num_rows($result) > 0) {
while ($wl = mysqli_fetch_assoc($result)) {
if ($lastUid != $wl['uid']) {
if ($lastUid != '-1' && $lastCount > 0) {
updateUserCheckedDate($user['id']);
++$totalSent;
emailWishlistResults($user, $str, $toc);
$str = '';
$toc = '';
}
$user = getUser($wl['uid']);
$_SESSION['buyer']['Zip'] = $user['zip'];
$lastCount = 0;
}
$lastUid = $wl['uid'];
$diff = time() - $user['wlChecked'];
if ($diff > $wlFreqHoursArr[$user['wlFreq']]) {
if (!empty($wl['barcode'])) {
$_SESSION['barcode']['Type'] = clsLibGTIN::GTINCheck($wl['barcode'], false, 1);
$_SESSION['barcode']['Value'] = clsLibGTIN::GTINCheck($wl['barcode']);
} else {
$_SESSION['barcode']['Type'] = '';
$_SESSION['barcode']['Value'] = '';
}
$arr = searchAll($wl['artist'] . " " . $wl['title'], true);
$arr = filterWishlistResults($arr, $wl);
updateWishlistCheckedDate($wl['id']);
if (!empty($arr)) {
++$lastCount;
list($a, $b) = formatResults($arr, $wl, $lastCount);
$str .= $a;
$toc .= $b;
}
}
}
if ($lastCount > 0) {
updateUserCheckedDate($user['id']);
++$totalSent;
emailWishlistResults($user, $str, $toc);
}
}
}
else if (mysqli_errno($conn)) {
error_log("MySQL Read Wishlist SQL: " . $sql);
error_log("MySQL Read Wishlist Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
}
return $totalSent;
}
function filterWishlistResults($arr, $wl) {
foreach ($arr as $key => $row) {
if ($wl['cond'] != 'Any' && $row["Condition"] != $wl['cond']) {
unset($arr[$key]);
}
if ($wl['format'] != 'Any' && $row["MediaType"] != $wl['format']) {
unset($arr[$key]);
}
if ($row["ConvertedTotalPrice"] > $wl['price']) {
unset($arr[$key]);
}
}
return $arr;
}
function formatResults($arr, $wl, $cnt) {
global $mediaTypeTextArr;
global $mediaTypeImageArr;
$str = '';
$toc = '';
$str .= "<h3 id=\"jump_" . $cnt . "\">" . $cnt . ") " . $wl["artist"] . " - " . $wl["title"] . "</h3>";
$str .= "<p>Condition: " . $wl["cond"] . " | Format: " . $wl["format"] . " | Price Cap: " . print_monetary($wl["price"], $wl["currency"]) . "</p>";
$str .= "<table style=\"width: 100%; margin-bottom: 1rem;border-collapse: collapse; font-size: 80%; border: 1px solid #dee2e6 !important;\">";
$str .= "<thead style=\"background-color:black;color:white;\"><tr><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">Image</th><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">Title / Merchant</th><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">Condition</th><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">Price</th><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">S/H</th><th style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">Total</th></tr></thead>";
$str .= "<tbody>";
$toc .= "<li><a href=\"#jump_" . $cnt . "\">" . $wl["artist"] . " - " . $wl["title"] . "</a> <span style=\"display: inline-block;padding: 0.25em 0.4em;font-size: 75%;font-weight: 700;line-height: 1;text-align: center;white-space: nowrap;vertical-align: baseline;border-radius: 0.25rem;color: #fff;background-color: #343a40;\">" . count($arr) . "</span></li>";
foreach ($arr as $key => $row) {
$href = "href=\"" . $row["URL"] . "\" target=\"_blank\" onclick=\"saveTransfer('" . $row["URL"] . "'); return true;\"";
$title = $row["Title"];
if (mb_strlen($row["Title"], 'UTF-8') > MAXTITLELENGTH) {
$title = mb_substr($row["Title"], 0, MAXTITLELENGTH, 'UTF-8') . '...';
}
$str .= "<tr>";
// Image
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6\"><a " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\"><img style=\"width:100%;max-width: 200px;height: auto;\" src=\"" . $row["Image"] . "\" alt=\"Item Image\"></a></td>";
// Title / Merchant
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\"><span style=\"font-weight: 700 !important;\"><a " . $href . " data-toggle=\"tooltip\" title=\"Buy It Now\">" . $title . "</a></span>";
$str .= "<br/><br/>";
$str .= "<span style=\"font-weight: 700 !important;\">" . $row["Merchant"] . "</span>";
if ($row["FeedbackScore"] != - 1) {
$str .= "<span><br/>" . $row["SellerName"] . " (" . number_format($row["FeedbackScore"], 0, "", ",") . " / " . $row["FeedbackPercent"] . "%)</span>";
}
else if (!empty($row["SellerName"])) {
$str .= "<span><br/>" . $row["SellerName"] . "</span>";
}
if (!empty($row["TimeLeft"])) {
$str .= "<br>" . $row["TimeLeft"];
}
$str .= "</td>";
// Condition
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left\">";
$mediaTypeImage = $mediaTypeImageArr[$row["MediaType"]] . '.svg';
$altText = $mediaTypeTextArr[$row["MediaType"]];
$str .= "<span style=\"font-weight: 700 !important;\">" . $row["DetailCondition"] . "</span>";
$str .= "<br/><br/>";
$str .= "<img style=\"max-width:2em\" src=\"https://" . $_SERVER["SERVER_NAME"] . "/images/" . $mediaTypeImage . "\" alt=\"" . $altText . "\">";
$str .= "</td>";
// Price
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">" . print_monetary($row["Price"], $row["Currency"]);
if ($row["Currency"] != $_SESSION["buyer"]["Currency"]) {
$str .= "<br/>≈ " . print_monetary($row["ConvertedPrice"], $_SESSION["buyer"]["Currency"]);
}
if ($row["BestOffer"] == "true") {
$str .= "<br>Best Offer Accepted";
}
$str .= "</td>";
// Shipping and Handling Cost
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;\">";
if ($row["ShippingCost"] == 0.00) {
$str .= "Free Shipping";
}
else {
$str .= print_monetary($row["ShippingCost"], $row["ShippingCurrency"]);
}
if ($row["ShippingCost"] > 0.00 && $row["ShippingCurrency"] != $_SESSION["buyer"]["Currency"]) {
$str .= "<br/>≈ " . print_monetary($row["ConvertedShippingCost"], $_SESSION["buyer"]["Currency"]);
}
if ($row["HandlingTime"] > 0) {
$str .= "<br>Handling Time " . $row["HandlingTime"] . " day" . ($row["HandlingTime"] > 1 ? "s" : "");
}
if ($row["ShippingCost"] > 0.00 && $row["FreeShippingCap"] > 0) {
$str .= "<br>Free Shipping over " . print_monetary($row["FreeShippingCap"], $_SESSION["buyer"]["Currency"]);
}
$str .= "<br/><img style=\"max-width: 100%;height: auto;\" title=\"Ships from " . getCountry($row["Country"]) . "\" data-toggle=\"tooltip\" data-placement=\"right\" data-delay=\"200\" src=\"https://" . $_SERVER["SERVER_NAME"] . "/images/flags/" . $row["Country"] . ".png\" alt=\"" . getCountry($row["Country"]) . " Flag\"></td>";
// Total Price
$str .= "<td style=\"padding: 0.75rem;vertical-align: top;border-top: 1px solid #dee2e6;text-align: left !important;font-weight: 700 !important;\">" . print_monetary($row["ConvertedTotalPrice"], $_SESSION["buyer"]["Currency"]) . "</td>";
$str .= "</tr>";
}
$str .= "</tbody>";
$str .= "</table>";
$str .= "<a style=\"text-decoration: none\" href=\"#toc\">↑</a>";
return array($str, $toc);
}
function updateWishlistCheckedDate($id) {
$nul = 'NULL';
$conn = MySessionHandler::getDBSessionId();
$checked = mysqli_real_escape_string($conn, time());
$sql = "UPDATE wishlist
SET checked = '$checked'
WHERE id = '$id'";
if ($result = mysqli_query($conn, $sql)) {
return 0;
}
else {
error_log("MySQL Update Wishlist SQL: " . $sql);
error_log("MySQL Update Wishlist Error: " . mysqli_error($conn) . " (" . $error . ")");
return -1;
}
return -1;
}
function getUser($uid) {
$conn = MySessionHandler::getDBSessionId();
$sql = "SELECT id, first_name, last_name, email, zip, wlEmailFlag, wlFreq, wlChecked
FROM users
WHERE id = '$uid'";
if ($result = mysqli_query($conn, $sql)) {
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
return $row;
}
}
else if (mysqli_errno($conn)) {
error_log("MySQL Read Users SQL: " . $sql);
error_log("MySQL Read Users Error: " . mysqli_error($conn) . " (" . mysqli_errno($conn) . ")");
}
return [];
}
function updateUserCheckedDate($uid) {
$nul = 'NULL';
$conn = MySessionHandler::getDBSessionId();
$checked = mysqli_real_escape_string($conn, time());
$sql = "UPDATE users
SET wlChecked = '$checked'
WHERE id = '$uid'";
if ($result = mysqli_query($conn, $sql)) {
return 0;
}
else {
error_log("MySQL Update Users SQL: " . $sql);
error_log("MySQL Update Users Error: " . mysqli_error($conn) . " (" . $error . ")");
return -1;
}
return -1;
}
function PHPMailer_Init() {
// Include PHPMailer library files
require_once 'login/includes/PHPMailer/Exception.php';
require_once 'login/includes/PHPMailer/PHPMailer.php';
require_once 'login/includes/PHPMailer/SMTP.php';
$mail = new PHPMailer;
return $mail;
}
function emailWishlistResults($user, $emailBody, $toc) {
global $loginConfig;
global $wlFreqArr;
$to = trim($user["email"]);
$unsubscribeUrl = "https://" . $_SERVER["SERVER_NAME"] . "/index.php?submit=unsubscribe&id=" . $user["id"] . "&email=" . $to;
$subject = "Wishlist Price Checks | " . $loginConfig['SITE_NAME'];
$mailContent = '<html>
<head>
<title>Find Cheap Music Wishlist Price Checks</title>
</head>
<body>
<table style="width:100%;border-style: none;border-radius:6px;background-color:#ffffff;padding-top:15px;border-collapse:separate">
<tbody>
<tr>
<td style="color:#616471;font-weight:400;text-align:left;line-height:190%;padding-top:15px;padding-right:40px;padding-bottom:30px;padding-left:40px;font-size:15px">
<h1 style="font-weight:500;font-size:22px;letter-spacing:-1px;line-height:115%;margin:18px 0 0;padding:0;text-align:left;color:#3c7bb6">Wishlist Price Checks</h1>
<br>
Hi ' . $user["first_name"] . ',<br>This is your ' . strtolower($wlFreqArr[$user["wlFreq"]]) . ' wishlist price check email from <a href="https://' . $_SERVER["SERVER_NAME"] . '/index.php">Find Cheap Music</a>. Below you will find all listings that match the criteria set up at your wishlist.
<hr><span id="toc">Table of Contents:</span><ol>' . $toc . '</ol><hr>' . $emailBody
. '<p style="text-align:right;">Prices retrieved on ' . gmdate("Y-m-d H:i") . ' UTC. Daily exchange rates update.</p><br>
<br>We look forward to serving you,<br><strong>' . $loginConfig['SITE_NAME'] . ' Team</strong>
<br><p style="font-style: italic;font-weight: 300;">You subscribed to this periodic email with email address ' . $to . '. Click <a href="' . $unsubscribeUrl . '">here</a> to unsubscribe from further emails. You can reinstate the emails at any time by setting the option \'Email Price Checks\' for your account at <a href="https://' . $_SERVER["SERVER_NAME"] . '/index.php">Find Cheap Music</a> back to \'Yes\'.</p>
</td>
</tr>
</tbody>
</table>
</body>
</html>';
$mailContentText = "This email contains the periodic price checks for your wishlist in HTML fornmat.\r\n\r\n";
$mailContentText .= "\r\nWe look forward to serving you,\r\n" . $loginConfig['SITE_NAME'] . " Team";
if ($loginConfig['SMTP'] == true) {
$mail = PHPMailer_Init();
// SMTP configuration
$mail->isSMTP();
$mail->CharSet = "text/html; charset=UTF-8;";
$mail->WordWrap = 80;
$mail->Host = $loginConfig['SMTP_HOST'];
$mail->SMTPAuth = true;
$mail->Username = $loginConfig['SMTP_USERNAME'];
$mail->Password = $loginConfig['SMTP_PASSWORD'];
$mail->SMTPSecure = $loginConfig['SMTP_SECURE'];
$mail->Port = $loginConfig['SMTP_PORT'];
$mail->addCustomHeader("List-Unsubscribe-Post", "List-Unsubscribe=One-Click");
$mail->addCustomHeader("List-Unsubscribe", "<" . $unsubscribeUrl . ">");
$mail->setFrom($loginConfig['SENDER_EMAIL'], $loginConfig['SENDER_NAME']);
$mail->addAddress($to);
$mail->Subject = $subject;
$mail->isHTML(true);
$mail->Body = $mailContent;
$mail->AltBody = $mailContentText;
$mail->DKIM_domain = $loginConfig['DKIM_DOMAIN'];
$mail->DKIM_private = $_SERVER['DOCUMENT_ROOT'] . $loginConfig['DKIM_PRIVATE'];
$mail->DKIM_selector = $loginConfig['DKIM_SELECTOR'];
$mail->DKIM_passphrase = $loginConfig['DKIM_PASSPHRASE'];
$mail->DKIM_identity = $mail->From;
$mail->DKIM_copyHeaderFields = false;
$mail->DKIM_extraHeaders = ['List-Unsubscribe', 'List-Help'];
//$mail->SMTPDebug = 2; // bugbug
// Send email
if (!$mail->send()) {
error_log('Mailer error: ' . $mail->ErrorInfo);
}
}
else {
//set content-type header for sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
//additional headers
$headers .= 'From: ' . $loginConfig['SENDER_NAME'] . '<' . $loginConfig['SENDER_EMAIL'] . '>' . "\r\n";
//send email
mail($to, $subject, $mailContent, $headers);
}
}