Wie steuere ich eine Webanwendung per E-Mail?Oder wie führt man ein PHP-Skript aus, indem man eine E-Mail sendet?

StackOverflow https://stackoverflow.com/questions/46777

  •  09-06-2019
  •  | 
  •  

Frage

Ich möchte eine Webanwendung auf PHP und MySQL ausführen und dabei das CakePHP-Framework verwenden.Und um die Schwelle zur Nutzung der Website möglichst niedrig zu halten, möchte ich nicht die Standardanmeldung mit Benutzername/Passwort verwenden.(Und ich möchte meine Benutzer auch nicht mit so etwas wie OpenID belästigen.Geht zum Benutzertyp.)

Daher denke ich, dass sich die Benutzer anmelden können, indem sie eine E-Mail an login@domain.com senden, ohne dass ein Betreff oder Inhalt erforderlich ist.Als Antwort erhalten sie eine E-Mail mit einem Link, über den sie sich anmelden können (er enthält einen Hash).Außerdem lasse ich die Benutzer einige Aktionen ausführen, ohne die Website überhaupt zu besuchen. Senden Sie einfach eine E-Mail mit command@domain.com und der Befehl wird ausgeführt.Ich gehe davon aus, dass die Benutzer und ihre E-Mail-Anbieter sich um die Sicherheit ihres E-Mail-Kontos kümmern und daher auf meiner Website kein Bedarf dafür besteht.

Wie komme ich nun von einer E-Mail, die an ein Konto gesendet wird, das von Menschen nicht gelesen werden kann, dazu, dass dort ein Skript ausgelöst wird (im Grunde ruft ein „Dummy-Browser-Client“ eine URL auf (und CakePHP kümmert sich um den Rest)?


Ich habe noch nie einen Cronjob verwendet, aber ich glaube, ich verstehe ihren Zweck oder ihre allgemeine Funktionsweise.Ich kann nicht zulassen, dass das Skript von zufälligen Besuchern der Website aufgerufen wird, da diese Lösung aus mehreren Gründen nicht funktioniert.Ich denke, ich würde gerne mehr über die Möglichkeit erfahren, das Skript als Antwort auf eine eingehende E-Mail ausführen zu lassen, falls jemand dazu etwas sagen kann.Wenn es als Cron-Job ausgeführt wird, wird es nur alle X Minuten überprüft und die Benutzer erhalten eine Verzögerung in ihrer Antwort (wenn ich es richtig verstehe).

Da es für verschiedene Befehle unterschiedliche E-Mail-Adressen gibt, z Anmeldung@domain.com und ich weiß, was zu tun ist und wie es geht, basierend auf der E-Mail des Absenders. Ich benötige nicht einmal den Inhalt, den Betreff oder andere Header aus der E-Mail.


Es gibt große Bedenken hinsichtlich der Sicherheit dieser Anwendung, ich verstehe die Probleme, aber ohne mein Konzept preiszugeben, glaube ich nicht, dass es ein großes Problem für das ist, was ich tue.Auch was die Benutzerfreundlichkeit betrifft, gibt es eigentlich keine.Es wird lediglich eine Anmeldung erforderlich sein, um Änderungen an einem Benutzerprofil vorzunehmen, wenn diese diesen und einen weiteren Befehl benötigen.Und das ist die Haupt-E-Mail, die sehr leicht zu merken ist und den Anfang dieses ganzen Konzepts darstellt.

War es hilfreich?

Lösung

Ich habe das verwendet pop3-PHP-Klasse mit großem Erfolg (es gibt auch eine Pear POP3-Modul).

Die Verwendung der Klasse pop3 sieht in etwa so aus:

require ('pop3.php');

$pop3 = new pop3_class();
$pop3->hostname = MAILHOST;
$pop3->Open();
$pop3->Login('myemailaddress@mydomain.com', 'mypassword');

foreach($pop3->ListMessages("","") as $msgidx => $msgsize)
{
    $headers = "";
    $body = "";

    $pop3->RetrieveMessage($msgidx, $headers, $body, -1);
}

Ich verwende es, um ein POP3-Postfach zu überwachen, das in eine Datenbank eingespeist wird.

Es wird von einem Cronjob aufgerufen, der wget verwendet, um die URL zu meinem PHP-Skript aufzurufen.

*/5 * * * * "wget -q --http-user=me --http-passwd=pass 'http://mydomain.com/mail.php'" >> /dev/null 2>&1

Bearbeiten

Ich habe über Ihre Notwendigkeit nachgedacht, dass Benutzer bestimmte Site-Befehle per E-Mail senden.

Wäre es nicht einfacher, eine einzige Adresse zu haben, an die mehrere Befehle gesendet werden können, als mehrere Adressen zu haben?

Ich denke, die Sicherheitsbedenken sind auch ziemlich berechtigt.Sofern die Befehle nicht zerstörerisch sind oder keine benutzerspezifischen Aktionen ausführen, ist das System für jeden offen, der weiß, wie man eine E-Mail-Adresse fälscht (und das wäre jeder :)).

