Files
scripts/json_msg_2_mail/complete

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>