Propio correo temporal: bot telegram

A menudo, con nuevas herramientas y capacidades, existe el deseo de experimentar e implementar algo que no es del todo normal, algo que nunca antes había hecho. La idea de crear mi servicio de correo temporal en forma de bot de telegramas me pareció bastante interesante.

Un poco de historia
No hace mucho tiempo me mudé de un hosting regular a VPS y sucedió que después de un mes o un poco más nuevamente tuve que mudarme a otro VPS. En ambos casos, tenía el plan de tarifas más barato y Ubuntu 16.04. Desde la última vez que encontré una terminal en la universidad, lo que equivalía a una falta total de experiencia, utilicé las excelentes instrucciones paso a paso de DigitalOcean para configurar mi VPS (algunas de ellas han sido traducidas al ruso para aquellos que, como yo, no son suficientes sabe inglés) Y sí, mi primer VPS estaba en OD, y tuve que mudarme de nuevo principalmente porque parte de sus direcciones IP caían bajo la distribución de ILV. Después de repetir el procedimiento de configuración de LAMP un par de veces, me acostumbré un poco al terminal VPS y, como parte de su desarrollo posterior, decidí cambiar a experimentos inusuales, para crear mi propio servicio de correo temporal, por ejemplo.

Ya tenía experiencia en el back-end, en particular en la creación de bots de telegramas en PHP MySQL, pero recibir el correo electrónico "yo mismo" - parecía lejos e incomprensible. Después de abrir varias pestañas con varios artículos sobre el tema, me di cuenta de que no entendía nada. En todas partes se propuso utilizar un montón de herramientas diferentes, que en mi opinión eran más adecuadas para un servicio de correo electrónico completo que para la tarea de recibir mensajes de correo electrónico entrantes en VPS.

Recibir bandeja de entrada


Para el primer paso, un artículo del sandbox me ayudó mucho: habr.com/en/post/260429 . Llamé la atención sobre su calificación negativa, pero describe exactamente lo que me interesaba. Quería obtener un resultado que pudiera "sentir" lo más rápido posible, y con el pensamiento "en el futuro lo haré bien". Fui a configurar sendmail.

Luego configuré el dominio. Registros DNS:

example.com IN MX 5 mail.example.com
mail.example.com IN A XXX.XX.XXX.XXX (dirección IP de VPS)

En el servidor, agregó la línea @example.com vasya /etc/mail/virtusertable , determinando así que todo el correo destinado a cualquier dirección en ****@example.com está dirigido a Vasya.

Para procesar el correo entrante con php-script, agregue la línea vasya: "|php -q /home/vasya/mail.php" al archivo /etc/aliases vasya: "|php -q /home/vasya/mail.php" .

Después de realizar varias pruebas y asegurarme de que el correo entrante se pase al script php, podría encargarme de su procesamiento.

La recepción del correo entrante sin procesar enviado a php de la manera descrita anteriormente se implementa en el código de manera extremadamente simple:

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

Una cuestión completamente diferente es el análisis del formato de correo y la presentación de datos de una manera comprensible y accesible. Google me ofreció varias opciones sobre cómo analizar el formato de correo usando PHP. Todas las bibliotecas que encontré arrastraron la instalación de componentes adicionales, pero una de ellas me pareció menos engorrosa: github.com/zbateson/mail-mime-parser . Lo único que necesitaba instalar adicionalmente era el popular administrador de paquetes para PHP - Composer. Por supuesto, no lo encontré en el alojamiento habitual, pero instalarlo y conectar aún más la biblioteca para analizar el correo no fue nada difícil.

El comienzo de un script php para procesar el correo entrante usando la biblioteca zbateson / mail-mime-parser se ve así:

 <?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); 

Dado que el correo temporal en mi opinión no involucra a varios destinatarios, es suficiente tomar solo el primero de los posibles:

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

En la variable $ email tenemos la dirección del destinatario del formulario vasyaorpetya@example.com.

Para recibir el contenido de las cartas entrantes en la biblioteca, hay métodos apropiados:

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

Telegram bot


¿Qué debe hacer primero un bot de correo temporal de Telegram?

  1. Emitir una nueva dirección de correo electrónico temporal a pedido
  2. Envíe mensajes de la bandeja de entrada para este correo electrónico mientras la dirección de correo sea válida
  3. Renovar dirección de correo electrónico

Una manera bastante adecuada en este y muchos otros casos para recibir actualizaciones de Telegram es usar Webhook. Solo se necesita la dirección del script con https. El uso de Certbot para configurar el certificado de dominio SSL se describe en detalle en las instrucciones de OD.

Para interactuar con la API de Bot de Telegram, utilizo mis mejores prácticas. Alguien prefiere usar bibliotecas populares. Enviar mensajes con botones a telegramas se ha convertido en algo familiar, ya que se han escrito muchos artículos.

La generación de direcciones de correo electrónico temporales es esencialmente el resultado de la siguiente dirección en orden. Creé una tabla para las direcciones de correo electrónico en la base de datos, donde una identificación de tipo int con incremento automático identifica de forma exclusiva al destinatario. La conversión de una identificación numérica en una dirección de cadena se realiza a medida que un número se traduce a otro sistema de números, donde todo el alfabeto latino está disponible como "números". 26 letras en comparación con los números dan una buena reducción en la longitud del identificador. Probablemente, también podría usar letras mayúsculas, números y algunos caracteres sin problemas para reducir aún más la longitud de las direcciones emitidas, pero dejé solo letras latinas pequeñas.

Funciones para traducir una identificación numérica en una cadena y viceversa:

 // $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; } 

Uno de los beneficios clave de usar el servicio de correo temporal es la ausencia de spam. Pero si las direcciones están en orden, puede hacer una lista de las direcciones más cercanas que se emitirán y realizar el envío correctamente. Para resolver este problema, agregué una cadena aleatoria a la ID del destinatario. Para distinguir entre id y el componente aleatorio en la dirección, decidí comenzar siempre el componente aleatorio con un dígito.

Escribimos una línea aleatoria de la dirección de correo electrónico emitida en la base de datos junto con la identificación del destinatario, la identificación del usuario en el telegrama y la hora en que se emitió el buzón.

Parece que ni siquiera tiene que almacenar el correo entrante: lo enviaron a telegramas y eso es todo. Pero, ¿qué pasa con las letras html? No se pueden mostrar en un mensaje de chat. Queda por registrar los mensajes html entrantes en la base de datos y mostrarlos en el sitio, y enviar al usuario un enlace que incluya la identificación del mensaje y la próxima contraseña generada. Para limpiar la base de datos con la corona según lo programado, se inicia un script php que elimina los mensajes html entrantes que se recibieron hace más de una hora.

Más tarde, en los telegramas del bot, agregué botones que extienden la validez del buzón en 10 o 60 minutos, así como un botón que le permite averiguar cuánto, después de todo, tiene que vivir antes de que se detenga la recepción de mensajes entrantes.

Dado que estamos tratando con usuarios registrados en un telegrama, puede brindar la oportunidad de activar sus buzones antiguos, por ejemplo, para restaurar una contraseña olvidada en un sitio web o para cualquier otra operación que requiera confirmación por correo electrónico. El buzón emitido "acepta" los mensajes entrantes solo cuando el usuario lo necesita; el resto del tiempo, se ignora el posible correo no deseado.



Lista de deseos para el futuro:

  • Crear versión web [hecho]
  • Configure un cambio rápido del dominio de correo en un par de clics / comandos (¿cómo?)

Referencias


Telegram bot: @tmpmailbot

Un artículo que describe la configuración de sendmail

Biblioteca PHP para analizar el correo electrónico

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


All Articles