15

Возможно, ваш хост отключил функцию mail()

Возможно, ваш хост отключил функцию mail() - Украина, Польша, Германия.

Функция PHP mail(), Wp_mail() или mail() не работает на облачном хостинге VPS?

Я не знал об этой очень распространенной проблеме, пока не перенес свой блог с платформы Blogger на WordPress и не разместил его на Vultr, а затем не переместил его на сверхбыстрый облачный хостинг DigitalOcean. Однажды я забыл пароль своей учетной записи администратора WordPress и попытался сбросить его. И, к моему большому удивлению, я получил следующее сообщение об ошибке, в котором говорилось: «Ваш хост, возможно, отключил функцию mail()».

Не удалось отправить сообщение электронной почты.
Возможная причина: возможно, ваш хост отключил функцию mail().

В тот день я покопался в Интернете и обнаружил, что это очень распространенная проблема, для которой люди продолжают находить решение в различных ситуациях. Некоторые будут искать решение, когда они не могут получить какое-либо электронное письмо из контактной формы на сайте WordPress, в то время как у некоторых были проблемы с электронной почтой модерации комментариев, которые не будут отправлены администратору веб-сайта. В то время как у других были самые большие проблемы с доступом к их панели инструментов WordPress, поскольку электронное письмо для сброса пароля никогда не отправляется на зарегистрированную учетную запись электронной почты, и они получают ошибку «Ваш хост, возможно, отключил функцию mail()». Итак, как исправить этот WordPress, не отправляя никаких проблем с электронной почтой?

Что бы вы ни беспокоили, это всегда калечит вас, особенно когда вы запускаете свой сайт на VPS на базе Linux (виртуальный частный сервер) без какого-либо графического интерфейса cPanel или Plesk. Большинство быстрых VPS-серверов настроены на Ubuntu или CentOS. Управлять ими самостоятельно — это действительно сложная работа, особенно когда вы не являетесь экспертом в командах на основе Linux. VultrDigitalOceanCloudConeLinode и Atlantic.net являются одними из лучших и самых быстрых поставщиков услуг облачного хостинга по всему миру. Все они могут быть подписаны на учетную запись веб-хостинга с использованием программных стеков LAMP (Linux, Apache, MySQL и PHP) или LEMP (Linux, Nginx, MySQL и PHP). И у вас может быть аналогичная проблема с хостингом WordPress на любом из них.

Это очень распространенная проблема, что функция PHP mail(), которая отвечает за отправку электронных писем, связанных с WordPress, таких как — электронные письма с сбросом пароля, уведомления о комментариях, электронные письма контактной формы, не включена или не настроена по умолчанию. В этом посте мы обсудим, для чего используется PHP mail() в WordPress и как его включить, чтобы позволить WordPress отправлять электронную почту с сбросом пароля. Также я покажу вам очень простой способ включить и настроить функцию PHP mail() или mail() на Vultr Cloud Compute Server (виртуальный облачный хостинг-сервер Vultr).

Функция PHP mail() в WordPress

WordPress построен на PHP и использует PHP mail() для отправки электронных писем в разных ситуациях. Она также называется функцией «Wp_mail()» или просто функцией «mail()». Однако функция PHP mail() использует программу под названием «sendmail» для работы или отправки электронной почты с использованием «sendmail_path». Часто эта программа устанавливается по умолчанию вместе со стеком LAMP или LEMP. Настройки и конфигурации «sendmail» также обновляются в файл «php.ini», который используется веб-сервером для выполнения сотен задач.

Таким образом, в основном любой веб-сайт, построенный на PHP, может воспользоваться функцией PHP mail() для отправки электронных писем непосредственно с вашего веб-сайта, не прося вас предоставить SMTP или пароль для входа в учетную запись электронной почты, используемую для отправки электронной почты. На самом деле это не так хорошо, как кажется, потому что любой может настроить свой веб-сайт для отправки почты для любого домена XYZ, что всегда является причиной того, что большинство электронных писем WordPress помечены как [СПАМ] Gmail, Yahoo, Outlook или аналогичными другими поставщиками электронной почты. Иногда они даже блокируются Gmail, Yahoo или другими подобными поставщиками электронной почты, чтобы предотвратить спам и защитить свою сеть.

