Como controlar uma aplicação web por e-mail?Ou como executar o script php enviando um email?

StackOverflow https://stackoverflow.com/questions/46777

  •  09-06-2019
  •  | 
  •  

Pergunta

Quero rodar uma aplicação web em php e mysql, usando o framework CakePHP.E para manter o limite de uso do site muito baixo, não quero usar o login padrão com nome de usuário/senha.(E também não quero incomodar meus usuários com algo como OpenID.Vai para o tipo de usuário.)

Então, estou pensando que os usuários poderão fazer login enviando um email para login@domain.com sem necessidade de assunto ou conteúdo.E eles receberão, em resposta, um e-mail com um link que fará o login (conterá um hash).Também deixarei que os usuários realizem algumas ações sem sequer visitar o site, basta enviar um email com command@domain.com e o comando será executado.Presumirei que os usuários e seus provedores de e-mail cuidam da segurança de suas contas de e-mail e, como tal, não há necessidade disso em meu site.

Agora, como faço para que um e-mail seja enviado para uma conta que não é lida por humanos e seja disparado algum script (basicamente um "cliente de navegador fictício" chama um URL (e o cakephp cuidará do resto)?


Nunca usei um cron job antes, mas acho que entendo seu propósito ou como geralmente funcionam.Não posso fazer com que o script seja chamado por pessoas aleatórias que visitam o site, pois essa solução não funcionará por vários motivos.Acho que gostaria de ouvir mais sobre a possibilidade de executar o script como resposta a um e-mail recebido, se alguém tiver alguma opinião sobre isso.Se for executado como um cron job, ele verificará apenas a cada X minutos e os usuários terão um atraso na resposta (se bem entendi).

Como haverá endereços de e-mail diferentes para comandos diferentes, como Conecte-se@domain.com e eu sabemos o que fazer e como fazer com base no e-mail do remetente, nem preciso do conteúdo, assunto ou qualquer outro cabeçalho do e-mail.


Há muita preocupação com a segurança desta aplicação, entendo os problemas, mas sem revelar meu conceito, não acho que seja um grande problema para o que estou fazendo.Também sobre a questão da usabilidade, realmente não existe.Será apenas um login para fornecer alterações no perfil de um usuário se/quando eles precisarem disso e de outro comando.E este é o email principal e é muito fácil de lembrar e o início de todo esse conceito.

Foi útil?

Solução

Eu usei o classe pop3 php com grande sucesso (há também um Módulo POP3 pêra).

Usar a classe pop3 é mais ou menos assim:

require ('pop3.php');

$pop3 = new pop3_class();
$pop3->hostname = MAILHOST;
$pop3->Open();
$pop3->Login('myemailaddress@mydomain.com', 'mypassword');

foreach($pop3->ListMessages("","") as $msgidx => $msgsize)
{
    $headers = "";
    $body = "";

    $pop3->RetrieveMessage($msgidx, $headers, $body, -1);
}

Eu o uso para monitorar uma caixa de correio POP3 que alimenta um banco de dados.

Ele é chamado por um cronjob que usa o wget para chamar a URL do meu script php.

*/5 * * * * "wget -q --http-user=me --http-passwd=pass 'http://mydomain.com/mail.php'" >> /dev/null 2>&1

Editar

Estive pensando na sua necessidade de que os usuários enviem determinados comandos do site por e-mail.

Não seria mais fácil ter um único endereço para o qual vários comandos pudessem ser enviados, em vez de ter vários endereços?

Acho que as preocupações de segurança também são bastante válidas.A menos que os comandos não sejam destrutivos ou não façam nada específico do usuário, o sistema estará totalmente aberto para qualquer pessoa que saiba como falsificar um endereço de e-mail (que seria todo mundo :)).

Outras dicas

Você precisará de algum tipo de serviço CronJob/Timer que verifique a caixa de correio regularmente e depois atue nela.Alternativamente, você deve verificar se o servidor de e-mail pode executar um script quando um e-mail chegar (ou seja,veja se é possível colocar um script de filtro de spam e "abusar" dessa funcionalidade para chamar seu script).

Com PHP puro, você está sem sorte, pois algo precisa acionar o script.Em uma página com MUITO tráfego, você pode fazer com que seu index.php ou qualquer outra coisa faça a verificação, mas quando ninguém visita seu site por um bom tempo, o e-mail não será enviado e você deve ter cuidado com "corrida condições" quando várias pessoas acessam o script ao mesmo tempo.

Editar: Basta manter uma falha de usabilidade em mente:Pessoas com vários PCs e sem cliente de e-mail em todos.Por exemplo, eu uso 4 PCs, mas apenas 1 (o meu principal) tem Mail Client instalado, e utilizo o Webmail para verificar os demais.Agora, fazer login e enviar um e-mail pelo Webmail não é a melhor usabilidade - para usar o SEU site, primeiro preciso fazer login em OUTRO site, redigir um e-mail através da interface de baixa qualidade que a maioria das ferramentas de Webmail possui e aguardar a resposta.Poderia muito bem usar o OpenID lá :-)

