с сайта не могу отправить письмо mail - php

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модератор: SLEDopit

Ответить
v4567
Сообщения: 162
ОС: Devuan

с сайта не могу отправить письмо mail - php

Сообщение v4567 »

Есть тестовая страничка:

Код: Выделить всё

<?php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 'On');
ini_set('display_startup_errors', 'On');
if (mail("user@ukr.net", "1234test1234", "12qwerty34"))
{
 echo "Почта работает.";
}
else
{
 echo "Почта не работает.";
}
echo phpinfo();
?>


Открываю её и письмо не отправляется.

Установлен apache2 и к немо следующие пакеты php:

Код: Выделить всё

apt-get -y install php7.0
apt-get -y install php7.0-common
apt-get -y install php7.0-curl
apt-get -y install php7.0-mysql
apt-get -y install php7.0-cli
apt-get -y install libapache2-mod-php7.0
apt-get -y install php7.0-gd


После установки этих пакетов была выполнена команда a2enmod php7 и потом запущен апач.

Код: Выделить всё

uname -a
Linux ukemp.ukrkran.local 4.4.0-96-generic #119-Ubuntu SMP Tue Sep 12 14:58:51 UTC 2017 i686 i686 i686 GNU/Linux

apache2 -version
Server version: Apache/2.4.18 (Ubuntu)
Server built:   2017-09-18T15:09:02

php --version
PHP 7.0.22-0ubuntu0.16.04.1 (cli) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.22-0ubuntu0.16.04.1, Copyright (c) 1999-2017, by Zend Technologies

ldd /usr/lib/apache2/modules/libphp7.0.so
       linux-gate.so.1 =>  (0xb7745000)
        libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xb733d000)
        libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb7322000)
        libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb72ad000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7258000)
        libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb7253000)
        libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7072000)
        libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0xb7008000)
        libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0xb6e1b000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6c65000)
        libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6c48000)
        /lib/ld-linux.so.2 (0xb7746000)
        libicuuc.so.55 => /usr/lib/i386-linux-gnu/libicuuc.so.55 (0xb6ab2000)
        liblzma.so.5 => /lib/i386-linux-gnu/liblzma.so.5 (0xb6a8c000)
        libicudata.so.55 => /usr/lib/i386-linux-gnu/libicudata.so.55 (0xb51d3000)
        libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb505c000)
        libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb503f000)


В качестве мта использую ssmtp

Вот часть конфига apache1.conf относящегося к открываемому сайту с которого должно отправляться письмо:

Код: Выделить всё

<VirtualHost 192.168.5.254:80>
 DocumentRoot /data/web/apache/www/sait2.ru
 ServerName sait2.ru
 ServerAlias www.sait2.ru
 <Directory /data/web/apache/www/sait2.ru>
  Options Includes
  AllowOverride all
 </Directory>
 ErrorLog /var/log/apache2/sait2.ru/error.log
 CustomLog /var/log/apache2/sait2.ru/access.log combined
</VirtualHost>


Вот содержимое файлов

/etc/apache2/mods-available/php7.0.conf

Код: Выделить всё

<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
    SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch ".+\.phps$">
    SetHandler application/x-httpd-php-source
    # Deny access to raw php sources by default
    # To re-enable it's recommended to enable access to the files
    # only in specific virtual host or directory
    Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
    Require all denied
</FilesMatch>

# Running PHP scripts in user directories is disabled by default
#.
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_flag engine Off
    </Directory>
</IfModule>


/etc/apache2/mods-available/php7.0.load

Код: Выделить всё

# Conflicts: php5
LoadModule php7_module /usr/lib/apache2/modules/libphp7.0.so


Они стандартные.

Вот некоторое содержимое файлов:
/etc/php/7.0/apache2/php.ini
/etc/php/7.0/cgi/php.ini
/etc/php/7.0/cli/php.ini
/etc/php/7.0/fpm/php.ini

Код: Выделить всё

display_errors = On
display_startup_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
SMTP = localhost
smtp_port = 465
sendmail_path = /usr/sbin/ssmtp -t
mail.add_x_header = On
mail.log = /var/log/php/php_mail.log
date.timezone = Europe/Kiev


ssmtp настроен правильно и из командной строки письмо прекрасно отправляется, мало того если в консоли выполнить команду:

php /data/web/apache/www/sait2.ru/index.php

то письмо то же прекрасно отправляется!

В этот файл я в последствии включил phpinfo()

и сравнил вывод информации в браузере и в консоли, они отличались только тем, что когда страницу открываю в браузере используется конфиг /etc/php/7.0/apache2/php.ini, а когда использую выше приведённую команду, то конфиг /etc/php/7.0/cli/php.ini

Я сравнил эти файлы и они оказали различны, вот различия:

Код: Выделить всё

diff /root/php/php.ini /etc/php/7.0/cli/php.ini
299c299
< disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,
---
> disable_functions =
359c359
< expose_php = Off
---
> expose_php = On
389c389
< memory_limit = 128M
---
> memory_limit = -1
462c462
< display_errors = Off
---
> display_errors = On
473c473
< display_startup_errors = Off
---
> display_startup_errors = On
484d483
<


Я взял и скопировал файл /etc/php/7.0/cli/php.ini в папки /etc/php/7.0/apache2/ /etc/php/7.0/cgi/ /etc/php/7.0/fpm/
Поэтому в этих папках фалы php.ini стали одинаковы, перезапустил апач, открыл страницу но письмо не отправилось, причём при удачной отправке письма по команде php /data/web/apache/www/sait2.ru/index.php и при открытии страницы в логах /var/log/php/php_mail.log одна и та же запись:

Код: Выделить всё