Это также причина, по которой некоторые хостинг-провайдеры WordPress просят своих пользователей использовать только электронную почту, связанную с доменом, на котором установлен WordPress. Некоторые провайдеры также используют политику безопасности для блокировки отправки электронных писем WordPress из домена, отличного от того, на котором установлен WordPress. Но здесь мы сосредоточимся на функции PHP mail(), которая не может доставлять электронную почту WordPress. Позвольте мне упомянуть наиболее распространенные причины «WordPress не отправляет электронную почту на облачные хостинговые сервисы, такие как Vultr, DigitalOcean, Cloudcone и т. Д.».

Распространенная причина, по которой WordPress не может отправлять письма или PHP mail() не работает

  1. Функция PHP Mail() отключена в php.ini
  2. Неправильная настройка имени хоста в файлах /etc/hosts или виртуального хоста (vhosts)
  3. sendmail‘ не установлен
  4. sendmail неправильно настроен или ‘sendmail_path‘ отсутствует в php.ini файле
  5. Брандмауэр блокирует трафик
  6. SMTP-порт заблокирован хостинг-провайдером

#1. Функция PHP Mail() отключена в php.ini

Возможно, ваш хост отключил функцию mail()

Чтобы узнать, отключена ли функция PHP mail() в файле php.ini, необходимо сначала открыть файл php.ini. Файл ‘php.ini‘ часто находится в папке в /etc/php/. Его путь варьируется в зависимости от версии PHP и ОС, установленной на вашем VPS. В один клик приложение WordPress с Vultr, путь к файлу php.ini составляет «/etc/php/7.0/fpm/php.ini», в то время как то же приложение WordPress в один клик на DigitalOcean (с LAMP) имеет свой путь в «/etc/php/7.2/apache2/php.ini». Вы можете легко найти путь к php.ini файлу, загрузив простой файл php со следующим скриптом на ваш хостинг-сервер.

<?php
phpinfo();
?>

Просто скопируйте выше написанный php-скрипт и вставьте его в текстовый редактор, такой как notepad ++ или notepad или TextEdit на Mac и сохраните его как info.php. Загрузите информацию.php файл в корневой каталог вашего сайта WordPress, который может быть /var/www/hawkdive.com/html/, если не изменен.

После загрузки файла info.php попробуйте получить к нему доступ, введя следующий URL-адрес:
http:// ipaddress_of_your_server/info.php или http:// yourdomainname.com/info.php

Этот URL откроет веб-страницу с тоннами информации о версии PHP, ее настройках и конфигурации. Найдите опцию «Загруженный файл конфигурации» и запишите путь к файлу PHP.ini.

Путь к файлу php.ini - возможно, ваш хост отключил функцию mail()
Путь к php.ini файлу

Теперь SSH на ваш облачный хостинг сервер или VPS с помощью puTTY или консоли. Введите следующую команду, чтобы прочитать и отредактировать файл php.ini.

sudo nano /etc/php/7.0/fpm/php.ini

Теперь найдите директиву «disable_function=», если туда попала почта, удалите почту и нажмите «CTRL+X«, чтобы выйти, и введите «Y», чтобы подтвердить изменения, если таковые имеются, и нажмите enter, чтобы подтвердить запись файла. Теперь попробуйте сбросить пароль и посмотрите, получаете ли вы ту же ошибку «Ваш хост, возможно, отключил функцию mail()».

#2. Неправильная настройка имени хоста в файлах /etc/hosts или виртуального хоста (vhosts)

Есть два hosts-файла, которые вы хотите проверить здесь. Если кто-то из них имеет неправильную настройку, ваш WordPress не сможет отправить электронное письмо. Откройте консоль или войдите в свой VPS по SSH и введите следующую команду.

sudo nano /etc/hosts

Вы должны увидеть что-то похожее на одно из следующих

