Pos-исправление Docker django + host выдает "Неверный адрес почтового ящика назначения: адрес не распознается шлюзом`
Я пытаюсь убедить контейнеризированный django отправлять электронные письма, используя установку postfix на моем хосте, и мне говорят Bad destination mailbox address: Address not recognized by gateway.
( Для получения более подробной информации, приложение django, которое я запускаю, называется docker-zulip.)
Когда я отправляю электронное письмо для восстановления пароля, я ожидаю, что оно будет отправлено, но журнал моего сервера в контейнере (/var/log/zulip/server.log
) сообщает:
2025-09-01 22:47:00.280 ERR [zulip.send_email] Error sending password_reset email to ['User <user@gmail.com>'
]: {'User <user@gmail.com>': (550, b'5.1.1 Bad destination mailbox address: Address not recognized by gateway.
')}
Мне известно о сообщении SO Как вы настраиваете Django для отправки почты через Postfix?, и я использую его предписанные настройки. Но этот пост не посвящен настройкам docker, поэтому, похоже, требуется что-то еще.
Может ли хостинг отправлять электронные письма? Да
Я могу достаточно легко отправлять электронные письма с хостинга, используя echo "BODY" | mailx -r test@example.com -s "SUBJECT" user@gmail.com
.
Настроен ли postfix на распознавание трафика из контейнера? Я думаю, что да
Я настроил /etc/postfix/main.cf
таким образом, чтобы, как мне кажется, поддерживать мой контейнер docker (работающий на 172.18.0.100
):
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 172.18.0.0/24
inet_interfaces = 172.17.0.1 172.18.0.1 172.23.0.1
...и я побежал systemctl restart postfix
.
Я не вижу никакой активности в журналах хоста /var/log/mail.{err,log}
.
Я нашел решение: в настройках электронной почты вместо указания localhost
для узла электронной почты вы должны указать адрес вашего узла, который отображается в сети контейнера.
В этом случае я могу получить этот адрес, выполняя команды на хосте (не в контейнере):
docker network ls | grep -oP '\w*zulip\w*' # => zulip_default
docker network inspect zulip_default | grep Subnet # => "Subnet": "172.18.0.0/24"
ip a | grep 172.18.0. # => inet 172.18.0.1/24 brd ...
Итак, с точки зрения моего контейнера, адрес моего хоста (на котором запущен postfix) равен 172.18.0.1
.
Итак, я обновляю файл docker-compose.yml
в моем docker-zulip, чтобы он содержал
SETTINGS_EMAIL_HOST = '172.18.0.1'
SETTINGS_EMAIL_PORT = 25
SETTINGS_EMAIL_HOST_USER = ''
SETTINGS_EMAIL_USE_TLS = False
Теперь при следующем запуске контейнера я смогу отправить zulip электронное письмо для восстановления пароля по электронной почте.