Еще одна проблема вас поджидает в том случае, если ваш почтовый сервер не имеет публичный IP адрес, а работает за NAT, как в моем примере. Вообще, я всегда все настраиваю за NAT. Это удобно и безопасно. Все входящие соединения принимает пограничный шлюз, а дальше уже распределяет их в зависимости от настроек. Это может быть проброс портов через NAT, возможно проксирование через nginx или haproxy/
Проблема Зимбры за натом в том, что при получении почты, она будет пытаться доставить ее в службу, принимающую почту на порту 7025 по внешнему ip адресу, несмотря на то, что в файле hosts явно указан локальный ip адрес для нашего домена. Подозреваю, что проверка идет по MX записи, из-за этого и ошибка. Решать ее можно разными способами:
Если у вас есть локальный DNS сервер, настройте там отдельную зону для внутренних клиентов. В этой зоне MX и A записи для домена должны указывать на локальный ip адрес зимбры. Почтовый сервер должен использовать этот dns сервер с локальной зоной. Это самый правильный вариант.
На пограничном шлюзе, который принимает внешние запросы, настройте форвард пакетов, пришедших на порт 7025 из локальной сети обратно на почтовый сервер. Этот вариант сложнее, так как настройка не очевидна и не везде ее можно сделать.
Это вариант я опишу ниже. Я его не до конца понял, но он мне помог 🙂 Насколько я понял, изменили способ резолвинга.
Идем опять в консоль zimbra и выполняем команды:
$ zmprov ms `zmhostname` zimbraMtaLmtpHostLookup native
$ zmprov mcf zimbraMtaLmtpHostLookup native
$ zmmtactl restart
После этого письма нормально стали падать в ящик, так как подключения пошли на локальный адрес и порт 7025.