594 lines
16 KiB
Plaintext
594 lines
16 KiB
Plaintext
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>
|