Eigene temporäre Mail: Telegrammbot

Oft besteht bei neuen Tools und Funktionen der Wunsch, etwas nicht ganz Gewöhnliches zu experimentieren und zu implementieren, was ich noch nie zuvor getan habe. Die Idee, meinen temporären Postdienst in Form eines Telegrammbot zu erstellen, erschien mir recht interessant.

Ein kleiner Hintergrund
Vor nicht allzu langer Zeit bin ich von einem regulären Hosting zu VPS gewechselt und es kam vor, dass ich nach einem Monat oder etwas mehr wieder zu einem anderen VPS wechseln musste. In beiden Fällen hatte ich den günstigsten Tarif und Ubuntu 16.04. Seit ich das letzte Mal auf ein Terminal an der Universität gestoßen bin, was einem völligen Mangel an Erfahrung gleichkam, habe ich die exzellenten Schritt-für-Schritt-Anweisungen von DigitalOcean verwendet, um mein VPS zu konfigurieren (einige davon wurden für diejenigen ins Russische übersetzt, die wie ich nicht genug sind kann Englisch). Und ja, mein erster VPS war auf DO und ich musste wieder umziehen, hauptsächlich weil ein Teil seiner IP-Adressen unter die Verteilung von ILV fiel. Nachdem ich den LAMP-Setup-Vorgang einige Male wiederholt hatte, gewöhnte ich mich ein wenig an das VPS-Terminal und entschied mich im Rahmen seiner Weiterentwicklung, auf ungewöhnliche Experimente umzusteigen - um beispielsweise meinen eigenen temporären Mail-Dienst zu erstellen.

Ich hatte bereits Erfahrung im Backend, insbesondere beim Erstellen von Telegramm-Bots in PHP MySQL, aber E-Mails "an mich selbst" zu erhalten - schien weit und unverständlich. Nachdem ich mehrere Registerkarten mit verschiedenen Artikeln zum Thema geöffnet hatte, stellte ich fest, dass ich nichts verstand. Überall wurde vorgeschlagen, eine Menge verschiedener Tools zu verwenden, die meiner Meinung nach eher für einen vollwertigen E-Mail-Dienst als für den Empfang eingehender E-Mail-Nachrichten auf VPS geeignet waren.

Posteingang erhalten


Für den ersten Schritt hat mir ein Artikel aus der Sandbox sehr geholfen: habr.com/en/post/260429 . Ich machte auf ihre negative Bewertung aufmerksam, aber sie beschreibt genau, was mich interessierte. Ich wollte ein Ergebnis erzielen, das ich so schnell wie möglich "fühlen" konnte, und mit den Gedanken "In Zukunft werde ich es richtig machen" ging ich zur Konfiguration von sendmail.

Dann habe ich die Domain eingerichtet. DNS-Einträge:

example.com IN MX 5 mail.example.com
mail.example.com IN A XXX.XX.XXX.XXX (VPS-IP-Adresse)

@example.com vasya /etc/mail/virtusertable Datei @example.com vasya Datei /etc/mail/virtusertable , um festzustellen, dass alle E-Mails, die für Adressen auf ****@example.com bestimmt sind, an Vasya adressiert sind.

Um eingehende E-Mails mit PHP-Skript zu verarbeiten, vasya: "|php -q /home/vasya/mail.php" der Datei /etc/aliases vasya: "|php -q /home/vasya/mail.php" die Zeile vasya: "|php -q /home/vasya/mail.php" hinzu vasya: "|php -q /home/vasya/mail.php" .

Nachdem ich mehrere Tests durchgeführt und sichergestellt hatte, dass eingehende E-Mails an das PHP-Skript übergeben wurden, konnte ich mich um dessen Verarbeitung kümmern.

Das Empfangen von rohen eingehenden E-Mails, die auf die oben beschriebene Weise an PHP gesendet wurden, ist im Code äußerst einfach implementiert:

 $msg = file_get_contents("php://stdin"); 

Ganz anders geht es um die Analyse des Mailformats und die verständliche und zugängliche Darstellung von Daten. Google bot mir verschiedene Optionen zum Parsen des E-Mail-Formats mit PHP an. Alle Bibliotheken, die ich gefunden habe, haben die Installation zusätzlicher Komponenten in Mitleidenschaft gezogen , aber eine davon schien mir weniger umständlich: github.com/zbateson/mail-mime-parser . Das einzige, was ich zusätzlich installieren musste, war der beliebte Paketmanager für PHP - Composer. Natürlich bin ich beim üblichen Hosting nicht darauf gestoßen, aber die Installation und weitere Verbindung der Bibliothek zum Parsen von E-Mails war überhaupt nicht schwierig.

Der Anfang eines PHP-Skripts zur Verarbeitung eingehender E-Mails mithilfe der Bibliothek zbateson / mail-mime-parser sieht folgendermaßen aus:

 <?php require("vendor/autoload.php"); use ZBateson\MailMimeParser\MailMimeParser; use ZBateson\MailMimeParser\Message; $msg = file_get_contents("php://stdin"); $parser = new MailMimeParser(); $message = Message::from($msg); 

Da temporäre E-Mails meiner Meinung nach nicht mehrere Empfänger betreffen, reicht es aus, nur den ersten der möglichen zu nehmen:

 $to = $message->getHeader('To'); $email = $to->getAddresses()[0]->getEmail(); 

In der Variablen $ email haben wir die Empfängeradresse des Formulars vasyaorpetya@example.com.

Um den Inhalt eingehender Briefe in der Bibliothek zu erhalten, gibt es geeignete Methoden:

 $from = $message->getHeader('From')->getEmail(); $subject = $message->getHeaderValue('Subject'); $msg_text = $message->getTextContent(); $msg_html = $message->getHtmlContent(); 

