Функция почты PHP не работает на сервере Centos

Я использую centos Server и должен отправлять почту пользователю, поэтому я скопировал код моего сервера с одного сервера и использовал его здесь, но он не отправляет письма.

Код:

$to = $email; //writing mail to the user $subject = "Hii"; $message = "<table> <tr><td> Hello ".$email.",</td></tr> <tr><td> Some Text </td></tr> <tr><td> Some Text </td></tr> <tr><td> Some Text </td></tr> <tr><td> Some Text </td></tr> </table>" ; $from = "example@domain.com"; // To send HTML mail, the Content-type header must be set $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; // Additional headers $headers .= 'From: Team <example@domain.com>' . "\r\n"; if(mail($to,$subject,$message,$headers)) { echo "0";// mail sent Successfully. } else { echo "1"; } 

Он всегда печатает 1. Тот же код работает отлично в другом проекте. Пожалуйста, расскажите мне, что я могу сделать, чтобы включить его здесь тоже? Любая помощь будет высоко оценена!

После установки sendmail * и выполнения следующих команд:

 [root@sendmail ~]# yum install sendmail* [root@sendmail mail]# yum install dovecot [root@sendmail mail]# cd /etc/mail/ [root@sendmail mail]# vi local-host-names # local-host-names - include all aliases for your machine here. example.com [root@sendmail mail]# vi /etc/dovecot.conf protocols = imap pop3 //uncomment [root@sendmail mail]# m4 sendmail.mc > sendmail.cf [root@sendmail mail]# make [root@sendmail mail]# /etc/init.d/sendmail start [root@sendmail mail]# /etc/init.d/saslauthd start [root@sendmail mail]# /etc/init.d/dovecot start [root@sendmail mail]# chkconfig sendmail on [root@sendmail mail]# chkconfig dovecot on [root@sendmail mail]# chkconfig saslauthd on 

У меня все еще была такая же проблема. Я проверил свой /var/log/maillog и увидел ошибку:

 My unqualified host name (domain) unknown; sleeping for retry 

После большего поиска я изменил /etc/hosts из:

 127.0.0.1 localhost localhost.localdomain domain ip.ip.ip.ip domain localhost 

чтобы:

  127.0.0.1 localhost.localdomain localhost domain ip.ip.ip.ip localhost domain 

и теперь функция почты теперь работает нормально.

Я знаю, что на это был дан ответ, но у меня была аналогичная проблема. В случае, если кто-то еще ….

/ var / log / maillog показал мне проблему с разрешением Postfix.

 sendmail: fatal: chdir /var/spool/postfix: Permission denied 

Ошибка отслеживания. Я нашел решение как политику SELinux для CentOS (я использую версию 6).

Быстрый ответ: setsebool httpd_can_sendmail 1

Вы можете использовать -P, чтобы сделать изменение постоянным; Я просто нуждался в электронной почте для сброса пароля, поэтому мне не нужен был мой случай.

Кредит: http://www.spidersoft.com.au/2011/posftix-permission-denied-problem/?ModPagespeed=noscript

EDIT: Я бы прокомментировал, но у меня пока нет достаточной репутации.

У меня такая же проблема. У меня есть сервер разработки на дому и prod-сервер на внешнем сервере, а входящие письма отправляются на другой сервер. PHP: s mail() отлично работает в серверном доме, но не дома.

Я немного протестировал и получил его для работы дома так же, как и в серверном доме. Разница между методами в серверном доме и доме – это конфигурация sendmail. Серверный дом Мне нужно было только установить sendmail, и все было нормально, но дома мне пришлось установить также sendmail-cf и использовать его для добавления адреса сервера исходящей почты.

Предположим, у вас есть сервер Centos, Apache и PHP на домашнем сервере, и вы хотите отправлять электронные письма с помощью функции PHP: s mail ().

1) Задайте имя хоста на домашнем сервере в двух местах: / etc / sysconfig / network и / proc / sys / kernel / hostname следующим образом:

  # nano / etc / sysconfig / network
    СЕТЕВАЯ = да
    HOSTNAME = mydns157.dlinkddns.com

  # nano / proc / sys / kernel / hostname
    HOSTNAME = mydns157.dlinkddns.com

2) Установите sendmail и sendmail-cf:

  # yum install sendmail sendmail-cf

3) Добавьте следующую строку в /etc/mail/sendmail.mc, где у вас есть сервер исходящей почты вашего провайдера:

  определить ( ` '` mail.myisp.com' SMART_HOST) DNL

4) Обновить sendmail.cf:

  # / etc / make / mail

5) Перезапустите sendmail и apache:

  # служба перезагрузки sendmail
  # service httpd restart

6) Загрузите обновление имени хоста:

  # перезагружать

Вот и все. Теперь следующие работы:

 # php -r'mail ("user@somedomain.com", "Subject", "Body", null, "-fme@mydomain.com");

Вы можете пропустить -f:

 # php -r'mail ("user@somedomain.com", "Subject", "Body");

