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

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

код :

                $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' . "rn";
                    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "rn";
                // Additional headers
                $headers .= 'From: Team <example@domain.com>' . "rn";

                if(mail($to,$subject,$message,$headers))
                {
                    echo "0";// mail sent Successfully.
                }
                else
                {
                    echo "1";
                }

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

7 ответов


после установки 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 from:

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() прекрасно работает в серверном доме, но не дома.

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

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

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

 # nano /etc/sysconfig/network
   NETWORKING=yes
   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, где у вас есть ISP: s сервер исходящей почты:

 define(`SMART_HOST',`mail.myisp.com')dnl

4) Обновление sendmail.cf:

 # /etc/mail/make

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

 # service sendmail restart
 # service httpd restart

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

 # reboot

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

# 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 (), используя свой реальный адрес в качестве адреса отправителя, имя хоста может быть любым, но если у вас есть существующие вызовы mail (), которым не хватает адреса отправителя (у меня есть сотни таких вызовов для целей тестирования), то у вас должен быть реальный домен как имя хоста, потому что имя хоста вашего сервера используется как домен адреса отправителя в этих случаях. Реальный в том смысле, что домен должен иметь хотя бы DNS A-запись (по какой-то причине мой ISP не требует NS-записи для адреса отправителя, только A-запись, но тест и проверка с вашим ISP). Недостатком использования не-email-домена в качестве адреса отправителя является то, что replys и уведомления о доставке отправятся на небеса bit, но если вы отбросите адрес отправителя в своем коде, это обычно означает, что вы тестируете и отлаживаете что-то и не нужно отвечать функциональность. Домен может быть например. тот, который вы получаете от динамического dns-сервера, например. mydns157.dlinkddns.com, который может указывать на ваш домашний роутер (но не обязательно). Вы можете получить запись DNS в PHP, используя dns_get_record("mydns157.dlinkddns.com"), который возвращает массив, как это:

 [host] => mydns157.dlinkddns.com
 [type] => A
 [ip] => 92.152.214.137
 [class] => IN
 [ttl] => 7

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

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


Я бы рекомендовал использовать 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);
}

может это поможет

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

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

мои письма шли в спам, обязательно проверьте, что. Вероятно, потому, что у моего сервера не было правильных PTR и SPF-записей.

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

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

всегда проверяйте свой maillog в /var/log / maillog, чтобы узнать причину проблемы. У меня была аналогичная проблема однажды после правильной настройки postfix. Я получил сообщение об ошибке fatal: setrlimit: Permission denied. Обходной путь-проверить, может ли httpd отправлять почту включена или нет