Telegrammbot


Was sollte ein temporärer Telegramm-Mail-Bot zuerst tun können?

  1. Geben Sie auf Anfrage eine neue temporäre E-Mail-Adresse an
  2. Senden Sie Posteingangsnachrichten für diese E-Mail, während die E-Mail-Adresse gültig ist
  3. E-Mail-Adresse erneuern

In diesem und vielen anderen Fällen ist die Verwendung von Webhook eine gute Möglichkeit, um Updates von Telegram zu erhalten. Es wird nur die Skriptadresse mit https benötigt. Die Verwendung von Certbot zum Konfigurieren des SSL-Domänenzertifikats wird in den DO-Anweisungen ausführlich beschrieben.

Für die Interaktion mit der Telegramm-Bot-API verwende ich meine eigenen Best Practices. Jemand bevorzugt beliebte Bibliotheken. Das Senden von Nachrichten mit Schaltflächen an Telegramme ist seit langem bekannt, da über viele Artikel geschrieben wurde.

Die Generierung temporärer E-Mail-Adressen ist im Wesentlichen die Ausgabe der nächsten Adresse in der Reihenfolge. Ich habe eine Tabelle für E-Mail-Adressen in der Datenbank erstellt, in der eine ID vom Typ int mit automatischer Inkrementierung den Empfänger eindeutig identifiziert. Die Umwandlung einer numerischen ID in eine Zeichenfolgenadresse erfolgt, wenn eine Zahl in ein anderes Zahlensystem übersetzt wird, in dem das gesamte lateinische Alphabet als "Zahlen" verfügbar ist. 26 Buchstaben im Vergleich zu Zahlen ergeben eine gute Reduzierung der Länge des Bezeichners. Wahrscheinlich könnte ich auch problemlos Großbuchstaben, Zahlen und einige Zeichen verwenden, um die Länge der ausgegebenen Adressen weiter zu reduzieren, aber ich habe nur kleine lateinische Buchstaben hinterlassen.

Funktionen zum Übersetzen einer numerischen ID in eine Zeichenfolge und umgekehrt:

 // $alphabet = explode(",", "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"); //   @grayfolk: $alphabet = range('a', 'z'); function num2str($n, $a) { // $a -  $b = count($a); $r = 0; $x = ""; while ($n) { $r = $n%$b; $n = ($n-$r)/$b; $x .= $a[$r]; } return strrev($x); } function str2num($s, $a) { $n = 0; $b = count($a); $s = strrev($s); for ($i = 0; $i < strlen($s); $i++) { $n += array_search($s[$i], $a) * pow($b, $i); } return $n; } 

Einer der Hauptvorteile der Verwendung des temporären Mail-Dienstes ist das Fehlen von Spam. Wenn die Adressen jedoch in Ordnung sind, können Sie eine Liste der nächstgelegenen Adressen erstellen, die ausgegeben werden, und das Mailing erfolgreich durchführen. Um dieses Problem zu lösen, habe ich der Empfänger-ID eine zufällige Zeichenfolge hinzugefügt. Um zwischen id und der zufälligen Komponente in der Adresse zu unterscheiden, habe ich beschlossen, die zufällige Komponente immer mit einer Ziffer zu beginnen.

Wir schreiben eine zufällige Zeile der ausgegebenen E-Mail-Adresse in die Datenbank zusammen mit der Empfänger-ID, der Benutzer-ID im Telegramm und dem Zeitpunkt, zu dem das Postfach ausgegeben wurde.

Es scheint, dass Sie nicht einmal eingehende E-Mails speichern müssen - sie haben sie an Telegramme gesendet und das ist alles. Aber was ist mit HTML-Buchstaben? Sie können nicht in einer Chat-Nachricht angezeigt werden. Es bleibt, die eingehenden HTML-Nachrichten in der Datenbank aufzuzeichnen und auf der Site anzuzeigen und dem Benutzer einen Link zu senden, der die Nachrichten-ID und das nächste generierte Kennwort enthält. Um die Datenbank mit der Krone termingerecht zu bereinigen, wird ein PHP-Skript gestartet, das eingehende HTML-Nachrichten entfernt, die vor mehr als einer Stunde empfangen wurden.

Später habe ich in den Telegrammen des Bots Schaltflächen hinzugefügt, die die Gültigkeit der Mailbox um 10 oder 60 Minuten verlängern, sowie eine Schaltfläche, mit der Sie herausfinden können, wie viel er schließlich leben muss, bevor der Empfang eingehender Nachrichten gestoppt wird.

Da es sich um registrierte Benutzer in einem Telegramm handelt, können Sie die Möglichkeit bieten, Ihre alten Postfächer zu aktivieren, um beispielsweise ein vergessenes Passwort auf einer Website wiederherzustellen, oder für andere Vorgänge, für die eine Bestätigung per E-Mail erforderlich ist. Das ausgegebene Postfach "akzeptiert" eingehende Nachrichten nur, wenn der Benutzer sie benötigt. In der restlichen Zeit wird möglicher Spam ignoriert.



Wunschliste für die Zukunft:

  • Webversion erstellen [fertig]
  • Richten Sie mit wenigen Klicks / Befehlen eine schnelle Änderung der Mail-Domain ein (wie?)

Referenzen


Telegrammbot: @tmpmailbot

Ein Artikel, der die Sendmail-Konfiguration beschreibt

PHP-Bibliothek zum Parsen von E-Mails

Source: https://habr.com/ru/post/de445988/


All Articles