127.0.0.1 localhost localhost.localdomain
::1 localhost localhost.localdomain
103.82.101.18 webhost.hawkdivemedia.com

ИЛИ

127.0.0.1 localhost localhost.localdomain yourhostname

Если вы видите что-то похожее на что-либо из вышеперечисленного, вы хороши. Если это не так, то просто скопируйте вторую строку «127.0.0.1 localhost localhost.localdomain yourhostname» замените «yourhostname» фактическим именем, которое вы хотите дать своему серверу, например, «webhost» или «Darvis» или что-то еще». Нажмите клавиши CTRL+X, чтобы завершить работу, скажите «да», чтобы сохранить изменения, и нажмите клавишу ВВОД. Если вы находитесь на Vultr и ваш «/etc/hosts» пуст или никогда не был создан, создайте файл и пройдите только вторую строку.

Редактирование файла виртуальных хостов (vhosts)

После того, как файл /etc/hosts создан или обновлен, вам нужно проверить файл виртуальных hosts. Файлы виртуального хоста используются для размещения нескольких сайтов на одном VPS-сервере. Он имеет разный путь в зависимости от ОС. Nginx на стеке LEMP имеет свой файл виртуальных хостов, расположенный в /etc/nginx/conf.d/, в то время как Apache на стеках LAMP имеет свой путь к /etc/apache2/sites-available/. Vultr устанавливает LEMP одним щелчком мыши приложение WordPress, а файлами vhosts по умолчанию являются «/etc/nginx/conf.d/wordpress_http.conf» и «/etc/nginx/conf.d/wordpress_https.conf». Откройте оба виртуальных хоста, также известные как серверные блоки или конфигурационные файлы Nginx, и обновите атрибут «server_name» для домена вашего веб-сайта WordPress. Вы можете увидеть «_» в качестве значения для «server_name» — вам просто нужно заменить его реальным доменным именем, и оно должно выглядеть примерно так.

Файл конфигурации серверного блока Nginx
Файл конфигурации серверного блока Nginx — Установка Vultr

Сделайте то же самое с «/etc/nginx/conf.d/wordpress_https.conf» и сохраните файл, нажав CTRL + X, затем скажите «да» и нажмите Enter, чтобы сохранить. После обновления обоих файлов перезапустите службу Nginx, введя:

systemctl restart nginx.service

На сервере Apache

Если вы находитесь на сервере Apache или используете стек LAMP, как приложение WordPress от DigitalOcean одним щелчком мыши, введите следующие команды, чтобы открыть файлы виртуальных хостов и убедитесь, что атрибуты ServerName и ServerAlias имеют правильный адрес, как показано ниже.

sudo nano /etc/apache2/sites-available/000-default.conf
sudo nano /etc/apache2/sites-available/default-ssl.conf

Пример файла виртуального хоста Apache на моей капле DigitalOcean.

<VirtualHost *:80>
    ServerAdmin admin@hawkdivemedia.com
    ServerName hawkdivemedia.com
    ServerAlias www.hawkdivemedia.com
    DocumentRoot /var/www/hawkdivemedia.com/public_html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

После того, как вы исправили или обновили виртуальные хосты, просто нажмите «CTRL + X», нажмите «Y» и нажмите Enter, чтобы сохранить изменения.

#3. ‘sendmail’ не установлен

Одной из основных причин того, что php mail() не работает с приложением WordPress, является отсутствие установленного приложения sendmail. Чтобы проверить, установлен ли sendmail или нет. Просто введите следующую команду.

sendmail myemail@gmail.com

Если sendmail установлен, он даст вам пустую строку с мигающим курсором для ввода вашего сообщения, иначе вы увидите следующую ошибку.

sendmail could be found in the following packages:
exim4-daemon-heavy
exim4-daemon-light
lsb-invalid-mta
postfix
citadel-mta
courier-mta
dma
esmtp-run
masqmail
msmtp-mta
nullmailer
opensmtpd
qmail-run
sendmail-bin
ssmtp
xmail

Если вы видите ошибку, введите следующую команду для установки sendmail:

Примечание:- На некоторых хостах, таких как DigitalOcean, может не быть установлен sendmail, в то время как на некоторых может быть устаревшая версия приложения sendmail, и он по-прежнему не показывает никакой ошибки, кроме пустой строки. В таких случаях просто попробуйте установить приложение sendmail.

sudo apt-get install sendmail

После установки sendmail перезапустите apache, набрав »

sudo systemctl restart apache2

Если его Nginx (например, на Vultr Cloud Compute), введите:

systemctl restart nginx.service

Теперь проверьте свою контактную форму WordPress, отправив любое сообщение или попробуйте сбросить пароль учетной записи пользователя WordPress. Теперь вы должны получать электронные письма. Если WordPress по-прежнему не может отправлять электронную почту или вы все еще видите то же сообщение: «Электронное письмо не может быть отправлено, ваш хост, возможно, отключил функцию mail()», перейдите к следующим шагам.

#4. sendmail неправильно настроен или ‘sendmail_path’ отсутствует в php.ini файле

Может быть вероятность того, что sendmail не запущен или неправильно настроен. Вы можете выполнить команду «sendmailconfig» для перестроения конфигурации sendmail. Введите команду:

sudo sendmailconfig

Вам просто нужно ответить «Y» на все вопросы во время настройки, а затем, наконец, перезапустить Apache.

sudo systemctl restart apache2

Проверьте правильность ‘sendmail_path‘ в файле php.ini. Вы также можете подтвердить это из скрипта info.php как указано в шаге No 1. Просто зайдите в URL-адрес скрипта и найдите «sendmail_path», он должен иметь значение «/usr/sbin/sendmail -t -i», как показано на рисунке ниже.

Sendmai_Path в PHP инфо скрипт
Sendmail_Path в PHP инфо скрипт

Если атрибут «sendmail_path» имеет значение, отличное от упомянутого выше, откройте файл php.ini и найдите следующую строку:

sendmail_path =

и установите его значение «/usr/sbin/sendmail -t -i» (без двойной перевернутой запятой). Кроме того, убедитесь, что другие атрибуты для [mail function] в php.ini похожи на то, что у меня есть на моем VPS, как указано ниже.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; http://php.net/sendmail-path
sendmail_path = /usr/sbin/sendmail -t -i

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail().
;mail.force_extra_parameters =

; Add X-PHP-Originating-Script: that will include uid of the script followed by the file$
mail.add_x_header = On

После того, как вы исправили значения, наконец, перезапустите веб-сервер Apache или Nginx.

sudo systemctl restart apache2
systemctl restart nginx.service

Примечание:- Можно также перезапустить службу sendmail, чтобы обновить обновленные значения. Просто введите следующую команду:
sudo /etc/init.d/sendmail restart

#5. Брандмауэр блокирует трафик

Серверы Ubuntu 16.04 или 18.04 имеют базовый брандмауэр под названием UFW (
Un complilicated Firewall), который разрешает подключения только к определенным службам. Это лучший и самый простой инструмент настройки брандмауэра для iptables, который включен и устанавливается с Ubuntu по умолчанию. Поэтому, если ваш веб-сайт WordPress также выдает ошибку « ваш хост, возможно, отключил функцию mail()», более вероятно, что брандмауэр UFW включен и блокирует порт SMTP, и именно поэтому ваш сайт WordPress не может отправлять электронные письма. Чтобы проверить состояние брандмауэра UFW или проверить, запущен ли он или остановлен или блокирует какой-либо порт, выполните следующую команду.

sudo ufw status

root@Webhost:~# sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
OpenSSH                    ALLOW       Anywhere
25/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)
OpenSSH (v6)               ALLOW       Anywhere (v6)
25/tcp (v6)                ALLOW       Anywhere (v6)

25                        DENY OUT     Anywhere
25 (v6)                   DENY OUT     Anywhere (v6)

Почтовые серверы, такие как Sendmail и Postfix, по умолчанию используют порт 25 или 587 для отправки электронных писем. Тем не менее, вы можете заставить их изменить способ доставки почты, настроив правило для прослушивания доставки почты на другом порту.

