Функция почты PHP не работает на сервере Centos - PullRequest
16 голосов
/ 01 декабря 2011

Я использую 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. Один и тот же код работает нормально на другом проекте.Пожалуйста, сообщите мне, что я могу сделать, чтобы включить это здесь?Любая помощь будет высоко оценена!

Ответы [ 7 ]

24 голосов
/ 02 декабря 2011

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

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

6 голосов
/ 08 августа 2013

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

/ 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

РЕДАКТИРОВАТЬ: Я бы прокомментировал, но у меня пока недостаточно репутации.

6 голосов
/ 09 марта 2013

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

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

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

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

 # 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, где у вас есть ваш провайдер: 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 (по какой-то причине мой провайдер не требует NS-запись для адреса отправителя, только A-запись, но тестируйте и проверяйте у своего ISP).Недостатком использования не-email-домена в качестве адреса отправителя является то, что ответы и уведомления о доставке попадут на небеса, но если вы отбрасываете адрес отправителя в своем коде, это обычно означает, что вы что-то тестируете и отлаживаете и не нуждаетесь в ответе.функциональность.Домен может быть например.тот, который вы получаете от динамического сервера 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, и это не может быть вашим намерением.

2 голосов
/ 12 октября 2013

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

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

Но я также обнаружил, что намного проще протестировать sendmail с помощью:

sendmail -s 'me@gmail.com'
Subject:Testing!
hey there, how ya doin?
CTRL+D
2 голосов
/ 01 декабря 2011

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

ini_set('sendmail_from', 'example@domain.com'); 
2 голосов
/ 01 декабря 2011

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

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

...