Correio próprio temporário: telegram bot

Freqüentemente, com novas ferramentas e recursos, há um desejo de experimentar e implementar algo não muito comum, o que nunca fiz antes. A ideia de criar meu serviço de correio temporário na forma de bot de telegramas me pareceu bastante interessante.

Um pouco de fundo
Há pouco tempo, mudei de uma hospedagem regular para o VPS e, depois de um mês ou um pouco mais, tive que mudar novamente para outro VPS. Nos dois casos, eu tinha o plano tarifário mais barato e o Ubuntu 16.04. Desde a última vez em que deparei com um terminal da universidade, que equivalia a uma completa falta de experiência, usei as excelentes instruções passo a passo da DigitalOcean para configurar meu VPS (algumas delas foram traduzidas para o russo para aqueles que, como eu, não são suficientes sabe inglês). E sim, meu primeiro VPS foi no DO, e tive que mudar novamente, principalmente porque parte de seus endereços IP caiu sob a distribuição do ILV. Depois de repetir o procedimento de configuração do LAMP algumas vezes, me acostumei um pouco ao terminal VPS e, como parte de seu desenvolvimento, decidi mudar para experiências incomuns - para criar meu próprio serviço de correio temporário, por exemplo.

Eu já tinha experiência no back-end, em particular na criação de bots de telegrama no PHP MySQL, mas para receber e-mail "para mim mesmo" - parecia distante e incompreensível. Tendo aberto várias abas com vários artigos sobre o tema, percebi que não entendia nada. Em todos os lugares, foi proposto o uso de várias ferramentas diferentes, o que, na minha opinião, era mais adequado para um serviço de e-mail completo do que para a tarefa de receber mensagens de e-mail recebidas no VPS.

Receber caixa de entrada


Para a primeira etapa, um artigo da sandbox me ajudou muito: habr.com/en/post/260429 . Chamei a atenção para sua classificação negativa, mas descreve exatamente o que me interessava. Queria obter um resultado que pudesse "sentir" o mais rápido possível e, com os pensamentos "no futuro, farei certo", fui configurar o sendmail.

Então eu configurei o domínio. Registros DNS:

example.com IN MX 5 mail.example.com
mail.example.com IN A XXX.XX.XXX.XXX (endereço IP do VPS)

No servidor, adicionou a linha @example.com vasya arquivo /etc/mail/virtusertable , determinando que todo o correio destinado a qualquer endereço em ****@example.com seja endereçado a Vasya.

Para processar o correio recebido com o script php, adicione a linha vasya: "|php -q /home/vasya/mail.php" ao arquivo /etc/aliases vasya: "|php -q /home/vasya/mail.php" .

Após realizar vários testes e garantir que as mensagens recebidas sejam passadas para o script php, eu poderia lidar com o processamento.

O recebimento de emails brutos enviados ao php da maneira descrita acima é implementado no código de maneira extremamente simples:

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

Uma questão completamente diferente é a análise do formato de correio e a apresentação dos dados de maneira compreensível e acessível. O Google me ofereceu várias opções sobre como analisar o formato de email usando PHP. Todas as bibliotecas que encontrei arrastaram a instalação de componentes adicionais, mas uma delas me pareceu menos complicada: github.com/zbateson/mail-mime-parser . A única coisa que eu precisava instalar foi o popular gerenciador de pacotes do PHP - Composer. Obviamente, não o encontrei na hospedagem usual, mas não foi difícil instalá-lo e conectar ainda mais a biblioteca para analisar e-mails.

O início de um script php para processar e-mails recebidos usando a biblioteca zbateson / mail-mime-parser é assim:

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

Como em minha opinião, o correio temporário não envolve vários destinatários, basta apenas o primeiro possível:

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

Na variável $ email, temos o endereço do destinatário no formulário vasyaorpetya@example.com.

Para receber o conteúdo das cartas recebidas na biblioteca, existem métodos apropriados:

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

Bot de telegrama


O que um bot de correio temporário de telegrama pode fazer primeiro?

  1. Emita um novo endereço de email temporário mediante solicitação
  2. Envie mensagens da caixa de entrada para este email enquanto o endereço de email é válido
  3. Renovar endereço de email

Uma maneira bastante adequada nesse e em muitos outros casos para receber atualizações do Telegram é usar o Webhook. Somente o endereço do script com https é necessário. O uso do Certbot para configurar o certificado de domínio ssl é descrito em detalhes nas instruções de DO.

Para interagir com a API do Telegram Bot, eu uso minhas próprias práticas recomendadas. Alguém prefere usar bibliotecas populares. O envio de mensagens com botões para telegramas se tornou uma coisa familiar, já que muitos artigos foram escritos.

A geração de endereços de email temporários é essencialmente a saída do próximo endereço em ordem. Criei uma tabela para endereços de email no banco de dados, em que um ID do tipo int com incremento automático identifica exclusivamente o destinatário. A conversão de um ID numérico em um endereço de sequência é realizada à medida que um número é traduzido em outro sistema numérico, onde todo o alfabeto latino está disponível como "números". 26 letras comparadas com números fornecem uma boa redução no comprimento do identificador. Provavelmente, eu também poderia usar letras maiúsculas, números e alguns caracteres sem problemas para reduzir ainda mais o tamanho dos endereços emitidos, mas deixei apenas pequenas letras latinas.

Funções para traduzir um ID numérico em uma string e vice-versa:

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

Um dos principais benefícios do uso do serviço de correio temporário é a ausência de spam. Mas se os endereços estiverem em ordem, você poderá fazer uma lista dos endereços mais próximos que serão emitidos e enviar com êxito. Para resolver esse problema, adicionei uma sequência aleatória ao ID do destinatário. Para distinguir entre id e o componente aleatório no endereço, decidi sempre iniciar o componente aleatório com um dígito.

Escrevemos uma linha aleatória do endereço de e-mail emitido no banco de dados, juntamente com a identificação do destinatário, a identificação do usuário no telegrama e a hora em que a caixa postal foi emitida.

Parece que você nem precisa armazenar e-mails recebidos - eles enviaram para telegramas e é isso. Mas e as letras html? Eles não podem ser exibidos em uma mensagem de bate-papo. Resta registrar as mensagens html recebidas no banco de dados e exibi-las no site e enviar ao usuário um link que inclua o ID da mensagem e a próxima senha gerada. Para limpar o banco de dados com a coroa na programação, é lançado um script php que remove as mensagens html recebidas há mais de uma hora.

Posteriormente, nos telegramas do bot, adicionei botões que estendem a validade da caixa de correio em 10 ou 60 minutos, além de um botão que permite descobrir quanto, afinal, ele tem que viver antes que a recepção das mensagens recebidas seja interrompida.

Como estamos lidando com usuários registrados em um telegrama, você pode oferecer a oportunidade de ativar suas caixas de correio antigas, por exemplo, para restaurar uma senha esquecida em um site ou para qualquer outra operação que exija confirmação por email. A caixa de correio emitida "aceita" as mensagens recebidas somente quando o usuário precisar; no restante do tempo, o possível spam é ignorado.



Lista de desejos para o futuro:

  • Criar versão da web [concluída]
  • Configure uma alteração rápida do domínio do email em alguns cliques / comandos (como?)

Referências


Bot de telegrama: @tmpmailbot

Um artigo que descreve a configuração do sendmail

Biblioteca PHP para analisar email

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


All Articles