У меня была такая же проблема.У меня есть сервер разработки дома и сервер 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
, и это не может быть вашим намерением.