CREATE TABLE message (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    msg TEXT NULL,
    subject VARCHAR(255) NULL,
    x_conet_src VARCHAR(255) NULL,
    in_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    sent TINYINT(1) NULL DEFAULT 0,
    from_descr VARCHAR(255) NULL,
    from_email VARCHAR(255) NULL,
    to_descr VARCHAR(255) NULL,
    to_email VARCHAR(255) NULL,
    reply_mail VARCHAR(255) NULL,
    sent_time TIMESTAMP NULL
);


DELIMITER //

CREATE TRIGGER update_sent_time
BEFORE UPDATE ON message
FOR EACH ROW
BEGIN
    IF NEW.sent <> OLD.sent THEN
        IF NEW.sent = TRUE THEN
            SET NEW.sent_time = CURRENT_TIMESTAMP;
        ELSE
            SET NEW.sent_time = NULL;
        END IF;
    END IF;
END;
//

DELIMITER ;

##########################################################################################

{
  "msg": "Hallo Welt",
  "subject": "Test",
  "x_conet_src": "app_42",
  "from_descr": "Max Mustermann",
  "from_email": "max@example.com",
  "to_descr": "Lisa Beispiel",
  "to_email": "lisa@example.com",
  "reply_mail": "antwort@example.com"
}

##########################################################################################
pip install requests
########################################################################################## send_message.py
import requests 
import json

url = "http://yourserver.com/api/message.php"  # ändere das auf deine URL

payload = {
    "msg": "Hallo Welt",
    "subject": "Test",
    "x_conet_src": "app_42",
    "from_descr": "Max Mustermann",
    "from_email": "max@example.com",
    "to_descr": "Lisa Beispiel",
    "to_email": "lisa@example.com",
    "reply_mail": "antwort@example.com"
}

headers = {"Content-Type": "application/json"}

response = requests.post(url, data=json.dumps(payload), headers=headers)

print(f"Status: {response.status_code}")
print(f"Antwort: {response.text}")

##########################################################################################
cpan LWP::UserAgent JSON
########################################################################################## send_message.pl
#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use JSON;

my $url = 'http://yourserver.com/api/message.php';  # anpassen!

my %data = (
    msg         => "Hallo Welt",
    subject     => "Test",
    x_conet_src => "app_42",
    from_descr  => "Max Mustermann",
    from_email  => "max@example.com",
    to_descr    => "Lisa Beispiel",
    to_email    => "lisa@example.com",
    reply_mail  => "antwort@example.com"
);

my $json = encode_json(\%data);

my $ua = LWP::UserAgent->new;
my $response = $ua->post(
    $url,
    'Content-Type' => 'application/json',
    Content        => $json
);

if ($response->is_success) {
    print "Antwort: " . $response->decoded_content . "\n";
} else {
    die "Fehler: " . $response->status_line;
}

########################################################################################## /var/www/html/api/message.php
<?php

// Ganz oben im PHP-Skript, vor allem anderen:
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json");

// DB-Zugangsdaten
$host = 'localhost';
$db   = 'deine_datenbank';
$user = 'dein_user';
$pass = 'dein_passwort';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

// Verbindung aufbauen
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(["error" => "Verbindung fehlgeschlagen: " . $e->getMessage()]);
    exit;
}

// JSON-Daten einlesen
$input = file_get_contents("php://input");
$data = json_decode($input, true);

// Pflichtfelder prüfen
$required = ['msg', 'subject', 'x_conet_src', 'from_descr', 'from_email', 'to_descr', 'to_email', 'reply_mail'];
foreach ($required as $field) {
    if (!isset($data[$field])) {
        http_response_code(400);
        echo json_encode(["error" => "Feld fehlt: $field"]);
        exit;
    }
}

