Функция 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);
}
У меня просто была эта проблема, две вещи.
мои письма шли в спам, обязательно проверьте, что. Вероятно, потому, что у моего сервера не было правильных 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 отправлять почту включена или нет