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 fundoHá 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?
- Emita um novo endereço de email temporário mediante solicitação
- Envie mensagens da caixa de entrada para este email enquanto o endereço de email é válido
- 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:
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 sendmailBiblioteca PHP para analisar email