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

20

Antecedentes: Se você configurou um servidor apache local para fins de desenvolvimento, talvez tenha encontrado o problema em que o sendmail demora muito (pelo menos um minuto) para enviar e-mails. Isso é extremamente frustrante se você estiver tentando depurar um problema com um email gerado por você.

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

1) encontre seu hostname (caso você tenha esquecido) usando este comando:

:~$ cat /hosts/hostname

myhostname

2) edite o arquivo /etc/hosts e 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.cf no 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 mail. Por exemplo:

mail('[email protected]', 'the subject', 'the message', null, '[email protected]');

Minha pergunta para meus colegas servidores de resgate é:

Quais alterações adicionais podem ser feitas para que eu não tenha que usar a opção sendmail -f? Embora não seja muito difícil adicionar a opção -f, é um problema quando o seu CMS (como o Drupal) não usa a opção -f ao enviar mensagens. Você precisaria hackear um módulo central para adicionar essa opção.

    
por Michael B 24.08.2010 / 05:15

5 respostas

1

Isso funcionou para mim:

  • Instalar o postfix

Veja as instruções aqui sobre como fazer isso aqui: link (Pode já estar instalado, e o binário 'sendmail' pode ser um alias para o postfix)

  • Siga as instruções aqui:

link

mkfifo /var/spool/postfix/public/pickup

Find the sendmail process

ps aux | grep mail

Kill it

kill <thepid>

Restart postfix

/etc/init.d/postfix restart

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

    
por 13.01.2011 / 06:04
6

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

    
por 24.08.2010 / 06:12
0

Ao observar o tráfego da rede (pense em tcpdump ) ou executando um strace em seus processos do sendmail ou apache, você deve ter uma idéia de por que esse atraso existe. que você pode consertar o problema da raiz.

Normalmente, os atrasos nesse intervalo são devidos a falhas nas pesquisas de DNS, mas você não saberá até aparecer. A menos que você corrija o problema subjacente, ele provavelmente acabará sendo um problema, não importa como você tente contorná-lo.

    
por 24.08.2010 / 06:27
0

Eu nunca encontrei um problema usando o mail () no PHP que não foi resultado de um problema no MTA.

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

Itens usuais para verificar se um servidor DNS está configurado corretamente na máquina (e pode resolver todos os endereços configurados no MTA) e que, se um retransmissor inteligente estiver configurado, o nome poderá ser resolvido em um endereço que o sistema pode conectar para.

    
por 24.08.2010 / 14:12
0

Isso pode ou não ser uma solução para você: adicione mail.force_extra_parameters = "[email protected]" ao seu arquivo php.ini . Faz o PHP anexar automaticamente [email protected] como um quinto parâmetro para a função mail () do PHP.

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

    
por 24.08.2010 / 14:20