Назад | Перейти на главную страницу

Exim не может отправлять сообщения на удаленные почтовые серверы

Я использую специальную сборку exim (в комплекте с afterlogic pro mailsuite) с centos5.6. Система не может отправлять сообщения на удаленные почтовые серверы, такие как yahoo или gmail, и выдает следующую ошибку:

someuser@gmail.com R=dnslookup defer (-1): host lookup did not complete

Я могу найти DNS-записи gmail.com с помощью команды dig:

    #dig mx gmail.com

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 <<>> mx gmail.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2234
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;gmail.com.         IN  MX

;; ANSWER SECTION:
gmail.com.      3600    IN  MX  30 alt3.gmail-smtp-in.l.google.com.
gmail.com.      3600    IN  MX  20 alt2.gmail-smtp-in.l.google.com.
gmail.com.      3600    IN  MX  5 gmail-smtp-in.l.google.com.
gmail.com.      3600    IN  MX  10 alt1.gmail-smtp-in.l.google.com.
gmail.com.      3600    IN  MX  40 alt4.gmail-smtp-in.l.google.com.

;; Query time: 16 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Mar 16 16:23:27 2012
;; MSG SIZE  rcvd: 150

Я запустил команду отладки с exim, и получилось так:

    #bin/exim -bt -d-resolver someuser@gmail.com
Exim version 4.76 uid=0 gid=0 pid=2368 D=fbb95cfd
Berkeley DB: Berkeley DB 5.2.36: (September 14, 2011)
Support for: crypteq iconv() OpenSSL Content_Scanning DKIM
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch dbm dbmnz mysql
Authenticators: cram_md5 plaintext spa
Routers: accept dnslookup ipliteral manualroute queryprogram redirect
Transports: appendfile/maildir autoreply pipe smtp
Fixed never_users: 0
Size of off_t: 8
Compiler: GCC [4.1.2 20080704 (Red Hat 4.1.2-51)]
Library version: OpenSSL: Compile: OpenSSL 1.0.0e 6 Sep 2011
                          Runtime: OpenSSL 1.0.0e 6 Sep 2011
Library version: PCRE: Compile: 8.13
                       Runtime: 8.13 2011-08-16
Total 7 lookups
Library version: MySQL: Compile: 5.1.56 [Source distribution]
                        Runtime: 5.1.56
WHITELIST_D_MACROS unset
TRUSTED_CONFIG_LIST unset
changed uid/gid: forcing real = effective
  uid=0 gid=0 pid=2368
  auxiliary group list: <none>
seeking password data for user "exim": cache not available
getpwnam() succeeded uid=3000 gid=3000
seeking password data for user "root": cache not available
getpwnam() succeeded uid=0 gid=0
configuration file is /usr/mailsuite/etc/exim
log selectors = 0000cefe 00233821
trusted user
admin user
seeking password data for user "exim": cache not available
getpwnam() succeeded uid=3000 gid=3000
seeking password data for user "exim": using cached result
getpwnam() succeeded uid=3000 gid=3000
seeking password data for user "exim": using cached result
getpwnam() succeeded uid=3000 gid=3000
originator: uid=0 gid=0 login=root name=root
sender address = root@example.com
Address testing: uid=0 gid=3000 euid=0 egid=3000
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing someuser@gmail.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering someuser@gmail.com
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing someuser@gmail.com
--------> dnslookup router <--------
local_part=someuser domain=gmail.com
checking domains
search_open: mysql "NULL"
search_find: file="NULL"
  key="SELECT name FROM awm_domains WHERE name = 'gmail.com' AND is_internal = 1 " partial=-1 affix=NULL starflags=0
LRU list:
internal_search_find: file="NULL"
  type=mysql key="SELECT name FROM awm_domains WHERE name = 'gmail.com' AND is_internal = 1 "
