Я пытаюсь отправлять автоматические уведомления по электронной почте пользователям моего сайта. Эти электронные письма отправляются пользователям специальным демоном, который отправляет их через exim 4. Роль exim в этом заключается просто в пересылке почты на почтовый сервер, связанный с адресом получателя. Все исходящие электронные письма должны быть ретранслированы. Нет ни местных писем, ни входящих писем.
Однако, когда я пытаюсь отправить электронное письмо, мой демон всегда получает следующий ответ:
com.sun.mail.smtp.SMTPAddressFailedException: 451 Temporary local problem - please try later
В /var/log/exim4/mainlog
, У меня есть следующие строки
2014-09-09 22:30:50 no host name found for IP address 10.0.2.2
2014-09-09 22:30:50 H=(lotp-lanbox) [10.0.2.2] F=<noreply@mydomain.com> temporarily rejected RCPT <foobar@romandie.com>: host lookup did not complete
(Обратите внимание, что 10.0.2.2 - это IP-адрес хоста, на котором установлен демон-отправитель.)
Это сообщение странное, но в нем отсутствуют детали. Вот еще одна команда отладки, которую я запустил:
user@host:~$ exim4 -bt -d-resolver foobar@romandie.com
Exim version 4.82 uid=0 gid=0 pid=14035 D=fbb95cfd
Berkeley DB: Berkeley DB 5.3.28: (September 9, 2013)
Support for: crypteq iconv() IPv6 GnuTLS move_frozen_messages DKIM
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch nis nis0 passwd
Authenticators: cram_md5 plaintext
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Compiler: GCC [4.8.2]
Library version: GnuTLS: Compile: 2.12.23
Runtime: 2.12.23
Library version: PCRE: Compile: 8.31
Runtime: 8.31 2012-07-06
Total 13 lookups
WHITELIST_D_MACROS: "OUTGOING"
TRUSTED_CONFIG_LIST: "/etc/exim4/trusted_configs"
changed uid/gid: forcing real = effective
uid=0 gid=0 pid=14035
auxiliary group list: <none>
seeking password data for user "uucp": cache not available
getpwnam() succeeded uid=10 gid=10
changed uid/gid: calling tls_validate_require_cipher
uid=109 gid=116 pid=14036
auxiliary group list: <none>
tls_validate_require_cipher child 14036 ended: status=0x0
configuration file is /var/lib/exim4/config.autogenerated
log selectors = 00000ffc 00632001
trusted user
admin user
seeking password data for user "mail": cache not available
getpwnam() succeeded uid=8 gid=8
user name "root" extracted from gecos field "root"
originator: uid=0 gid=0 login=root name=root
sender address = root@dev
Address testing: uid=0 gid=116 euid=0 egid=116
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing foobar@romandie.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering foobar@romandie.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing foobar@romandie.com
--------> hubbed_hosts router <--------
local_part=foobar domain=romandie.com
checking domains
expansion of "${if exists{/etc/exim4/hubbed_hosts}{partial-lsearch;/etc/exim4/hubbed_hosts}fail}" forced failure: assume not in this list
hubbed_hosts router skipped: domains mismatch
--------> dnslookup_relay_to_domains router <--------
local_part=foobar domain=romandie.com
checking domains
romandie.com in "@:localhost"? no (end of list)
romandie.com in "*"? yes (matched "*")
romandie.com in "! +local_domains : +relay_to_domains"? yes (matched "+relay_to_domains")
R: dnslookup_relay_to_domains for foobar@romandie.com
calling dnslookup_relay_to_domains router
dnslookup_relay_to_domains router called for foobar@romandie.com
domain = romandie.com
DNS lookup of romandie.com (MX) succeeded
dnslookup_relay_to_domains router: defer for foobar@romandie.com
message: host lookup did not complete
foobar@romandie.com cannot be resolved at this time: host lookup did not complete
search_tidyup called
>>>>>>>>>>>>>>>> Exim pid=14035 terminating with rc=1 >>>>>>>>>>>>>>>>
Вот отрывок, который мне кажется особенно странным (из конца этого вывода):
dnslookup_relay_to_domains router called for foobar@romandie.com
domain = romandie.com
DNS lookup of romandie.com (MX) succeeded
dnslookup_relay_to_domains router: defer for foobar@romandie.com
message: host lookup did not complete
foobar@romandie.com cannot be resolved at this time: host lookup did not complete
Каким образом DNS-поиск может быть успешным и не завершенным? Что я делаю не так?
Я пробовал выполнять поиск в DNS, используя dig
с машины, на которой установлен exim4, и результаты мне кажутся хорошими:
user@host:~$ dig mx romandie.com
;; Warning: Message parser reports malformed message packet.
; <<>> DiG 9.9.5-3-Ubuntu <<>> mx romandie.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36151
;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: Message has 1 extra bytes at end
;; QUESTION SECTION:
;romandie.com. IN MX
;; ANSWER SECTION:
romandie.com. 3600 IN A 37.35.105.169
romandie.com. 3600 IN A 37.35.105.166
;; Query time: 19 msec
;; SERVER: 10.0.2.3#53(10.0.2.3)
;; WHEN: Tue Sep 09 23:14:45 UTC 2014
;; MSG SIZE rcvd: 63
Сам поиск выглядит нормально.
Почему exim говорит, что он и успешен, и терпит неудачу одновременно?
Рекурсивный DNS-преобразователь, который вы используете (тот, что 10.0.2.3
) сильно сломан. В вашей команде раскопок вы запрашиваете MX
запись. Но он отправляет ответ, содержащий два A
записи вместо этого. Это даже не потому, что у домена нет MX
запись. Я только что проверил, и действительно есть MX
запись в этом домене. более того dig
предупреждает вас, что ответный пакет имеет неправильный формат WARNING: Message has 1 extra bytes at end
.
Я рекомендую вам прекратить использовать неисправный DNS-сервер. Попробуйте поставить другой DNS-преобразователь в /etc/resolv.conf
. У меня есть хороший опыт использования 8.8.8.8
.
У вас есть два конкретных вопроса, и я отвечу на них по очереди:
Сообщение не найдено имя хоста для IP-адреса 10.0.2.2 просто означает, что когда хост 10.0.2.2 подключился к порту 25 на сервере exim, exim выполнил поиск этого IP-адреса через rDNS, и DNS ответил NXDOMAIN (фактически ответ, который означает NXDOMAIN). Это не имеет никакого отношения к тому, принимает ли exim сообщение или нет.
Сообщение 451 Временная местная проблема Exim сообщает вам, что он настроен для выполнения нескольких действий, когда через него отправляется электронная почта, и одна из этих вещей дает сбой. У вас нет записи MX в этом домене, поэтому вы полагаетесь на то, что называется резервной записью A, что нормально в соответствии с RFC, но не рекомендуется делать это. В конце концов, сервер eximʻa определил, что домен недоступен. Убедитесь, что ваша сеть настроена правильно и действительно ли вы можете получить IP-адреса, которые она предлагает.
Я могу ошибаться на этот счет, но я думаю, что сообщение «DNS-поиск завершен» не означает, что получена запрошенная запись. Это просто означает, что Exim спросил и получил ответ, который не был отказом. Строка после этого - это когда exim фактически анализирует ответ и по какой-то причине определяет, что не получил желаемого ответа.
Записи MX DNS должны указывать на имена, а не на IP-адреса. Похоже, вам может понадобиться опция allow_mx_to_ip в качестве временного решения.