HTTP2SMTP

Natürlich gibt es mit "Smart Home", Tuya und anderen Cloud-Diensten schon fertige Lösungen, bei denen Temperatursensoren u.a. Dienste einfach per App gesteuert und ausgewertet werden können. Aber was mache ich, wenn ich per HTTP-Webhook einfach eine Mail senden will?  So ein kleiner ESP32/ESP8266 kann zwar auch theoretisch eine Mail senden, aber die meisten Spamfilter wehren solche Mails ab und zudem müsste ich auf jedem Sensor die Daten parametrisieren.

Da ist ein HTTP-GET/POST doch viel einfacher. Ich brauche nur einen Webserver im Internet betreiben, der etwas PHP erlaubt um mir eine Mail zuzusenden. Das ist zwar keine richtige Datenerfassung. Dafür wäre dann eine Webschnittstelle zu einer TimeSeriesDatabase wie Influx o.ä. geeigneter aber damit ein Schaltkontakt z.B. eine Heizungsstörung meldet, ist mir eine Mail in mein primäres Postfach sogar lieber.

PHP-Skript

Ich bin sicher nicht der PHP-Powerprogrammierer und lesen fällt mir leichter als schreiben, aber die paar Zeilen sind so einfach, dass Sie die sicher auch ohne Beschreibung verstehen. Es ist einfach eine PHP-Seite, die Parameter aus der URL übernimmt und in der Antwort als Tabelle einer HTML-Seite wiederspiegelt und als reine Text-Mails an die hinterlegten Empfänger sendet. Den Versand der Mails übernimmt also der Webserver mit seiner statischen IP-Adresse und kann entsprechend auch per SPF/DKIM behandelt werden

<?php
// Header setzen
header_remove();
http_response_code(200);
header("Cache-Control: no-transform,public,max-age=300,s-maxage=900");
header('Content-Type: application/json');
header('Status: 200');
?>

<html>
<body>
<h1>HTTP2SMTP</h1>
<p>I found the following Parameters:</p>
<table>
   <tr><th>Parameter</th><th>Value</th></tr>
<?php
$msg = '';
foreach ($_GET as $getParam => $value) {
   echo '   <tr><td>' . $getParam . '</td><td>' . $value . '</td></tr>' . PHP_EOL;
   $msg = $msg . $getParam . '=' .  $value . PHP_EOL;
}
foreach ($_POST as $getParam => $value) {
   echo '   <tr><td>' . $getParam . '</td><td>' . $value . '</td></tr>' . PHP_EOL;
   $msg = $msg . $getParam . '=' .  $value . PHP_EOL;
}
?>				
</table>
<p>Ende der Verarbeitung</p>
<?php

if ($_GET['secret'] == 'supergeheimsecret') {
   $msg = "Parameter:" . PHP_EOL . $msg;
   $msg = wordwrap($msg,70);
   mail("http2smtp@carius.de","HTTP2SMTP",$msg);
   mail("http2smtp@msfaq.de","HTTP2SMTP",$msg);
   echo '<p>Mail Send</p>';
}
else {
   echo '<p>No Mail Send</p>';
}
?>

</body>
</html>

Diese PHP-Seite muss ich einfach auf einen Webserver meiner Wahl hochladen. Ich habe das Skript tatsächlich auch einige Zeit lang auf der msxfaq.de gehostet. Damit war der Aufruf per HTTPS verschlüssel möglich und wenn ich den Pfad und Dateiname niemandem verrate und auch das "secret" für mich behalte, dann ist das Risiko minimal. Durch die statische Vorgabe der Empfänger könnte ein Missbrauch oder Amok laufender Sensor nur mein Postfach fluten und das würde ich schnell merken und das Skript außer Kraft setzen.

Achtung: Das Skript hat kein Throttling o.ä. Wer also die URL und das "Secret" kennt, kann ihr Postfach zuspammen.

Test mit PowerShell

Natürlich muss ich mein Skript auch testen und das geht dann einfach per PowerShell und Invoke-Webrequest.

(Invoke-WebRequest "https://www.msxfaq.de/testseitefuerhttp2smtp.php?test=123&secret=supergeheim").content

Auf der Konsole sehe ich die HTML-Rückgabe mit dem Parameters, wobei auch das Secret ein Parameter ist.