Andere Tipps

Sie benötigen eine Art CronJob/Timer-Dienst, der die Mailbox regelmäßig überprüft und dann darauf reagiert.Alternativ sollten Sie den Mailserver prüfen, ob er beim Eintreffen einer E-Mail ein Skript ausführen kann (d. h.Sehen Sie nach, ob es möglich ist, ein Spamfilter-Skript einzufügen und diese Funktionalität zu „missbrauchen“, um stattdessen Ihr Skript aufzurufen.

Mit reinem PHP haben Sie meistens Pech, da etwas das Skript auslösen muss.Auf einer Seite mit viel Verkehr könnten Sie Ihre index.php oder was auch immer überprüfen lassen, aber wenn Ihre Website längere Zeit niemand besucht, wird die E-Mail nicht gesendet und Sie müssen auf „Race“ achten Bedingungen", wenn mehrere Personen gleichzeitig auf das Skript zugreifen.

Bearbeiten: Bedenken Sie nur einen Usability-Fehler:Menschen mit mehreren PCs und ohne E-Mail-Client auf jedem.Ich verwende zum Beispiel 4 PCs, aber nur auf einem (meinem Hauptrechner) ist ein Mail-Client installiert, und ich verwende Webmail, um die anderen zu überprüfen.Nun ist das Einloggen und Versenden einer E-Mail über Webmail nicht die beste Benutzerfreundlichkeit – um IHRE Website nutzen zu können, muss ich mich zunächst bei EINER ANDEREN Website anmelden, eine E-Mail über die beschissene Benutzeroberfläche der meisten Webmail-Tools verfassen und auf eine Antwort warten.Könnte dort auch OpenID verwenden :-)

Wenn Ihr Server dies zulässt, können Sie a verwenden .nach vorne Datei bzw Procmail um einen Prozess (PHP oder etwas anderes) zu starten, wenn eine E-Mail an einer bestimmten Adresse ankommt.

Sie möchten die Benutzer nicht mit OpenID belästigen, aber Sie möchten, dass sie mit diesem E-Mail-Schema klarkommen.Erstens kann es lange dauern, bis E-Mails durchgesendet werden.Es gibt keinen garantierten Zeitpunkt, zu dem eine E-Mail zugestellt wird.Es ist nicht einmal garantiert, dass die E-Mail überhaupt dort ankommt.Ich weiß, dass die Dinge normalerweise schnell gehen, aber es ist nicht ungewöhnlich, dass eine Hin- und Rückfahrt bis zu 10 Minuten dauert.Außerdem wird der Link, den Sie zurücksenden, offen gesendet, sofern Sie die E-Mail nicht verschlüsseln.Das bedeutet, dass sich jeder über diesen Link anmelden kann.Je nachdem, wie sicher Sie sein möchten, kann dies ein Problem sein oder auch nicht, aber es ist auf jeden Fall etwas, worüber Sie nachdenken sollten.Die Verwendung einer nicht standardmäßigen Anmeldemethode wie dieser wird viel mehr Arbeit erfordern, als sie wahrscheinlich wert ist, und ich kann keine wirklichen Vorteile für den gesamten Prozess erkennen.

Ich habe auch darüber nachgedacht, procmail zu verwenden, um ein Skript zu starten.Es gibt auch formail, das nützlich sein kann, um Header zu ändern oder zu extrahieren.Wenn Sie Administratorzugriff auf den Mailserver haben, können Sie auch /etc/aliases verwenden und einfach an Ihr Skript weiterleiten.