database lookup required for SELECT name FROM awm_domains WHERE name = 'gmail.com' AND is_internal = 1 
MySQL query: SELECT name FROM awm_domains WHERE name = 'gmail.com' AND is_internal = 1 
MYSQL new connection: host=localhost port=0 socket=/usr/mailsuite/tmp/mysql.sock database=exim user=root
MYSQL: no data found
lookup failed
gmail.com in ""? no (end of list)
gmail.com in "! +local_domains"? yes (end of list)
calling dnslookup router
dnslookup router called for someuser@gmail.com
  domain = gmail.com
DNS lookup of gmail.com (MX) succeeded
DNS lookup of gmail-smtp-in.l.google.com (A) succeeded
DNS lookup of alt1.gmail-smtp-in.l.google.com (A) succeeded
DNS lookup of alt2.gmail-smtp-in.l.google.com (A) succeeded
DNS lookup of alt3.gmail-smtp-in.l.google.com (A) succeeded
DNS lookup of alt4.gmail-smtp-in.l.google.com (A) succeeded
fully qualified name = gmail.com
host_find_bydns yield = HOST_FOUND (2); returned hosts:
  gmail-smtp-in.l.google.com 209.85.225.27 MX=5 
  alt1.gmail-smtp-in.l.google.com 173.194.76.27 MX=10 
  alt2.gmail-smtp-in.l.google.com 74.125.115.27 MX=20 
  alt3.gmail-smtp-in.l.google.com 173.194.67.26 MX=30 
  alt4.gmail-smtp-in.l.google.com 173.194.65.26 MX=40 
set transport remote_smtp
queued for remote_smtp transport: local_part = someuser
domain = gmail.com
  errors_to=NULL
  domain_data=NULL localpart_data=NULL
routed by dnslookup router
  envelope to: someuser@gmail.com
  transport: remote_smtp
  host gmail-smtp-in.l.google.com [209.85.225.27] MX=5
  host alt1.gmail-smtp-in.l.google.com [173.194.76.27] MX=10
  host alt2.gmail-smtp-in.l.google.com [74.125.115.27] MX=20
  host alt3.gmail-smtp-in.l.google.com [173.194.67.26] MX=30
  host alt4.gmail-smtp-in.l.google.com [173.194.65.26] MX=40
someuser@gmail.com
  router = dnslookup, transport = remote_smtp
  host gmail-smtp-in.l.google.com      [209.85.225.27] MX=5
  host alt1.gmail-smtp-in.l.google.com [173.194.76.27] MX=10
  host alt2.gmail-smtp-in.l.google.com [74.125.115.27] MX=20
  host alt3.gmail-smtp-in.l.google.com [173.194.67.26] MX=30
  host alt4.gmail-smtp-in.l.google.com [173.194.65.26] MX=40
search_tidyup called
close MYSQL connection: localhost:(/usr/mailsuite/tmp/mysql.sock)/exim/root

Я действительно в растерянности, любая помощь приветствуется.

Оказалось, что MTA не смогли разрешить записи DNS через внешние преобразователи DNS. Я установил dnsmasq на локальном сервере и поместил его в качестве первой записи в моем /etc/resolv.conf, и как exim, так и postfix могли отправлять на удаленные серверы.

Exim не будет работать как root. Используемый по умолчанию идентификатор пользователя без полномочий root жестко запрограммирован как часть сборки. В вашем случае это похоже на exim. Добавить идентификатор пользователя exim с группой exim и он должен работать.

РЕДАКТИРОВАТЬ: пропущена полоса прокрутки в журнале. Exim, похоже, выбирает правильный маршрутизатор, и поиск DNS завершен. Однако нет никаких указаний на то, что соединение с удаленным сервером устанавливается. Попробуйте использовать telnet для одного или нескольких IP-адресов, чтобы проверить, можете ли вы подключиться к порту SMTP. Команда

telnet 209.85.225.27 25

Должно получиться примерно следующее:

Trying 209.85.225.27...
Connected to 209.85.225.27.
Escape character is '^]'.
220 mx.google.com ESMTP el4si7116293icb.3

Строка, начинающаяся с 220, означает, что вы подключились к серверу. Если это удастся, введите QUIT чтобы закрыть соединение. Если это не удалось, вероятно, у вас есть брандмауэр, предотвращающий исходящие SMTP-соединения.