// Einfügen
try {
    $sql = "INSERT INTO message (
                msg, subject, x_conet_src,
                from_descr, from_email,
                to_descr, to_email, reply_mail
            ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([
        $data['msg'],
        $data['subject'],
        $data['x_conet_src'],
        $data['from_descr'],
        $data['from_email'],
        $data['to_descr'],
        $data['to_email'],
        $data['reply_mail']
    ]);

    echo json_encode([
        "success" => true,
        "inserted_id" => $pdo->lastInsertId()
    ]);

} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(["error" => $e->getMessage()]);
}
?>
##########################################################################################  send_message.sh

#!/bin/bash

# URL des PHP-Servers
url="http://yourserver.com/api/message.php"

# JSON-Daten für den POST-Request
json_data=$(cat <<EOF
{
  "msg": "Hallo Welt",
  "subject": "Test",
  "x_conet_src": "app_42",
  "from_descr": "Max Mustermann",
  "from_email": "max@example.com",
  "to_descr": "Lisa Beispiel",
  "to_email": "lisa@example.com",
  "reply_mail": "antwort@example.com"
}
EOF
)

# Senden der POST-Anfrage mit curl
response=$(curl -s -X POST $url \
  -H "Content-Type: application/json" \
  -d "$json_data")

# Ausgabe der Antwort
echo "Antwort des Servers:"
echo "$response"

########################################################################################## /var/www/html/api/message.php

<?php
// DB-Zugangsdaten
$host = 'localhost';
$db   = 'deine_datenbank';
$user = 'dein_user';
$pass = 'dein_passwort';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];

// Verbindung aufbauen
try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    http_response_code(500);
    echo json_encode(["error" => "Verbindung fehlgeschlagen: " . $e->getMessage()]);
    exit;
}

// CORS und Content-Type für JSON-Response
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json");

// Methode prüfen (GET oder POST)
$method = $_SERVER['REQUEST_METHOD'];

if ($method == 'POST') {
    // JSON-Daten einlesen
    $input = file_get_contents("php://input");
    $data = json_decode($input, true);

    // Pflichtfelder prüfen
    $required = ['msg', 'subject', 'x_conet_src', 'from_descr', 'from_email', 'to_descr', 'to_email', 'reply_mail'];
    foreach ($required as $field) {
        if (!isset($data[$field])) {
            http_response_code(400);
            echo json_encode(["error" => "Feld fehlt: $field"]);
            exit;
        }
    }

    // Einfügen
    try {
        $sql = "INSERT INTO message (
                    msg, subject, x_conet_src,
                    from_descr, from_email,
                    to_descr, to_email, reply_mail
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
        $stmt = $pdo->prepare($sql);
        $stmt->execute([
            $data['msg'],
            $data['subject'],
            $data['x_conet_src'],
            $data['from_descr'],
            $data['from_email'],
            $data['to_descr'],
            $data['to_email'],
            $data['reply_mail']
        ]);

        echo json_encode([
            "success" => true,
            "inserted_id" => $pdo->lastInsertId()
        ]);

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(["error" => $e->getMessage()]);
    }
    
} elseif ($method == 'GET') {
    // Alle Nachrichten abfragen
    try {
        $stmt = $pdo->query("SELECT * FROM message");
        $messages = $stmt->fetchAll();

        echo json_encode([
            "success" => true,
            "messages" => $messages
        ]);

    } catch (PDOException $e) {
        http_response_code(500);
        echo json_encode(["error" => $e->getMessage()]);
    }

} else {
    // Nicht unterstützte HTTP-Methode
    http_response_code(405);
    echo json_encode(["error" => "Methode nicht erlaubt."]);
}
?>

########################################################################################## send_pending_messages.pl
#!/usr/bin/perl

#!/usr/bin/perl

use strict;
use warnings;
use DBI;
use Mail::Sender;

# Datenbankverbindung
my $dsn = "DBI:mysql:deine_datenbank:localhost";
my $user = "dein_user";
my $pass = "dein_passwort";
my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 1, AutoCommit => 1 })
    or die "Verbindung zur Datenbank fehlgeschlagen: $DBI::errstr";

