Записи 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