A função mail () do PHP está funcionando na CLI, mas não no Apache

1

Estou usando msmtp como retransmissão e tentando enviar um email com a função mail (). Funciona perfeitamente no CLI, mas não faz nada no Apache. Minhas configurações do PHP para cli e apache são idênticas, não há erros em nenhum dos logs e estou realmente sem ideias.

Alguma ideia de como isso pode ser causado?

    
por Jacob S. 03.04.2017 / 13:52

3 respostas

2

Eu encontrei a solução para esse problema. Estou usando o msmtp , que é um proxy SMTP e funciona similar ao sendmail, assim, ao tentar enviar um email, o comando msmtp é chamado de php com sintaxe similar ao sendmail.

Agora, o comando msmtp será executado pelo mesmo usuário em que o apache2 está sendo executado. No meu caso www-data.

Existe um arquivo de configuração para o msmtp (/etc/.msmtp_php no meu caso) que precisa ser legível pelo usuário do www-data.

O motivo pelo qual o CLI estava funcionando e o Apache PHP não, é que eu estava executando o CLI sob root, que tinha as permissões corretas para o arquivo, mas o apache2 está rodando em www-data, que não tem essas permissões.

So the solution is: chown the /etc/.msmtp_php file to www-data:www-data and chmod the same file to 0600, otherwise, msmtp will complain about loose permissions.

    
por 05.04.2017 / 10:55
1

Uma forma de enviar e-mails usando a função exec ().

exec('usr/bin/mail <parameter>', $output); //$output for debugging

Verifique a saída para resposta, mas você ainda precisa resolver suas configurações para usar a função php mail() .

    
por 03.04.2017 / 14:11
1

Primeiro de tudo: Verifique se você está realmente usando o arquivo php.ini em que acredita.

O Apache pode, por exemplo, usar diferentes php.ini localização para cada usuário, se mod_suphp estiver habilitado. Com o suPHP, o local é definido com a diretiva suPHP_ConfigPath em mods-enabled/suphp.conf e o caminho padrão do PHP é compilado mesmo quando o PHPIniDir diferente é definido para a configuração global. ( PHP: O arquivo de configuração fornece mais informações sobre a ordem em que php.ini é pesquisado.)

  1. Você pode obter o php.ini local usando <?php phpinfo(); ?> no mesmo diretório.
  2. Você pode obter diretamente o servidor SMTP atual usado pela função mail() com ini_get() :

    <?php echo ini_get('SMTP') . ":" . ini_get('smtp_port'); ?>

Se o servidor SMTP for o mesmo, a função mail() deve retornar TRUE se o e-mail foi aceito para entrega e, do contrário, FALSE . Em ambos os casos, se a função puder conectar o servidor SMTP, mais informações sobre a conexão poderão ser encontradas no arquivo de log do servidor SMTP .

Se mail() retornar FALSE sem se conectar ao SMTP, verifique se você tem safe_mode ativado e mail() additional_parameters definidos . Do changelog (PHP versão 4.2.3):

The additional_parameters parameter is disabled in safe_mode and the mail() function will expose a warning message and return FALSE when used.

    
por 03.04.2017 / 15:33