# Nachrichten mit sent = 0 abfragen
my $sth = $dbh->prepare("SELECT * FROM message WHERE sent = 0");
$sth->execute();

# SMTP-Konfiguration
my $smtp_server = 'smtp.example.com';
my $default_from = 'noreply@example.com';

while (my $row = $sth->fetchrow_hashref) {
    my $to      = $row->{to_email};
    my $subject = $row->{subject};
    my $body    = $row->{msg};
    my $from    = $row->{from_email} || $default_from;
    my $reply   = $row->{reply_mail};
    my $x_src   = $row->{x_conet_src} || 'undefined';

    # E-Mail senden
    my $sender = Mail::Sender->new({
        smtp => $smtp_server,
        from => $from,
    });

    my $result = $sender->MailMsg({
        to      => $to,
        subject => $subject,
        msg     => $body,
        headers => {
            'Reply-To'     => $reply,
            'X-Conet-Src'  => $x_src,
        }
    });

    if ($result) {
        print "E-Mail an $to gesendet.\n";
        $dbh->do("UPDATE message SET sent = 1 WHERE id = ?", undef, $row->{id});
    } else {
        print "Fehler beim Senden der E-Mail an $to.\n";
    }
}

$sth->finish();
$dbh->disconnect();

########################################################################################## send_pending_messages.php

<?php
$host = 'localhost';
$db   = 'deine_datenbank';
$user = 'dein_user';
$pass = 'dein_passwort';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    echo "Verbindung fehlgeschlagen: " . $e->getMessage();
    exit;
}

$sql = "SELECT * FROM message WHERE sent = 0";
$stmt = $pdo->query($sql);
$messages = $stmt->fetchAll();

foreach ($messages as $message) {
    $to = $message['to_email'];
    $subject = $message['subject'];
    $body = $message['msg'];
    $from = $message['from_email'];
    $reply = $message['reply_mail'];
    $x_src = $message['x_conet_src'] ?? 'undefined';

    $headers = "From: $from\r\n";
    $headers .= "Reply-To: $reply\r\n";
    $headers .= "X-Conet-Src: $x_src\r\n";
    $headers .= "Content-Type: text/plain; charset=UTF-8\r\n";

    if (mail($to, $subject, $body, $headers)) {
        $update = $pdo->prepare("UPDATE message SET sent = 1 WHERE id = ?");
        $update->execute([$message['id']]);
        echo "E-Mail an $to gesendet.\n";
    } else {
        echo "Fehler beim Senden der E-Mail an $to.\n";
    }
}



########################################################################################## check_and_send_emails.sh

#!/bin/bash

# PHP-Skript ausführen
php /path/to/send_pending_messages.php


########################################################################################## /etc/systemd/system/email_sender.service
[Unit]
Description=Send Pending Emails

[Service]
ExecStart=/path/to/check_and_send_emails.sh
User=www-data
Group=www-data
Environment=PATH=/usr/bin:/usr/local/bin
WorkingDirectory=/path/to/directory

[Install]
WantedBy=multi-user.target

########################################################################################## /etc/systemd/system/email_sender.timer
[Unit]
Description=Run Email Sender every 5 minutes

[Timer]
OnUnitActiveSec=5min
Unit=email_sender.service

[Install]
WantedBy=timers.target

##########################################################################################
sudo systemctl daemon-reload
sudo systemctl enable email_sender.service
sudo systemctl enable email_sender.timer

sudo systemctl start email_sender.timer

sudo systemctl status email_sender.timer
sudo journalctl -u email_sender.service

########################################################################################## GET-Anfrage zum Abrufen aller Nachrichten
curl -X GET http://yourserver.com/api/message.php






########################################################################################## view_messages.php
<?php
// DB-Zugangsdaten
$host = 'localhost';
$db   = 'deine_datenbank';
$user = 'dein_user';
$pass = 'dein_passwort';
$charset = 'utf8mb4';

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];

