From f961d1141aa02dfebf978d1cfaeb6857c7f475c5 Mon Sep 17 00:00:00 2001 From: andre Date: Fri, 9 May 2025 15:11:03 +0200 Subject: [PATCH] =?UTF-8?q?json=5Fmsg=5F2=5Fmail/complete=20hinzugef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- json_msg_2_mail/complete | 593 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 593 insertions(+) create mode 100644 json_msg_2_mail/complete diff --git a/json_msg_2_mail/complete b/json_msg_2_mail/complete new file mode 100644 index 0000000..8ebd931 --- /dev/null +++ b/json_msg_2_mail/complete @@ -0,0 +1,593 @@ +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; + ?> + + + + + + + + + + + + + + + + + + +
$labelVonAnX-Conet-Src
+ + +