В соответствии с приведенной выше командой и ее выходными данными, мы ясно видим, что брандмауэр UFW включен, и он блокирует или запрещает SMTP-порт для исходящего трафика (красным цветом), в то время как внутренний SMTP (In Blue) разрешен. Теперь, если это так с вашим сервером, вы можете просто удалить эти правила SMTP и немедленно включить почту WordPress или почту PHP. Используйте следующую команду, чтобы удалить правила фильтрации SMTP.

root@Webhost:~# sudo ufw allow out 25
Rule updated
Rule updated (v6)

Теперь перезагрузите брандмауэр UFW, введя следующую команду.

root@Webhost:~# sudo ufw reload
Firewall reloaded
root@Webhost:~#

Также перезапустите сервер, чтобы изменения вступили в силу. Команда «Введите»:

/sbin/shutdown -r now

Вы также можете запустить «iptables -L», чтобы показать все правила брандмауэра, и «iptables -F», чтобы удалить все правила из цепочки.

Если проблема по-прежнему не устранена, попробуйте временно отключить брандмауэр. Команда «Введите»:

root@Webhost:~# sudo ufw disable
Firewall stopped and disabled on system startup

Теперь, если вы проверяете состояние брандмауэра, он должен сказать неактивный. Перезапустите сервер и проверьте, работает ли сейчас Mails().

root@MyGlobalPropertyInc:~# sudo ufw status
Status: inactive
root@MyGlobalPropertyInc:~#

#6. SMTP-порт заблокирован хостинг-провайдером

Это еще одна наиболее распространенная причина того, что WordPress не может отправлять электронную почту или PHP mail(), Wp_mail() функция не работает. Большинство хостинг-провайдеров, особенно VPS или провайдер облачного хостинга, блокируют SMTP-порт для исходящего соединения или применяют фильтр на основе учетной записи пользователя для борьбы со спамом и спам-подобными действиями. В таких случаях вы ничего не можете сделать, кроме как связаться с поставщиком услуг и попросить его вежливо открыть для вас порт No 25. Vultr часто отключает SMTP-порт для новых пользователей и открывает его после запроса и предоставления им некоторой информации, которую они могут запросить.

Но, прежде чем связаться с ними, вы должны быть на 100% уверены, что SMTP-порт заблокирован в вашей учетной записи. Введите следующую команду, чтобы увидеть все доступные процессы и порт, который они прослушивают.

netstat -tulpn or netstat -uplnt | less
Проверьте все процессы и порт, которые они прослушивают
Проверьте все процессы и порт, которые они прослушивают

Как и на рисунке выше, мы видим, что процесс sendmail доступен, и порты 25, 443 и 587 открыты для его прослушивания. Если вы не видите sendmail или какую-либо почтовую программу в списке, вы не сможете отправлять почту, пока не выберете и не настроите другой порт или удаленную службу.

Теперь, если вы уже попробовали все вышеупомянутые шаги от # 1 до # 5, и вы все еще не можете отправить электронную почту или электронная почта WordPress все еще не проходит. Попробуйте выполнить следующую команду, чтобы проверить, можете ли вы подключиться к внешнему узлу через SMTP-порт 25.

root@webhost:~# telnet ALT1.ASPMX.L.GOOGLE.COM 25
Trying 2607:f8b0:4001:c1d::1b...
Trying 74.125.126.26...
Connected to ALT1.ASPMX.L.GOOGLE.COM.
Escape character is '^]'.
220 mx.google.com ESMTP e66-v6si1322712ite.88 - gsmtp
quit
221 2.0.0 closing connection e66-v6si1322712ite.88 - gsmtp
Connection closed by foreign host.
root@webhost:~#

Если вы подключите его, это означает, что SMTP-порты открыты и работают нормально, а почта не доставляется по какой-либо другой причине, влияющей на сервер получателей. Существует вероятность того, что почтовый сервер получателя рассматривает это письмо как СПАМ и удаляет его перед доставкой.

