E-mail para um aplicativo da Web?

1

Alguém pode me dizer como posso fazer o seguinte:

Minha empresa construiu seu próprio sistema de gerenciamento de projetos com Linux, Apache, MySQL e PHP. No banco de dados do aplicativo da web, há uma tabela chamada t_project que armazena informações sobre todos os projetos da empresa. Meu chefe quer que eu crie uma solução em que, se alguém enviar um email para (t_project.project_id) @meusite.com, o aplicativo da Web gravará o email em uma tabela de banco de dados chamada t_project_message.

Como resolvo este problema? O que preciso aprender?

Notas adicionais Eu só notei que o texto na minha pergunta caiu "(t_project.project_id) @meusite.com" que eu adicionei de volta. Então isso significa que eu vou precisar de tantas contas de e-mail quantos os projetos no meu banco de dados? Isso pode ser dezenas de milhares ...

    
por John 19.11.2010 / 01:27

4 respostas

3

Qual servidor de e-mail você está executando no host PHP? Para vários aplicativos PHP, sou responsável por usar o Exim e, com o Exim I, configurar um roteador de transporte. Isso significa que o Exim aceitará a mensagem e, em seguida, executará um script PHP e passará a mensagem para o script PHP STDIN. O script PHP faz as coisas com base no conteúdo da mensagem.

O roteador / config abaixo aceitará mensagens para [email protected], [email protected] e tckt-{id#}@helpdesk.example.org. Com o Exim, a configuração de transporte e roteador é extremamente flexível, a seguir é apenas uma maneira possível de configurar isso. Eu duvido que o que eu configurei se aplicaria diretamente ao seu projeto, você provavelmente precisaria ler em Exim . Eu também tenho certeza que outros servidores de email também são capazes de fazer a mesma coisa. Eu não estou familiarizado com eles.

### router/050_helpdesk_router
#################################
helpdesk_router:
  driver = accept
  domains = helpdesk.example.org
  caseful_local_part = true
  local_parts = lsearch;/etc/exim4/helpdesk
  local_part_suffix_optional
  local_part_suffix = -*
  transport = helpdesk_transport


### transport/20_helpdesk_router
#################################

helpdesk_transport:
  driver = pipe
  command = /usr/bin/php ${lookup{$local_part}lsearch{/etc/exim4/helpdesk}} $local_part '${if def:local_part_suffix {$local_part_suffix}}'
  # return the data from the script on a failure
  return_fail_output = true
  # temporary error
  temp_errors = 10
  # set a timeout for 30 seconds
  timeout = 30s
  current_directory = /home/helpdeskadmin/
  home_directory = /home/helpdeskadmin/
  user = helpdeskadmin
  group = helpdeskadmin

### /etc/exim4/helpdesk
#################################
helpdesk:   /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php
tckt:       /srv/www/helpdesk.example.org/www/helpdesk/mail/recv.php

Para dar um ponto de partida na parte de análise de correspondência da pergunta. Eu uso Zend_Mail para analisar a mensagem recebida e enviar e-mail.

Would you have time to also tell me advantages/disadvantages of your method vs. Ben's method?

Com um gancho no MTA, como eu descrevo.

  • Não há sondagem de pesquisa. Quando o servidor de envio de e-mails se conecta, seu processo será iniciado imediatamente para aceitar a mensagem. Com uma caixa de correio e pesquisa, você terá que esperar até o próximo ciclo de votação.
  • Você pode rejeitar ou responder a mensagens inválidas imediatamente e não arriscar o potencial do seu aplicativo ser uma fonte de back-scatter. Talvez você queira rejeitar a mensagem se o endereço não estiver correto.
  • Você disse que tinha muitos projetos. Com um transporte, você não precisa criar muitas caixas de correio e pesquisar cada caixa de correio separadamente. Se você definir seu transporte adequadamente, poderá obter uma configuração de transporte para lidar com tudo.

Normalmente, com o PHP, é feita uma pesquisa de caixa de correio a partir do cron. Do cron você teria que ter muito cuidado para ter certeza de que sua pesquisa faz algum tipo de bloqueio para que você não responda ou processe a mesma mensagem duas vezes.

    
por 19.11.2010 / 03:31
2

A maneira como fiz isso com frequência no passado é executar fetchmail a cada X minutos via cron. O Fetchmail recupera o e-mail via IMAP ou POP3 e pode enviar o e-mail por meio de um script de manipulador / analisador de algum tipo (geralmente escrito em perl, python, etc.). O script do analisador retiraria todos os dados que você necessitasse da mensagem e então inseriria essa informação nos lugares apropriados em seu banco de dados.

    
por 19.11.2010 / 01:32
1

Dependendo do seu servidor de e-mail, você pode escrever um script PHP que pesquisará uma caixa de correio no servidor com o IMAP e executará ações de acordo.

Existe uma extensão IMAP disponível para PHP que pode receber mensagens de e-mail do servidor, bem como movê-las no servidor ou excluí-las completamente quando você as tiver confirmado no banco de dados.

Você pode agendar isso conforme apropriado com o cron.

    
por 19.11.2010 / 01:35
1

Embora você possa pesquisar uma caixa de correio POP, é uma solução muito ineficiente. Assumindo que você pode rotear o correio para o sistema de destino, uma solução melhor é manipular o pedido de forma síncrona. Embora você possa usar o mecanismo .forward, recomendo usar o procmail como MDA - ele permite que você crie scripts de comportamentos complexos, como execução de programas, encaminhamento de cópias, respostas condicionais e muito mais.

    
por 19.11.2010 / 10:50

Tags