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 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 < 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 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 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(); ?> Nachrichtenübersicht

Nachrichtenübersicht

'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 ""; endforeach; ?>
$labelVon An X-Conet-Src