С другой стороны, если он никогда не подключен к какому-либо внешнему узлу SMTP, вам необходимо связаться с поставщиком услуг размещения, потому что это может быть фильтр SMTP, применяемый с их стороны. И сообщение об ошибке «Возможно, ваш хост отключил функцию mail()» может быть истинным

Если поставщик услуг не блокирует порт, и вы проверили и выполнили все вышеупомянутые шаги, но все же WordPress не отправляет электронную почту на ваш идентификатор электронной почты администратора WordPress. Попробуйте заменить электронное письмо получателя администратора на электронное письмо от другого поставщика услуг. Если проблема не устранена, попробуйте выполнить следующую команду, чтобы отследить маршрут электронной почты.

root@webhost:~# echo "test message" | sendmail -v contact@hawkdivemedia.com
contact@hawkdivemedia.com... Connecting to [127.0.0.1] via relay...
220 webhost.hawkdivemedia.com ESMTP Sendmail 8.15.2/8.15.2/Debian-10; Fri, 12 Oct 2018 

16:23:28 +00.1]
>>> EHLO webhost.hawkdivemedia.com
250-webhost.hawkdivemedia.com Hello localhost [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-EXPN
250-VERB
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH DIGEST-MD5 CRAM-MD5
250-DELIVERBY
250 HELP
>>> VERB
250 2.0.0 Verbose mode
>>> MAIL From:<root@webhost.hawkdivemedia.com> SIZE=13 

AUTH=root@webhost.hawkdivemedia.com
250 2.1.0 <root@webhost.hawkdivemedia.com>... Sender ok
>>> RCPT To:<contact@hawkdivemedia.com>
>>> DATA
250 2.1.5 <contact@hawkdivemedia.com>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <contact@hawkdivemedia.com>...Connecting to mail.hawkdivemedia.com. via esmtp..
050 220-box5047.bluehost.com ESMTP Exim 4.91 #1 Fri, 12 Oct 2018 09:25:06 -0600
050 220-We do not authorize the use of this system to transport unsolicited,
050 220 and/or bulk e-mail.
050 >>> EHLO webhost.hawkdivemedia.com
050 250-box5047.bluehost.com Hello webhost.hawkdivemedia.com [173.82.151.18]
050 250-SIZE 52428800
050 250-8BITMIME
050 250-PIPELINING
050 250-AUTH PLAIN LOGIN
050 250-STARTTLS
050 250 HELP
050 >>> STARTTLS
050 220 TLS go ahead
050 >>> EHLO webhost.hawkdivemedia.com
050 250-box5047.bluehost.com Hello webhost.hawkdivemedia.com [173.82.151.18]
050 250-SIZE 52428800
050 250-8BITMIME
050 250-PIPELINING
050 250-AUTH PLAIN LOGIN
050 250 HELP
050 >>> MAIL From:<root@webhost.hawkdivemedia.com> SIZE=331 AUTH=<>
050 250 OK
050 >>> RCPT To:<contact@hawkdivemedia.com>
050 >>> DATA
050 250 Accepted
050 354 Enter message, ending with "." on a line by itself
050 >>> .
050 250 OK id=1gAzJQ-0006dM-5O
050 <contact@hawkdivemedia.com>... Sent (OK id=1gAzJQ-0006dM-5O)
250 2.0.0 w9CFNSgG009826 Message accepted for delivery
contact@hawkdivemedia.com... Sent (w9CFNSgG009826 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 webhost.hawkdivemedia.com closing connection
root@webhost:~#

Теперь попробуйте отправить сообщение из контактной формы на сайте WordPress или сбросить пароль учетной записи WordPress, чтобы увидеть, работает ли он нормально. Я надеюсь, что один из вышеупомянутых шагов, исправил ваши проблемы, связанные с PHP mail(), и вы больше не видите ошибку -«Ваш хост, возможно, отключил функцию mail()». Однако, если вы не можете решить эту проблему самостоятельно или у вас есть какие-либо другие проблемы, чтобы выяснить точную проблему, просто свяжитесь со мной через Skype: live: hawkdvetech или напишите мне по электронной почте. Пожалуйста, поделитесь этой статьей, если вам понравилось.