A função php mail () é muito lenta na máquina de desenvolvimento local


21

Antecedentes: Se você configurou um servidor apache local para fins de desenvolvimento, pode ter encontrado um problema no qual o sendmail leva muito tempo (pelo menos um minuto) para enviar e-mails. Isso é extremamente frustrante se você estiver tentando depurar um problema com um email que você gerou.

Existem várias postagens no fórum na internet que discutem esse problema. No entanto, nenhum dos temas descreveu o que fazer em detalhes suficientes para o meu conhecimento limitado. Aqui estão as etapas que funcionaram para mim:

1) encontre o seu nome de host (caso você tenha esquecido) usando este comando:

:~$ cat /hosts/hostname

myhostname

2) edite o arquivo /etc/hostse verifique se a primeira linha é a seguinte:

127.0.0.1 localhost.localdomain localhost myhostname

3) edite o arquivo de configuração do sendmail ( /etc/mail/sendmail.cfno Ubuntu) e descomente a linha#O HostsFile=/etc/hosts

4) Reinicie o computador. O computador deve inicializar muito mais rápido agora e a função mail () deve retornar quase imediatamente. NO ENTANTO, os e-mails não serão realmente enviados, a menos que você siga a etapa 5.

5) Você deve usar a opção sendmail '-f' sempre que usar a função de email. Por exemplo:

mail('recipient@somewhere.com', 'the subject', 'the message', null, '-fsender@somewhere.com');

Minha pergunta para meus colegas serverfaulters é:

Que outras alterações podem ser feitas para que eu não precise usar a opção sendmail -f? Embora não seja muito difícil adicionar a opção -f, é um problema quando o CMS (como o Drupal) não usa a opção -f ao enviar email. Você precisaria hackear um módulo principal para adicionar esta opção.


1
no meu sistema Ubuntu o comando écat /etc/hostname
zkent

Respostas:


6

Bem, eu sei que isso não é o que você está perguntando, mas por que você não tenta o Postfix ou o Exim? Ambos estão disponíveis para o Ubuntu (o Postfix é até o mta padrão nos sistemas Ubuntu) e ambos fornecem um comando 'sendmail' compatível que funciona muito bem. O sendmail do IMHO é meio datado e você terá melhores chances de suporte com o MTA mais moderno.


Mesmo que existam sistemas de correio melhores que o sendmail, o problema está na manutenção de um servidor de desenvolvimento que espelha o servidor de produção. O sendmail é o agente de email padrão para php.
Michael B

1
Você quer dizer sendmail o software ou sendmail o binário? Como o Exim e o Postfix também têm o sendmailbinário que aceita as mesmas opções que o sendmail original, por questões de compatibilidade.
Coredump

Eu não sou muito fã do Exim por experiências anteriores, mas experimentei o Postfix e resolvi os problemas que estávamos acontecendo com o Sendmail imediatamente!
quickshiftin

2

Isso funcionou para mim:

  • Instalar o postfix

Veja instruções aqui sobre como fazer isso aqui: https://help.ubuntu.com/community/Postfix (Ele já pode estar instalado e o binário 'sendmail' pode realmente ser um alias para o postfix)

  • Siga as instruções aqui:

http://lenss.nl/2009/01/making-php-mail-work-on-ubuntu-through-postfix/

mkfifo /var/spool/postfix/public/pickup

Encontre o sendmailprocesso

ps aux | grep mail

Mate isso

kill <thepid>

Reiniciar postfix

/etc/init.d/postfix restart

Eu acho que você pode simplesmente definir o parâmetro 'myorigin' para qualquer nome de domínio ativo, como um nome de domínio que você possui.


Perfeito! Fez isso APÓS me atormentar por duas horas. =)
Hannes Schneidermayer

1

Isso pode ou não ser uma solução para você: adicione mail.force_extra_parameters = "-fsender@somewhere.com"ao seu arquivo php.ini . Faz o PHP anexar automaticamente -fsender@somewhere.com como um quinto parâmetro da função mail () do PHP.

Esse é um valor codificado e aplicável apenas no php.ini, portanto não será muito flexível, mas talvez funcione para você no seu caso de desenvolvimento?


0

Observando o tráfego da rede (pense tcpdump) ou executando um processo straceno sendmail ou no apache, você poderá ter uma idéia do porquê desse atraso, para que possa corrigir o problema raiz.

Geralmente, os atrasos nesse intervalo ocorrem devido à falha nas pesquisas de DNS, mas você não saberá até que procure. A menos que você corrija o problema subjacente, ele provavelmente acabará sendo um problema, não importa como você tente solucionar o problema.


1
O atraso estava sendo causado pelo nome do host ser uma única palavra em vez de um FQDN (nome de domínio totalmente qualificado). Ao apontar sendmail para / etc / hosts e ter localhost.domain como o primeiro nome de domínio (que é um FQDN), não há atraso. Isso foi corrigido nas etapas 1 a 4. O problema restante é ter que usar '-f' - ainda é uma grande melhoria ao esperar 2 minutos para enviar e-mails.
Michael B

0

Eu nunca me deparei com um problema ao usar mail () no PHP que não era resultado de um problema no MTA.

No seu arquivo php.ini, ele mostrará qual comando é executado para enviar um email (padrão: "sendmail -t -i"). Tente enviar um email da linha de comando usando isso - aposto que é lento.

Itens comuns a serem verificados são se um servidor DNS está configurado corretamente na máquina (e pode resolver todos os endereços configurados no MTA) e se um relé inteligente está configurado, o nome pode ser resolvido em um endereço ao qual o sistema possa se conectar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.