try {
    $pdo = new PDO($dsn, $user, $pass, $options);
} catch (PDOException $e) {
    die("Datenbankverbindung fehlgeschlagen: " . $e->getMessage());
}

// Filter/Suchparameter
$search = $_GET['search'] ?? '';
$sent = isset($_GET['sent']) ? (int) $_GET['sent'] : null;
$sort = in_array($_GET['sort'] ?? '', ['id', 'subject', 'in_time', 'sent']) ? $_GET['sort'] : 'in_time';
$order = ($_GET['order'] ?? '') === 'asc' ? 'ASC' : 'DESC';

// SQL-Query dynamisch bauen
$sql = "SELECT * FROM message WHERE 1";
$params = [];

if (in_array($range, ['7', '30', '180'])) {
    $sql .= " AND in_time >= DATE_SUB(NOW(), INTERVAL :range DAY)";
    $params['range'] = (int)$range;
}


if ($search !== '') {
    $sql .= " AND (subject LIKE :search OR msg LIKE :search OR from_email LIKE :search)";
    $params['search'] = "%$search%";
}

if ($sent !== null && in_array($sent, [0, 1])) {
    $sql .= " AND sent = :sent";
    $params['sent'] = $sent;
}

$sql .= " ORDER BY $sort $order";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$messages = $stmt->fetchAll();
?>

<!DOCTYPE html>
<html lang="de">
<head>
    <meta charset="UTF-8">
    <title>Nachrichtenübersicht</title>
    <style>
        body { font-family: sans-serif; margin: 2em; }
        table { border-collapse: collapse; width: 100%; }
        th, td { padding: 0.5em; border: 1px solid #ccc; text-align: left; }
        th a { text-decoration: none; color: #000; }
    </style>
</head>
<body>

<h1>Nachrichtenübersicht</h1>

<form method="get" style="margin-bottom: 1em;">
    <input type="text" name="search" placeholder="Suche..." value="<?= htmlspecialchars($search) ?>">
    <select name="sent">
        <option value="">-- gesendet? --</option>
        <option value="0" <?= $sent === 0 ? 'selected' : '' ?>>nicht gesendet</option>
        <option value="1" <?= $sent === 1 ? 'selected' : '' ?>>gesendet</option>
    </select>
    <select name="range">
        <option value="">Alle</option>
        <option value="7" <?= $range === '7' ? 'selected' : '' ?>>Letzte 7 Tage</option>
        <option value="30" <?= $range === '30' ? 'selected' : '' ?>>Letzte 30 Tage</option>
        <option value="180" <?= $range === '180' ? 'selected' : '' ?>>Letzte 180 Tage</option>
    </select>
    <button type="submit">Filtern</button>
</form>

<table>
    <thead>
        <tr>
            <?php
            $cols = ['id' => 'ID', 'subject' => 'Betreff', 'in_time' => 'Eingang', 'sent' => 'Gesendet'];
            foreach ($cols as $key => $label):
                $next_order = ($sort === $key && $order === 'ASC') ? 'desc' : 'asc';
                $link = "?search=" . urlencode($search) . "&sent=" . urlencode($sent ?? '') . "&sort=$key&order=$next_order";
                echo "<th><a href=\"$link\">$label</a></th>";
            endforeach;
            ?>
            <th>Von</th>
            <th>An</th>
            <th>X-Conet-Src</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($messages as $msg): ?>
            <tr>
                <td><?= htmlspecialchars($msg['id']) ?></td>
                <td><?= htmlspecialchars($msg['subject']) ?></td>
                <td><?= htmlspecialchars($msg['in_time']) ?></td>
                <td><?= $msg['sent'] ? '✅' : '❌' ?></td>
                <td><?= htmlspecialchars($msg['from_email']) ?></td>
                <td><?= htmlspecialchars($msg['to_email']) ?></td>
                <td><?= htmlspecialchars($msg['x_conet_src']) ?></td>
            </tr>
        <?php endforeach; ?>
    </tbody>
</table>

</body>
</html>