в этом случае имя отправителя становится автоматически user @ hostname, например. root@mydns157.dlinkddns.com.


Некоторые примечания имени хоста

Выбор имени хоста имеет решающее значение. Значение по умолчанию в Centos6 – localhost.localdomain , но mail() не работает с ним, если вы пропустите свой адрес отправителя (например, '-fme@mydomain.com' ) при вызове mail (). Если вы уверены, что вы всегда звоните по почте (), используя ваш реальный адрес в качестве адреса отправителя, имя хоста может быть любым, но если у вас есть существующие вызовы на mail (), которые не имеют адреса отправителя (у меня есть сотни таких, как звонки в целях тестирования), тогда у вас должен быть реальный домен как имя хоста, поскольку имя хоста вашего сервера используется в качестве домена отправителя-адреса в этих случаях. Реальный в том смысле, что в домене должна быть как минимум DNS-запись (по какой-то причине мой интернет-провайдер не требует NS-записи для адреса отправителя, только A-запись, но тестирует и проверяет с вашим интернет-провайдером). Недостатком использования не-адреса электронной почты в качестве адреса отправителя является то, что ответы и уведомления о доставке будут отправляться на небеса бит, но если вы отбросите адрес отправителя в своем коде, это обычно означает, что вы проверяете и отлаживаете что-то и не нуждаетесь в ответе функциональность. Домен может быть, например. тот, который вы получаете от динамического сервера DNS, например. mydns157.dlinkddns.com , который может указывать на ваш домашний маршрутизатор (но не обязательно). Вы можете получить DNS-запись на PHP с помощью dns_get_record("mydns157.dlinkddns.com") , которая возвращает массив следующим образом:

  [host] => mydns157.dlinkddns.com
  [type] => A
  [ip] => 92.152.214.137
  [класс] => IN
  [ttl] => 7

Если type над DNS-записью NS , то домен действует как домен электронной почты, который подходит для имени хоста собственного сервера, но эффект немного отличается. Если вы задаете имя хоста существующего домена электронной почты, например. myexistingemaildomain.com и отправьте сообщение на me@myexistingemaildomain.com например, для целей отладки, sendmail считает, что сообщение должно быть доставлено в почтовую папку пользователя me на этом сервере. Если me не существует, отправка не выполняется, и если пользователь существует, сообщение переходит в /var/mail/me . Это может быть то, что вы хотите, но (как и я) вы можете захотеть, чтобы все сообщения доставлялись снаружи, а не в папки сервера.

Ваше имя хоста (в записи DNS) не должно указывать на фактический внешний IP-адрес вашего сервера, чтобы почта () работала в случаях отсутствия отправителя-адреса, но это не вредит. Главное, что имя хоста имеет действительную A-запись и что домен принадлежит вам. Если домен не принадлежит вам, тогда может возникнуть дыра в безопасности. Если вы задали в качестве имени хоста какой-либо существующий домен электронной почты, например. microsoft.com (по какой-либо причине) и отправить сообщение кому-либо, не добавляя свой собственный адрес отправителя при вызове mail () (например, '-fme@mydomain.com' ), адрес отправителя будет автоматически автоматически you@microsoft.com адрес электронной почты you@microsoft.com . Если вы зарегистрированы как пользователь root, адрес отправителя будет root@microsoft.com . Ответы и уведомления о неудачных поставках идут затем на root@microsoft.com и это может быть не ваше намерение.

может это поможет вам

 ini_set('sendmail_from', 'example@domain.com'); 

У меня была эта проблема, две вещи.

Мои электронные письма собирались спамить, определенно проверить это. Вероятно, потому, что у моего сервера не было записей PTR и SPF.

Но также, мне было намного легче проверить sendmail с этим:

 sendmail -s 'me@gmail.com' Subject:Testing! hey there, how ya doin? CTRL+D 

Я бы рекомендовал использовать SwiftMailer просто так много.

 require_once('../lib/swiftMailer/lib/swift_required.php'); function sendEmail(){ //Sendmail $transport = Swift_SendmailTransport::newInstance('/usr/sbin/sendmail -bs'); //Create the Mailer using your created Transport $mailer = Swift_Mailer::newInstance($transport); $body="Dear $fname,\n\nYour job application was successful. \n\nYours,\n\nEamorr\n\n\n\n\n\n\n"; //Create a message $message = Swift_Message::newInstance('Subject goes here') ->setFrom(array($email => "no-reply@yourdomain.com")) ->setTo(array($email => "$fname $lname")) ->setBody($body); //Send the message $result = $mailer->send($message); } 

Всегда проверяйте свой maillog в / var / log / maillog, чтобы узнать причину проблемы. У меня была аналогичная проблема после правильной настройки постфикса. Я получил сообщение об ошибке fatal: setrlimit: Permission denied . getsebool httpd_can_sendmail является проверка, может ли HTTPd отправлять почту, или нет командой getsebool httpd_can_sendmail . Если httpd может отправить почту, отключите ее, затем включите ее командой: setsebool -P httpd_can_sendmail 1 . Надеюсь это поможет.