Souvent avec de nouveaux outils et capacités, il y a un désir d'expérimenter et d'implémenter quelque chose de pas tout à fait ordinaire, ce que je n'ai jamais fait auparavant. L'idée de créer mon service de courrier temporaire sous forme de télégramme bot m'a paru assez intéressante.
Un peu de fondIl n'y a pas si longtemps, je suis passé d'un hébergement régulier à VPS et il s'est avéré qu'après un mois ou un peu plus, j'ai dû à nouveau passer à un autre VPS. Dans les deux cas, j'avais le plan tarifaire le moins cher et Ubuntu 16.04. Depuis la dernière fois à cette époque, je suis tombé sur un terminal à l'université, ce qui équivalait à un manque total d'expérience, j'ai utilisé les excellentes instructions étape par étape de DigitalOcean pour configurer mon VPS (certaines d'entre elles ont été traduites en russe pour ceux qui, comme moi, ne suffisent pas connaît l'anglais). Et oui, mon premier VPS était sur DO, et j'ai dû déménager à nouveau principalement parce qu'une partie de ses adresses IP tombait sous la distribution d'ILV. Après avoir répété la procédure de configuration de LAMP à quelques reprises, je me suis un peu habitué au terminal VPS et, dans le cadre de son développement, j'ai décidé de passer à des expériences inhabituelles - pour créer mon propre service de courrier temporaire, par exemple.
J'avais déjà de l'expérience dans le backend, en particulier dans la création de bots de télégrammes en PHP MySQL, mais recevoir des e-mails «moi-même» - cela semblait loin et incompréhensible. Après avoir ouvert plusieurs onglets avec divers articles sur le sujet, j'ai réalisé que je ne comprenais rien. Partout, il a été proposé d'utiliser une tonne d'outils différents, ce qui, à mon avis, était plus adapté à un service de messagerie électronique à part entière qu'à la tâche de réception de messages électroniques entrants sur VPS.
Recevoir la boîte de réception
Pour la première étape, un article du bac à sable m'a beaucoup aidé:
habr.com/en/post/260429 . J'ai attiré l'attention sur sa note négative, mais elle décrit exactement ce qui m'a intéressé. Je voulais obtenir un résultat que je pourrais "ressentir" dès que possible, et avec les pensées "à l'avenir, je le ferai bien", je suis allé configurer sendmail.
Ensuite, j'ai configuré le domaine. Enregistrements DNS:
example.com IN MX 5 mail.example.com
mail.example.com IN A XXX.XX.XXX.XXX
(adresse IP VPS)
Sur le serveur, a ajouté la ligne
@example.com vasya
/etc/mail/virtusertable
, déterminant ainsi que tout le courrier destiné à toutes les adresses sur ****@example.com est adressé à Vasya.
Pour traiter le courrier entrant avec un script php, a ajouté la ligne
vasya: "|php -q /home/vasya/mail.php"
au fichier
/etc/aliases
vasya: "|php -q /home/vasya/mail.php"
.
Après avoir effectué plusieurs tests et m'être assuré que le courrier entrant est transmis au script php, j'ai pu m'occuper de son traitement.
La réception du courrier entrant brut envoyé à php de la manière décrite ci-dessus est implémentée dans le code de manière extrêmement simple:
$msg = file_get_contents("php://stdin");
Une question complètement différente est l'analyse du format du courrier et la présentation des données d'une manière compréhensible et accessible. Google m'a proposé plusieurs options sur la façon d'analyser le format de courrier à l'aide de PHP. Toutes les bibliothèques que j'ai trouvées ont traîné sur l'installation de composants supplémentaires, mais l'une d'entre elles m'a semblé moins lourde:
github.com/zbateson/mail-mime-parser . La seule chose que j'avais besoin d'installer en plus était le gestionnaire de paquets populaire pour PHP - Composer. Bien sûr, je ne l'ai pas rencontré sur l'hébergement habituel, mais l'installer et connecter davantage la bibliothèque pour analyser le courrier n'était pas du tout difficile.
Le début d'un script php pour le traitement du courrier entrant à l'aide de la bibliothèque zbateson / mail-mime-parser ressemble à ceci:
<?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);
Le courrier temporaire n'impliquant pas à mon avis plusieurs destinataires, il suffit de n'en prendre que le premier possible:
$to = $message->getHeader('To'); $email = $to->getAddresses()[0]->getEmail();
Dans la variable $ email, nous avons l'adresse du destinataire du formulaire vasyaorpetya@example.com.
Pour recevoir le contenu des lettres entrantes dans la bibliothèque, il existe des méthodes appropriées:
$from = $message->getHeader('From')->getEmail(); $subject = $message->getHeaderValue('Subject'); $msg_text = $message->getTextContent(); $msg_html = $message->getHtmlContent();
Télégramme bot
Qu'est-ce qu'un bot de messagerie temporaire de télégramme devrait être capable de faire en premier?
- Émettre une nouvelle adresse e-mail temporaire sur demande
- Envoyer des messages de boîte de réception pour cet e-mail pendant que l'adresse e-mail est valide
- Renouveler l'adresse e-mail
Un moyen tout à fait approprié dans ce cas et dans bien d'autres cas pour recevoir des mises à jour de Telegram est d'utiliser Webhook. Seule l'adresse de script avec https est nécessaire. L'utilisation de Certbot pour configurer le certificat de domaine SSL est décrite en détail dans les instructions DO.
Pour interagir avec l'API Telegram Bot, j'utilise mes propres meilleures pratiques. Quelqu'un préfère utiliser les bibliothèques populaires. L'envoi de messages avec des boutons aux télégrammes est depuis longtemps devenu une chose familière, car de nombreux articles ont été écrits à ce sujet.
La génération d'adresses électroniques temporaires est essentiellement la sortie de la prochaine adresse dans l'ordre. J'ai créé une table pour les adresses e-mail dans la base de données, où un identifiant de type int avec incrémentation automatique identifie de manière unique le destinataire. La conversion d'un identifiant numérique en une adresse de chaîne est effectuée comme un nombre est traduit dans un autre système numérique, où l'alphabet latin entier est disponible sous forme de "nombres". 26 lettres par rapport aux chiffres permettent une bonne réduction de la longueur de l'identifiant. Probablement, je pourrais également utiliser des majuscules, des chiffres et certains caractères sans problème pour réduire davantage la longueur des adresses émises, mais je n'ai laissé que de petites lettres latines.
Fonctions de traduction d'un identifiant numérique en chaîne et vice versa:
L'un des principaux avantages de l'utilisation du service de courrier temporaire est l'absence de spam. Mais si les adresses sont en ordre, vous pouvez faire une liste des adresses les plus proches qui seront émises et réussir l'envoi. Pour résoudre ce problème, j'ai ajouté une chaîne aléatoire à l'ID du destinataire. Pour faire la distinction entre id et le composant aléatoire dans l'adresse, j'ai décidé de toujours démarrer le composant aléatoire avec un chiffre.
Nous écrivons une ligne aléatoire de l'adresse e-mail émise dans la base de données avec l'ID du destinataire, l'ID utilisateur dans le télégramme et l'heure d'émission de la boîte aux lettres.
Il semblerait que vous n’ayez même pas à stocker le courrier entrant - ils l’ont envoyé par télégramme et c’est tout. Mais qu'en est-il des lettres html? Ils ne peuvent pas être affichés dans un message de discussion. Il reste à enregistrer les messages html entrants dans la base de données et à les afficher sur le site, et à envoyer à l'utilisateur un lien qui inclut l'identifiant du message et le prochain mot de passe généré. Pour nettoyer la base de données avec la couronne dans les délais, un script php est lancé qui supprime les messages html entrants reçus il y a plus d'une heure.
Plus tard, dans les télégrammes du bot, j'ai ajouté des boutons qui prolongent la validité de la boîte aux lettres de 10 ou 60 minutes, ainsi qu'un bouton qui vous permet de savoir combien, après tout, il doit vivre avant d'arrêter la réception des messages entrants.
Étant donné que nous traitons des utilisateurs enregistrés dans un télégramme, vous pouvez fournir la possibilité d'activer vos anciennes boîtes aux lettres, par exemple, pour restaurer un mot de passe oublié sur un site Web ou pour toute autre opération nécessitant une confirmation par e-mail. La boîte aux lettres émise «n'accepte» les messages entrants que lorsque l'utilisateur en a besoin, le reste du temps, le spam potentiel est ignoré.

Liste de souhaits pour l'avenir:
- Créer une version Web [terminé]
- Configurer un changement rapide du domaine de messagerie en quelques clics / commandes (comment?)
Les références
Bot télégramme: @tmpmailbot
Un article décrivant la configuration de sendmailBibliothèque PHP pour l'analyse des e-mails