Wem die Sicherheit eines HTTP-GET über HTTPS nicht ausreicht, kann immer noch ein HTTP-POST machen. Dann muss das Skript aber etwas angepasst werden. Der GET ist aber in Verbindung mit IOT-Geräten häufiger zu finden. Wobei die Sicherheit ohne HTTPS natürlich nur eingeschränkt ist. Da könnte ein POST gefühlt erst einmal besser sein, weil die Parameter nicht im Request, und damit auch nicht im Webserverlog, erscheinen. Aber "sicherer" ist es nur bedingt, denn ohne Verschlüsselung kann ich natürlich auch den POST-Request einfach mitschneiden. Der Post könnte aber sinnvoll sein, wenn die zu sendenden Datenmengen die Limits eines HTTP-Requests übersteigen.

Mail im Posteingang

Eine PHP-Funktion, die eine Mail versendet, ist nicht sonderlich spektakulär. Die so versendeten Mails kommen vom Webserver über den MX-Rexord bei mir an. In meinem Fall ist der Webserver bei Hosteurope.de

Der Header zeigt nur die grundlegenden Dinge. Der Provider macht keine DKIM-Signatur

Return-Path: <kontaktphp@msxfaq.net>
Authentication-Results:  kundenserver.de; dkim=none
Received: from vwpNNNNN.webpack.hosteurope.de ([178.77.117.98]) by
 mx.kundenserver.de (mxeue009 [212.227.15.41]) with ESMTPS (Nemesis) id
 1MpmPd-1pJV8m0oaz-00q7Jy for <frank@carius.de>; Sun, 13 Nov 2022 21:42:17
 +0100
Received: from localhost ([127.0.0.1]) by vwpNNNNN.webpack.hosteurope.de running ExIM with local
	id 1ouJo0-0005YE-UB; Sun, 13 Nov 2022 21:42:16 +0100
To: phptext@carius.de
Subject: HTTP2SMTP
Message-Id: <E1ouJo0-0005YE-UB@vwpNNNNN.webpack.hosteurope.de>
From: kontaktphp@msxfaq.net
Date: Sun, 13 Nov 2022 21:42:16 +0100
X-HE-PHP-Submitted: yes
X-bounce-key: webpack.hosteurope.de;kontakt@msxfaq.net;1668372137;7006f034;
X-HE-SMSGID: 1ouJo0-0005YE-UB
Envelope-To: <phptest@carius.de>

Nutzung in der IOT-Welt

Natürlich können Sie nun diese API auch nutzen, um per PowerShell-Skript oder anderen Code-Teilen eine Mail mit Informationen zu versenden. Aber leistungsfähige Programmiersprachen und Umgebungen können andere APIs nutzen. Aber für die IoT-Fraktion mit kleinen ESP8266/ESP32, Shelly und anderen auf Tasmota und Co basierenden Geräten ist so ein Webhook einfach trivial nutzbar.

Der Versand von Daten per HTTP-GET von einem Gerät an eine zentrale Instanz ist also gar nicht so selten und gängige Praxis. Über das einfache PHP-Skript auf meiner Webseite kann ich nun ausgewählte Systeme einfach einen Alarm senden lassen, z.B. wenn einen Wassermelder Alarm schlagen will oder meine Heizung auf Störung geht oder die Garage geöffnet wird. Es sollte aber nicht hunderte Mails am Tag werden, sondern wirklich nur die wichtige Meldungen bei mir erscheinen

Andere HTTP-Services

Wenn sie etwas mehr Intelligenz auf der Serverseite möchten, dann können Sie sich gerne andere Plattformen anschauen, z.B.

  • IFTTT  IF this than that
    IFTTT - If This Than That
  • Node.RED
    Diese Plattform erlaubt ebenfalls die Annahme von HTTP-Request und eine Umfangreiche Weiterverarbeitung. Es gibt NodeRED-Hosting oder Sie installieren es in ihrem eigenen Netzwerk z.B. auf einem RaspberryPi und Co

Das sind nur zwei Beispiele. Wie so oft gibt es nicht den "Markführer" sondern ganz viele verschiedene Lösungen. Vielleich wollten Sie die Daten ja auch an PRTG oder eine INFLUX-Datenbank senden, langfristig speichern und nachverarbeiten.

Weitere Links