Se o seu servidor permitir, você pode usar um .avançar arquivo ou Procmail para iniciar um processo (php ou qualquer coisa) quando um email chega a um determinado endereço.

Você não quer incomodar os usuários com o OpenID, mas quer que eles lidem com esse esquema de e-mail.Em primeiro lugar, o e-mail pode demorar muito para ser enviado.Não há um horário garantido para a entrega de um e-mail.Nem é garantido que o e-mail chegará lá.Sei que as coisas geralmente são rápidas, mas não é incomum levar até 10 minutos para concluir uma viagem de ida e volta.Além disso, a menos que você esteja criptografando o e-mail, o link que você está enviando de volta será enviado abertamente.Isso significa que qualquer pessoa pode usar esse link para fazer login.Dependendo de quão seguro você deseja estar, isso pode ou não ser um problema, mas é definitivamente algo em que se pensar.Usar um método de login não padrão como esse vai dar muito mais trabalho do que provavelmente vale a pena, e não consigo ver nenhuma vantagem em todo o processo.

Também estava pensando em usar o procmail para iniciar algum script.Há também o formail, que pode ser útil para alterar ou extrair cabeçalhos.Se você tiver acesso de administrador ao servidor de e-mail, também poderá usar /etc/aliases e apenas canalizar para o seu script.

Além das questões de usabilidade, você realmente deve pensar em segurança - na verdade, é muito simples enviar e-mail com um endereço de remetente falso, então eu não confiaria nele para nada crítico.

Concordo com todas as preocupações de segurança.Sua suposição de que "os usuários e seus provedores de e-mail cuidam da segurança de suas contas de e-mail" não está correta quando se trata do endereço de e-mail do remetente.

Mas como você perguntou especificamente "como faço para que um e-mail seja enviado para uma conta que não é lida por humanos e seja disparado algum script", recomendo usar o procmail para entregar o e-mail recebido para um script que você escreve.

Eu não chamaria um URL.Gostaria que o script realizasse o trabalho lendo a mensagem enviada no stdin.Dessa forma, o script não fica acessível a ninguém no site.

Para configurar isso, o endereço de e-mail que você fornece aos seus usuários deverá ser associado a um usuário real no sistema.No diretório inicial desse usuário, crie um arquivo chamado “.procmailrc”

Nesse arquivo, adicione estas duas linhas:

:0 hb:
| /path/to/program

Onde/Path/to/Program é o caminho completo para o script ou programa para lidar com a mensagem de entrada.Em seguida, crie o script com um código mais ou menos assim:

#!/usr/bin/php
<?php

$fp=fopen('php://stdin','r');
while($line = fgets($fp)) {
    [do something with each $line of input here]
}

?>

A mensagem de e-mail não permanecerá na caixa de correio, portanto, se você quiser salvá-la ou registrá-la, peça ao script para fazê-lo.

--
Bruce

Eu reconsideraria seriamente essa abordagem.O e-mail não tem uma confiabilidade muito alta.Existem todos os tipos de filtros de spam que podem interceptar e-mails com links, tornando o “comando” incompleto, sem mencionar os riscos de segurança.

É muito fácil falsificar o endereço do remetente em um e-mail.Você está basicamente abrindo seu sistema para qualquer pessoa.

Além disso, em vez de uma combinação de nome de usuário/senha, você repentinamente exige que os usuários se lembrem de uma lista de comandos para colocar na frente de um endereço de e-mail.Seria melhor fornecer-lhes um nome de usuário/senha e depois dar acesso a uma página de ajuda.

Em outras palavras, a usabilidade e a segurança deste esquema têm pontuações muito baixas.

Na verdade, não consigo encontrar nenhuma vantagem nessa abordagem que chegue perto de superar as enormes desvantagens.

Uma solução para evitar spam é garantir que a primeira linha, a última linha ou uma linha específica contenha uma determinada string, quase como uma senha, mas uma frase completa é melhor.

Só você tem a palavra ou palavras, bastante seguras, só lembre de deletar os mails após o uso e aqueles que não possuem a linha secreta.

Além da segurança e usabilidade, a entrega de e-mail pode ser outro problema.Dependendo do provedor de e-mail do usuário, a entrega do e-mail pode demorar de alguns minutos a algumas horas.

Há uma história educacional muito legal sobre thedailywtf. com em projetar software.A questão colocada deve ser resolvida por um design adequado, não por techo-woopla.

Alexander, por favor, leia a história vinculada e pense em luvas, não em navegação em páginas da web por e-mail.

PHP não é um martelo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top