Записи sendmail и MX, когда почтовый сервер не находится на веб-хосте

Это проблема, которую, я уверен, легко решить, но я весь день ломал голову над ней.

Я разрабатываю новый веб-сайт для клиента. Сайт находится по адресу (это пример) website.com. У меня есть скрипт PHP-формы для отправки запросов посетителей по адресу questions@website.com.

Когда я кодировал это на промежуточном сервере в другом домене, все работало нормально. Когда я переместил его на website.com, почтовые сообщения так и не пришли. Веб-сервер находится на виртуальном хосте с крупным провайдером.

Вот что я узнал с тех пор: почтовый сервер моего клиента - это Microsoft Exchange, установленный в их офисе. Всякий раз, когда кто-то из внешнего мира отправляет электронное письмо по адресу request@website.com, приходит письмо. Но если веб-сервер отправляет на тот же адрес электронной почты, каждый раз происходит сбой. Это не проблема PHP. Я защищаю оболочку на веб-сервере и проверил это как с sendmail, так и с почтовым приложением UNIX. Я также проверил это, отправив по электронной почте различные учетные записи электронной почты из оболочки. Я, например, могу написать себе по электронной почте, но никто не может в домене website.com.

Короче говоря, когда я захожу на сайт website.com, отправка писем по адресу request@website.com, user@website.com, another_user@website.com завершается ошибкой. Все остальные адреса работают нормально. Я обнаружил, что эти отброшенные письма направляются на "ловящую" учетную запись веб-сервера, где они находятся в папке "Входящие".

Я сделал поиск MX на website.com. Запись MX указывает на mailsec.website.com. Я могу telnet к порту mailsec.website.com 25 и видеть сервер SMTP.

Мне кажется, что website.com не выполняет поиск MX, когда отправляет почту по адресу ques@website.com. Моя теория состоит в том, что он распознает домен как локальный, видит, что нет учетной записи "запрашивающего" пользователя, чтобы доставить его, и сбрасывает почту в универсальную учетную запись. Я хочу заставить sendmail выполнить поиск MX и отправить сообщение на сервер Exchange. Я в конце остроумие здесь. Я не могу понять, как это сделать.

В этом отношении я могу быть далеко от основания здесь и неправильно диагностировал это полностью. Интернет-почта и MX всегда казались мне черным искусством, и мое невежество определенно проявляется в этом вопросе.

7 ответов

Решение

Я думаю, проблема в том, что sendmail (ваш процесс) общается с локальным демоном sendmail. Местный демон sendmail считает, что, поскольку это сайт website.com, он должен знать, как доставить электронную почту. К сожалению, фактический адрес в поле to не существует на веб-сервере, и поэтому он сбрасывает его в почтовый ящик "catchall". Вам следует поговорить с вашим интернет-провайдером и попросить его обновить конфигурацию sendmail, чтобы почта, адресованная...@website.com, пересылалась в почтовый обменник, а не обрабатывалась локально.

По умолчанию Sendmail угадывает список локальных почтовых доменов. Его можно отключить, используя следующую строку в вашем файле sendmail.mc:

define(`confDONT_PROBE_INTERFACES',`True')

В качестве корневого списка локальных почтовых доменов до и после изменения.

echo '$=w' | sendmail -Am -bt

Вы увидите, какие домены следует добавить "вручную" (обычно) в файл /etc/mail/local-host-names после отключения автоматического угадывания.

PS Для вопроса sendmail вы можете использовать новости:comp.mail.sendmail

В основном, tvanfosson имеет его, но в качестве временного обходного пути вы сможете изменить свой сценарий так, чтобы он отправлял по почте "user@mailsec.website.com", и тогда почта будет доставляться на реальный почтовый сервер.

Застрял на той же проблеме. MX указывает на внешний сервер Exchange, но php/sendmail не просматривал эту запись. Вместо этого письма, размещенные WordPress на этом веб-сервере, помещаются в почтовый ящик catchall.

Решением было удалить ВСЕ почтовые ящики на веб-сервере. Теперь sendmail интересовался MX, и все письма отправлялись на Exchange.

Однако Exchange использует почтовый сервер веб-пространства в качестве SmartHost для исходящей почты. В качестве решения для этого мы смогли использовать учетные данные FTP для доступа к почтовому серверу. Я предполагаю, что это решение не работает на всех провайдерах на этой планете, но в нашем случае (all-inkl.com) оно сработало.

Отредактируйте файл tsm.cf (в /etc/mail/ или аналогичный), чтобы включить

FEATURE(relay_entire_domain) 

между линиями DOMAIN() и MAILER(). Так как вы редактируете файл, вы можете также улучшить безопасность с

define(`confPRIVACY_FLAGS',``noexpn,novrfy'')

После изменения файла tsm.cf (или любого файла конфигурации sendmail) перезапустите или SIGHUP процесс sendmail.

Это изменение необходимо, поскольку серверы WWW и MX для домена не существуют в одном и том же пространстве процесса; эта функция запускает sendmail для обработки сообщений для домена, используя механизм внешней доставки.

Отредактированная часть файла tsm.cf должна выглядеть примерно так:

DOMAIN(website.com)dnl
FEATURE(relay_entire_domain)dnl
define(`confPRIVACY_FLAGS',``noexpn,novrfy'')dnl
MAILER(smtp)dnl
MAILER(procmail)dnl

Я здесь новенький. Хотел расширить ответ RB_CWI, но мне не разрешено комментировать. Его решение работало отлично.

Вы не обязаны определять ДОМЕН ().

Однако в моей системе мне потребовалось установить пакет sendmail-cf.

Приведенные ниже инструкции были сделаны на CentOS 6.5

Сначала установите sendmail-cf

sudo yum install sendmail-cf

Затем отредактируйте файл senmail.mc

sudo vi /etc/mail/sendmail.mc

В нижней части файла добавьте FEATURE(relay_entire_domain)dnl, чтобы он выглядел следующим образом:

...
FEATURE(relay_entire_domain)dnl
MAILER(smtp)dnl        # right above this line
MAILER(procmail)dnl
dnl MAILER(cyrusv2)dnl

Сохраните файл и перезапустите sendmail.

sudo service sendmail restart

Для меня работало добавление записи MX на веб-сервере, на котором размещен веб-сайт, который указывает на хост, назначенный на исходном сервере доменных имен. В представленном здесь случае будет запись mx, указывающая на: mailsec.website.com

Другие вопросы по тегам