Среда - Amazon EC2, работающая под управлением Amazon Linux (типа Centos) с sendmail 8.14.4 и Cyrus sasl 2.1.23. У машины есть эластичный IP-адрес, который является целью доменного имени, и для него настроен обратный DNS. Запись MX указывает на внешний сервер, поэтому машина не обрабатывает входящую электронную почту, только исходящую. Для всей исходящей электронной почты вне узла я хочу использовать подключение с аутентификацией TLS к smtp.googlemail.com.
Есть много руководств и статей об этом виде настройки (несколько на этом сайте и на его дочерних сайтах), так как это кажется довольно популярным способом работы с электронной почтой в облаке. Я читал все, что смог найти, пробовал разные вещи и изучал / var / log / maillog. Но хоть убей, я в тупике. Дело не в том, что я не могу отправить электронное письмо с помощью sendmail или что я не могу отправить его через аутентифицированное соединение TLS на smtp.googlelemail.com: просто я не могу заставить sendmail отправлять его через такое соединение! Признаюсь, я новичок в sendmail, и я знаю, что у него репутация сложной конфигурации, поэтому я действительно потратил на это много времени. Но на данный момент у меня закончились подсказки и идеи.
У меня есть одно приложение php на машине, которая использует Zend Framework (1.11), и оно использует Zend_Mail_Transport_Smtp. В конструкторе транспорта я указываю smtp.googlemail.com, порт 587, tls, name@gmail.com и пароль. Электронное письмо от этого приложения отправляется разделенным на части и приходит с красивыми чистыми заголовками (я также добавил запись TXT, включая записи spf txt Google, в файл зоны домена).
У меня есть другое приложение, которое напрямую использует почту php, а почта php полагается на sendmail. Это приложение также может отправлять почту, которая поступает нормально в соответствии с конфигурацией sendmail по умолчанию, поставляемой с AMI Amazon Linux (которая не ретранслируется через электронную почту Google). Но заголовки в поступающих сообщениях не такие чистые, по крайней мере, одна вещь состоит в том, что есть "нейтральная" жалоба от проверки spf. Так что я не застрял без электронной почты, просто я хотел бы иметь возможность использовать sendmail для большей надежности с постановкой исходящей почты в очередь в случае многопользовательских пакетов электронной почты, поступающих с веб-сайта (как и все эти новые пользователи приложение Zend Framework регистрирует учетные записи :-), и я не хочу, чтобы пользователи смотрели на заголовки и думали, что что-то не совсем правильно.
Таким образом, цель здесь - просто изменить существующую рабочую конфигурацию sendmail для ретрансляции исходящей почты через порт 587 tls-соединения с googlemail, точно так же, как приложение Zend Framework делает это без проблем. А затем я могу изменить приложение Zend Framework для использования sendmail для защиты очереди от перегрузки.
Как это может быть сложно, подумал я ...
Я обнаружил, что с изменениями в конфигурации sendmail исходящие сообщения неизменно застревают с этим сообщением в / var / log / maillog:
"timeout waiting for input from googlemail-smtp.l.google.com. during client greeting"
Затем сообщения попадают в mailq и остаются там, терпя неудачу при каждой повторной попытке.
Вот различия между sendmail.cf, который работает путем прямой отправки, и тем, который был модифицирован для передачи через Google:
# diff sendmail.mc-orig sendmail.mc-new
26c27,30
< dnl define(`SMART_HOST', `smtp.your.provider')dnl
---
> define(`SMART_HOST', `[smtp.googlemail.com]')dnl
> define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
> define(`ESMTP_MAILER_ARGS', `TCP $h 587')dnl
> FEATURE(authinfo, `Hash -o /etc/mail/authinfo.db')dnl
52,53c56,59
< dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
< dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
---
> dnl # TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
> dnl # define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
> TRUST_AUTH_MECH(`PLAIN LOGIN')dnl
> define(`confAUTH_MECHANISMS', `PLAIN LOGIN')dnl
Вот (очищенный) файл authinfo mode 600, принадлежащий root:
AuthInfo:[smtp.googlemail.com] "U:user@gmail.com" P:"xyzzy" "M:PLAIN"
Я также запустил saslauthd и отредактировал /usr/lib/sasl2/Sendmail.conf, чтобы читать:
pwcheck_method:saslauthd
mech_list: login plain
Я не устанавливал никаких сертификатов, потому что, насколько я могу судить, они не нужны, если sendmail использует TLS только для исходящих соединений; и действительно, соединение по порту 587 работает в приложении Zend Framework без установленных сертификатов (или запущенного saslauthd в этом отношении).
Почтовый журнал уровня 29 для сообщения, отправленного с конфигурацией ретрансляции sendmail, выглядит следующим образом:
[31528]: q1F5dYcB031528: from=userapp.com+admin@gmail.com, size=7085, class=0, nrcpts=1, msgid=<3fb0c7a36a63b2b855336d0865b345a7@bugs.userapp.com>, relay=nobody@localhost
[31529]: NOQUEUE: connect from localhost [127.0.0.1]
[31529]: AUTH: available mech=PLAIN LOGIN, allowed mech=PLAIN LOGIN
[31529]: q1F5dYYY031529: Milter: no active filter
[31529]: q1F5dYYY031529: --- 220 name.compute-1.internal ESMTP Sendmail 8.14.4/8.14.4; Wed, 15 Feb 2012 05:39:34 GMT
[31529]: q1F5dYYY031529: <-- EHLO name.compute-1.internal
[31529]: q1F5dYYY031529: --- 250-name.compute-1.internal Hello localhost [127.0.0.1], pleased to meet you
[31529]: q1F5dYYY031529: --- 250-ENHANCEDSTATUSCODES
[31529]: q1F5dYYY031529: --- 250-PIPELINING
[31529]: q1F5dYYY031529: --- 250-8BITMIME
[31529]: q1F5dYYY031529: --- 250-SIZE
[31529]: q1F5dYYY031529: --- 250-DSN
[31529]: q1F5dYYY031529: --- 250-ETRN
[31529]: q1F5dYYY031529: --- 250-AUTH PLAIN LOGIN
[31529]: q1F5dYYY031529: --- 250-DELIVERBY
[31529]: q1F5dYYY031529: --- 250 HELP
[31529]: q1F5dYYY031529: <-- MAIL From:<userapp.com+admin@gmail.com> SIZE=7085 AUTH=userapp.com+2Badmin@gmail.com
[31529]: ruleset=trust_auth, arg1=userapp.com+2Badmin@gmail.com, relay=localhost [127.0.0.1], reject=550 5.7.1 <userapp.com+admin@gmail.com>... not authenticated
[31529]: q1F5dYYY031529: --- 250 2.1.0 <userapp.com+admin@gmail.com>... Sender ok
[31529]: q1F5dYYY031529: <-- RCPT To:<user@example.com>
[31529]: q1F5dYYY031529: --- 250 2.1.5 <user@example.com>... Recipient ok
[31529]: q1F5dYYY031529: <-- DATA
[31529]: q1F5dYYY031529: --- 354 Enter mail, end with "." on a line by itself
[31529]: q1F5dYYY031529: from=<userapp.com+admin@gmail.com>, size=7190, class=0, nrcpts=1, msgid=<3fb0c7a36a63b2b855336d0865b345a7@bugs.userapp.com>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
[31529]: q1F5dYYY031529: --- 250 2.0.0 q1F5dYYY031529 Message accepted for delivery
[31528]: q1F5dYcB031528: to=user@example.com, ctladdr=userapp.com+admin@gmail.com (99/99), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=37085, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (q1F5dYYY031529 Message accepted for delivery)
[31529]: q1F5dYYZ031529: <-- QUIT
[31529]: q1F5dYYZ031529: --- 221 2.0.0 name.compute-1.internal closing connection
[31531]: q1F5dYYY031529: SMTP outgoing connect on name.compute-1.interna
[31531]: q1F5dYYY031529: timeout waiting for input from googlemail-smtp.l.google.com. during client greeting
[31531]: q1F5dYYY031529: to=<user@example.com>, delay=00:05:00, xdelay=00:05:00, mailer=relay, pri=127190, relay=googlemail-smtp.l.google.com. [74.125.91.16], dsn=4.0.0, stat=Deferred: Connection timed out with googlemail-smtp.l.google.com.
Я вижу сообщение "ruleset = trust_auth, ... not authenticated", но, помимо того, что я не знаю, как это исправить, я также вижу, что за ним сразу следует сообщение ok, а в журнале показано, что оно продолжается, чтобы попытаться подключиться к реле, поэтому я думаю, что это не имеет ничего общего с таймаутом ... Если я ошибаюсь, и кто-то может сказать мне, как это исправить, это было бы здорово!
Почтовый журнал для сообщения, отправленного с неизмененной конфигурацией, которое работает без ретрансляции (обратите внимание, что "user@example.com" на самом деле является адресом с mx-записью для сервера Network Solutions, поэтому последняя строка имеет relay = для хост netsol.net):
[31425]: q1F5VtLr031425: from=userapp+admin@gmail.com, size=6743, class=0, nrcpts=1, msgid=<8aa8ddfdc691cb86896329126a4eb6ef@bugs.userapp.com>, relay=nobody@localhost
[31426]: NOQUEUE: connect from localhost [127.0.0.1]
[31426]: AUTH: available mech=PLAIN LOGIN, allowed mech=EXTERNAL GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5
[31426]: q1F5VuPd031426: Milter: no active filter
[31426]: q1F5VuPd031426: --- 220 name.compute-1.internal ESMTP Sendmail 8.14.4/8.14.4; Wed, 15 Feb 2012 05:31:56 GMT
[31426]: q1F5VuPd031426: <-- EHLO name.compute-1.internal
[31426]: q1F5VuPd031426: --- 250-name.compute-1.internal Hello localhost [127.0.0.1], pleased to meet you
[31426]: q1F5VuPd031426: --- 250-ENHANCEDSTATUSCODES
[31426]: q1F5VuPd031426: --- 250-PIPELINING
[31426]: q1F5VuPd031426: --- 250-8BITMIME
[31426]: q1F5VuPd031426: --- 250-SIZE
[31426]: q1F5VuPd031426: --- 250-DSN
[31426]: q1F5VuPd031426: --- 250-ETRN
[31426]: q1F5VuPd031426: --- 250-DELIVERBY
[31426]: q1F5VuPd031426: --- 250 HELP
[31426]: q1F5VuPd031426: <-- MAIL From:<userapp+admin@gmail.com> SIZE=6743
[31426]: q1F5VuPd031426: --- 250 2.1.0 <userapp+admin@gmail.com>... Sender ok
[31426]: q1F5VuPd031426: <-- RCPT To:<user@example.com>
[31426]: q1F5VuPd031426: --- 250 2.1.5 <user@example.com>... Recipient ok
[31426]: q1F5VuPd031426: <-- DATA
[31426]: q1F5VuPd031426: --- 354 Enter mail, end with "." on a line by itself
[31426]: q1F5VuPd031426: from=<userapp+admin@gmail.com>, size=6848, class=0, nrcpts=1, msgid=<8aa8ddfdc691cb86896329126a4eb6ef@bugs.userapp.com>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1]
[31426]: q1F5VuPd031426: --- 250 2.0.0 q1F5VuPd031426 Message accepted for delivery
[31425]: q1F5VtLr031425: to=user@example.com, ctladdr=userapp+admin@gmail.com (99/99), delay=00:00:01, xdelay=00:00:00, mailer=relay, pri=36743, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (q1F5VuPd031426 Message accepted for delivery)
[31428]: q1F5VuPd031426: SMTP outgoing connect on name.compute-1.interna
[31426]: q1F5VuPe031426: <-- QUIT
[31426]: q1F5VuPe031426: --- 221 2.0.0 name.compute-1.internal closing connection
[31428]: q1F5VuPd031426: to=<user@example.com>, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=126848, relay=inbound.domain.netsolmail.net. [205.178.149.7], dsn=2.0.0, stat=Sent (OK FB/29-06630-5434B3F4)
[31428]: q1F5VuPd031426: done; delay=00:00:00, ntries=1
Вот что я получаю при использовании telnet:
# telnet smtp.googlemail.com 587
Trying 74.125.93.16...
Connected to smtp.googlemail.com.
Escape character is '^]'.
220 mx.google.com ESMTP j17sm7987765qaj.9
502 5.5.1 Unrecognized command. j17sm7987765qaj.9
STARTTLS
503 5.5.1 EHLO/HELO first. j17sm7987765qaj.9
EHLO localhost
250-mx.google.com at your service, [nnn.nnn.nnn.nnn]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
STARTTLS
220 2.0.0 Ready to start TLS
Любая помощь очень ценится!
Похоже, у вас есть небольшая опечатка в объявлении пароля, поэтому попробуйте следующее:
AuthInfo:googlemail.com "U:user@gmail.com" "P:xyzzy" "M:PLAIN"
AuthInfo:google.com "U:user@gmail.com" "P:xyzzy" "M:PLAIN"
Не забудьте запустить makemap и пересобрать authinfo.db:
makemap hash authinfo < authinfo