Abgesehen von Fragen der Benutzerfreundlichkeit sollten Sie wirklich über die Sicherheit nachdenken – es ist eigentlich ganz einfach, E-Mails mit einer gefälschten Absenderadresse zu versenden, daher würde ich mich bei kritischen Dingen nicht darauf verlassen.

Ich stimme allen Sicherheitsbedenken zu.Ihre Annahme, dass „die Benutzer und ihre E-Mail-Anbieter sich um die Sicherheit ihres E-Mail-Kontos kümmern“, ist in Bezug auf die E-Mail-Adresse des Absenders nicht richtig.

Da Sie jedoch speziell gefragt haben: „Wie komme ich davon, dass eine E-Mail an ein Konto gesendet wird, das von Menschen nicht gelesen werden kann, und dass dort ein Skript ausgelöst wird“, empfehle ich die Verwendung von Procmail, um die eingehende E-Mail an ein von Ihnen geschriebenes Skript zu übermitteln.

Ich würde keine URL nennen.Ich würde das Skript die Arbeit ausführen lassen, indem es die auf stdin gesendete Nachricht liest.Auf diese Weise ist das Skript für niemanden auf der Website zugänglich.

Um dies einzurichten, muss die E-Mail-Adresse, die Sie Ihren Benutzern angeben, einem echten Benutzer im System zugeordnet werden.Erstellen Sie im Home-Verzeichnis dieses Benutzers eine Datei mit dem Namen „.procmailrc“.

Fügen Sie in dieser Datei diese beiden Zeilen hinzu:

:0 hb:
| /path/to/program

Wobei/path/to/programm der vollständige Pfad zum Skript oder Programm zum Umgang mit der eingehenden Nachricht ist.Erstellen Sie dann das Skript mit Code wie diesem:

#!/usr/bin/php
<?php

$fp=fopen('php://stdin','r');
while($line = fgets($fp)) {
    [do something with each $line of input here]
}

?>

Die E-Mail-Nachricht verbleibt nicht im Postfach. Wenn Sie sie also speichern oder protokollieren möchten, überlassen Sie dies dem Skript.

--
Bruce

Ich würde diesen Ansatz ernsthaft überdenken.E-Mails sind nicht sehr zuverlässig.Es gibt alle Arten von Spamfiltern, die E-Mails mit Links abfangen und so den „Befehl“ halbfertig machen können, ganz zu schweigen von den Sicherheitsrisiken.

Es ist sehr einfach, die Absenderadresse einer E-Mail zu fälschen.Sie öffnen Ihr System grundsätzlich für jedermann.

Anstelle einer Kombination aus Benutzername und Passwort müssen sich die Benutzer plötzlich eine Liste mit Befehlen merken, die sie vor einer E-Mail-Adresse einfügen müssen.Es wäre besser, ihnen einen Benutzernamen/ein Passwort zu geben und ihnen dann Zugriff auf eine Hilfeseite zu gewähren.

Mit anderen Worten: Die Benutzerfreundlichkeit und Sicherheit dieses Systems schneidet sehr schlecht ab.

Ich kann bei diesem Ansatz keine wirklichen Vorteile erkennen, die die massiven Nachteile auch nur annähernd überwiegen würden.

Eine Lösung, um Spam zu verhindern, besteht darin, sicherzustellen, dass die erste Zeile, die letzte Zeile oder eine bestimmte Zeile eine bestimmte Zeichenfolge enthält, fast wie ein Passwort, besser ist jedoch ein vollständiger Satz.

Nur Sie haben das Wort oder die Wörter, ziemlich sicher, denken Sie nur daran, die E-Mails nach der Verwendung zu löschen und diejenigen, die nicht über die Geheimzeile verfügen.

Neben der Sicherheit und Benutzerfreundlichkeit kann die E-Mail-Zustellung ein weiteres Problem darstellen.Abhängig vom E-Mail-Anbieter des Benutzers kann sich die E-Mail-Zustellung um einige Minuten bis einige Stunden verzögern.

Es gibt eine wirklich schöne, lehrreiche Geschichte thedailywtf.com zum Entwerfen von Software.Die gestellte Frage sollte durch ein richtiges Design gelöst werden, nicht durch Techo-Woopla.

Alexander, bitte lesen Sie die verlinkte Geschichte und denken Sie an Handschuhe, nicht an E-Mail-gesteuertes Surfen auf Webseiten.

PHP ist kein Hammer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top