На моем сервере Ubuntu я пытался заставить работать PHP mail (), установив sendmail (у меня также установлен postfix, но я отказался от него). Однако, когда я пытаюсь отправить почту, она попадает в очередь со следующей ошибкой в /var/log/mail.log
:
sm-mta[xxx]: gethostbyaddr(x.x.x.x) failed: x
Когда я выполнил nslookup
(например. nslookup gmail.com
) он сказал, что не может быть решен, и время ожидания соединения истекло. Потратив на это весь день и пробуя разные вещи, я решил поместить серверы имен моего домена в свой файл интерфейсов, как: https://askubuntu.com/a/331636
Это уменьшило проблему, с которой я столкнулся nslookup
но я все еще получаю ту же ошибку в журналах при попытке отправить почту, за исключением того, что мой общедоступный IP-адрес не отображается, только частный. например
sm-mta[xxx]: gethostbyaddr(178.x.x.x) failed: x # public IP error not showing anymore
sm-mta[xxx]: gethostbyaddr(10.x.x.x) failed: x # private IP error still showing
Я просмотрел много документации по этому поводу и до сих пор не уверен, что делаю не так. Я проверил, что sendmail использует порт 25. Поскольку я только отправляю почту, нужно ли мне беспокоиться о записях DNS, касающихся MX для моего сервера?
/etc/resolv.conf
:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:4860:4860::8844
nameserver 2001:4860:4860::8888
nameserver 8.8.8.8
/etc/dhcp/dhclient.conf
:
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
#send host-name "andare.fugue.com";
send host-name = gethostname();
#send dhcp-client-identifier 1:0:a0:24:ab:fb:9c;
#send dhcp-lease-time 3600;
#supersede domain-name "fugue.com home.vix.com";
#prepend domain-name-servers 127.0.0.1;
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, domain-search, host-name,
dhcp6.name-servers, dhcp6.domain-search,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers,
dhcp6.fqdn, dhcp6.sntp-servers;
#require subnet-mask, domain-name-servers;
#timeout 60;
#retry 60;
#reboot 10;
#select-timeout 5;
#initial-interval 2;
#script "/etc/dhcp3/dhclient-script";
#media "-link0 -link1 -link2", "link0 link1";
#reject 192.33.137.209;
#alias {
# interface "eth0";
# fixed-address 192.5.5.213;
# option subnet-mask 255.255.255.255;
#}
#lease {
# interface "eth0";
# fixed-address 192.33.137.200;
# medium "link0 link1";
# option host-name "andare.swiftmedia.com";
# option subnet-mask 255.255.255.0;
# option broadcast-address 192.33.137.255;
# option routers 192.33.137.250;
# option domain-name-servers 127.0.0.1;
# renew 2 2000/1/12 00:00:01;
# rebind 2 2000/1/12 00:00:01;
# expire 2 2000/1/12 00:00:01;
#}
etc/hosts
:
# Your system has configured 'manage_etc_hosts' as True.
# As a result, if you wish for changes to this file to persist
# then you will need to either
# a.) make changes to the master file in /etc/cloud/templates/hosts.tmpl
# b.) change or remove the value of 'manage_etc_hosts' in
# /etc/cloud/cloud.cfg or cloud-config from user-data
127.0.1.1 domain.name
127.0.0.1 localhost.localdomain localhost
178.x.x.x domain.name
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Как вы пишете, это должно было работать.
user1316146 также прав: gethostbyaddr выполняет обратный поиск IP, который не нужен для отправки почты. На мой взгляд, проблема не в этом.
Думаю, у вас просто шумная сеть или не очень надежный локальный днс. Вам приходилось настраивать sendmail так, чтобы пытаться получить целевой адрес более агрессивно и много раз.
Или, может быть, вам следует установить привязку local cachingonly, чтобы прояснить такие проблемы.
Или, может быть, вам стоит попробовать более надежный mta, postfix - это хороший способ.
gethostbyaddr выполняет обратный DNS, поэтому вам необходимо настроить записи PTR для рассматриваемых IP-адресов. Вам также необходимо, чтобы этот диапазон адресов был делегирован вам для публичного обращения.
Если вы используете 8.8.8.8 в качестве DNS для коробки, вы не сможете иметь записи PTR для сети 10.0.0.0/8.
Этот поиск обычно выполняется только для почты, отправляемой на сервер, поскольку почтовый сервер пытается определить имя хоста отправителя, чтобы сравнить его с отправленным сообщением HELO.
Кстати, если вы просто пытаетесь отправить почту, конфигурация постфикса по умолчанию отлично подходит для этого в Ubuntu.
Насколько я понимаю, вы просто хотите отправлять письма. В этом случае вы не должны устанавливать MX-запись для сервера, так как ваш почтовый сервер не отвечает ни за один домен.
Если я понимаю вашу проблему, вам действительно нужен MTA, который пересылает вашу почту.
Настроить для этой цели полноценный почтовый сервер - излишне; Итак, сначала несколько альтернатив: https://unix.stackexchange.com/questions/1449/lightweight-outgoing-smtp-server
Если вы все равно хотите иметь настоящий почтовый сервер, предпочтительнее использовать postfix: https://askubuntu.com/questions/457003/setting-up-a-send-only-mail-server
Однако ваша проблема с DNS, вероятно, не зависит от этого.
Конечно, желательно, чтобы все IP-адреса и имена хостов, используемые на вашем сервере, могли быть разрешены. Для этого вам понадобится локальный сервер имен для ваших локальных адресов (и имен), который пересылает любые другие запросы на какой-либо другой сервер имен.
Но может быть более простой способ: поиск DNS, который выполняет почтовый сервер, должен зависеть от доменов отправителя и получателя почты. Вы должны проверить, правильны ли они, и просто ограничиться именами, которые можно разрешить. Возможно, вы настроили адрес отправителя так, чтобы он указывал на какой-то локально определенный домен?
Чтобы отладить это, вы можете попробовать сначала отправить почту из командной строки и перейти к PHP-почтовой программе, как только это сработает.
Пример письма из очереди может помочь проверить это.
И не могли бы вы опубликовать вывод команды netstat -natp? Просто чтобы узнать, к каким IP-адресам привязан sendmail.
Я знаю, что это неполный ответ, но это все, что я могу сказать на данный момент.