Я использую 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
. Надеюсь это поможет.