[11-Oct-2017 12:05:07 Europe/Kiev] mail() on [/data/web/apache/www/sait2.ru/index.php:5]: To: user@ukr.net -- Headers:.


Файл /var/log/php/php_errors.log пустой

Я подумал что проблема в модуле для апача /usr/lib/apache2/modules/libphp7.0.so

У меня для другой системы был ранее собран из исходников модуль для апача пятой версии, по размерам он был в 6 раз больше чем этот. Этот модуль точно работает, так как на другой системе письмо прекрасно отправляется. Я взял его (к нему не хватало нескольких библиотек, я их просто скопировал после чего выполнил команду ldconfig), проверил библиотеки были все. Запустил апач, он запустился нормально. Открываю сайт, но письмо не отправляется. В браузер никаких ошибок не пишет, хотя как видно я вывод включал. Просто срабатывает if и пишет, что почта не работает и письмо действительно не отправляется. Получается, что дело не в этом модуле, тогда не понятно где, конфиги одинаковы для апача и клиента, ошибок не пишет. Может кто подскажет как подробное логирование включить.

В логаг апача вот что:

Запуск апача:
/usr/sbin/apache2 -k start

Код: Выделить всё

ps axu | grep apache
root      6266  0.7  1.3 136500 28196 ?        Ss   12:37   0:00 /usr/sbin/apache2 -k start
apache    6267  0.0  0.3 136524  7984 ?        S    12:37   0:00 /usr/sbin/apache2 -k start
apache    6268  0.0  0.3 136524  7984 ?        S    12:37   0:00 /usr/sbin/apache2 -k start
apache    6269  0.0  0.3 136524  7984 ?        S    12:37   0:00 /usr/sbin/apache2 -k start
apache    6270  0.0  0.3 136524  7984 ?        S    12:37   0:00 /usr/sbin/apache2 -k start
apache    6271  0.0  0.3 136524  7984 ?        S    12:37   0:00 /usr/sbin/apache2 -k start
root      6273  0.0  0.0   5100   900 pts/0    S+   12:38   0:00 grep apache


/var/log/apache2/access.log пустой

в /var/log/apache2/error.log вот что:

Код: Выделить всё

[Wed Oct 11 12:37:58.188215 2017] [mpm_prefork:notice] [pid 6266] AH00163: Apache/2.4.18 (Ubuntu) PHP/7.0.22-0ubuntu0.16.04.1 configured -- resuming normal operations
[Wed Oct 11 12:37:58.188374 2017] [core:notice] [pid 6266] AH00094: Command line: '/usr/sbin/apache2'


открываю сайт, пробую двумя браузерами, очень старой оперой и свежим firefox-сом

/var/log/apache2/sait2.ru/error.log пустой

в /var/log/apache2/sait2.ru/access.log вот что:

Код: Выделить всё

192.168.5.226 - - [11/Oct/2017:12:40:39 +0300] "GET / HTTP/1.1" 200 90683 "-" "Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.15"
192.168.5.226 - - [11/Oct/2017:12:42:36 +0300] "GET / HTTP/1.1" 200 90646 "-" "Mozilla/5.0 (X11; Linux i686; rv:52.0) Gecko/20100101 Firefox/52.0"


В чём причина не работы функции mail и как включить очень подробное логирование так и не знаю.
За помощь заранее благодарен!


Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: с сайта не могу отправить письмо mail - php

Сообщение Bizdelnick »

Попробуйте для начала отправить письмо локальному пользователю.
Ну и почитайте комментарии к https://secure.php.net/manual/en/function.mail.php
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
v4567
Сообщения: 162
ОС: Devuan

Re: с сайта не могу отправить письмо mail - php

Сообщение v4567 »

Почитал по ссылке, вроде всё правильно. Пробовал заменить двойные кавычки на одинарные, не помогло.

Вот так:

php /data/web/apache/www/sait2.ru/index.php

всё работает, письмо отправляется и я его получаю.

Не работает если я открываю этот файл в браузере как страницу.
Получается что дело в модуле: /usr/lib/apache2/modules/libphp7.0.so
но я брал работающий (правда пятой версии) /usr/lib/apache2/modules/libphp5.so подкидывал библиотеки и то же письмо не отправлялось.
Для локального пользователя в ssmtp какой парольписать? Пользователя я так понимаю надо взять user@localhost?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: с сайта не могу отправить письмо mail - php

Сообщение Bizdelnick »

v4567 писал(а):
11.10.2017 14:42
Почитал по ссылке

До этого места дочитали?
Send mail with minimal requirements from email services.

Код: Выделить всё

<?php
    $encoding = "utf-8";

    // Preferences for Subject field
    $subject_preferences = array(
        "input-charset" => $encoding,
        "output-charset" => $encoding,
        "line-length" => 76,
        "line-break-chars" => "\r\n"
    );

    // Mail header
    $header = "Content-type: text/html; charset=".$encoding." \r\n";
    $header .= "From: ".$from_name." <".$from_mail."> \r\n";
    $header .= "MIME-Version: 1.0 \r\n";
    $header .= "Content-Transfer-Encoding: 8bit \r\n";
    $header .= "Date: ".date("r (T)")." \r\n";
    $header .= iconv_mime_encode("Subject", $mail_subject, $subject_preferences);

    // Send mail
    mail($mail_to, $mail_subject, $mail_message, $header);
?>

А до этого?
Often it's helpful to find the exact error message that is triggered by the mail() function. While the function doesn't provide an error directly, you can use error_get_last() when mail() returns false.

Код: Выделить всё

<?php
$success = mail('example@example.com', 'My Subject', $message);
if (!$success) {
    $errorMessage = error_get_last()['message'];
}
?>
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить