Проблемы с настройкой hostmail

Приветствую. Надеюсь, вы не против, что я перехватил эту ветку.

У моего хостинг-провайдера нет проблем с электронной почтой. Все тесты с использованием различных инструментов проходят успешно — порты открыты и должны отправлять почту. Проблема в том, что с Discourse это не работает.

https://carlosthomas.net/photos/picture.php?/911/category/8

Независимо от того, какой порт я пробую, я получаю те же ошибки.

Я вручную создал учетные записи и могу войти, но для приглашений и подтверждения нужны электронные письма. Я протестировал с MailGun, и это работает, но я не могу понять, почему это не работает с моим хостинг-провайдером. Я связался с ними, и они сказали, что всё должно быть в порядке, поэтому я немного в тупике.

https://carlosthomas.net/photos/picture.php?/913/category/8

Как новый пользователь, я могу разместить только две ссылки, но они должны привести вас к остальным фотографиям.

Дайте знать, если вам нужны какие-либо логи — у меня ограниченный опыт работы с *NIX, но я могу следовать инструкциям. Заранее спасибо.

Спасибо @JammyDodger за разделение/перемещение. Надеюсь получить помощь по этому вопросу. Сервер не является постоянным — он используется для тестирования, поэтому любые необходимые логи или команды можно выполнить для поиска решения.

Суть проблемы: электронная почта работает (в основном) через MailGun, но не работает с хостинг-провайдером. Письма от MailGun на бесплатные сервисы (GMAIL и т.д.) доставляются без проблем. Попытки отправить письмо от MailGun на мой домен/хостинговую почту завершаются неудачей. Не понимаю, в чём дело. Использование почты домена работает отлично в любых других приложениях — OSTicket, InvoiceNinja, Windows Mail, ThunderBird и т.д.

Буду признателен за любую помощь. Заранее спасибо.

Это действительно странно, если учётные данные хостмайл работают в других инструментах и при условии, что они правильно вставлены в конфигурацию Discourse. Есть ли у вас средства безопасности, которые могут блокировать домен хостмайл?

Вы также можете посмотреть в <discourse_url>/logs, чтобы увидеть подробную ошибку о том, что происходит.

Спасибо за ваш ответ. Вот некоторая информация.

Сообщение (12 копий)

Исключение в задаче: истекло время выполнения


Трассировка стека

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `open'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:631:in `tcp_socket'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:641:in `block in do_start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/timeout-0.4.0/lib/timeout.rb:186:in `block in timeout'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/timeout-0.4.0/lib/timeout.rb:193:in `timeout'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:640:in `do_start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/net-smtp-0.4.0/lib/net/smtp.rb:610:in `start'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:109:in `start_smtp_session'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/mail-2.8.1/lib/mail/network/delivery_methods/smtp.rb:100:in `deliver!'

Итак, чтобы прояснить: «hostmail» — это просто имя, которое я дал ему, так как это почта моего хостинг-провайдера (GlowHost) с домена, который я тестирую — discourse.carlosthomas.net. Она работает в основном нормально с MailGun, но не с размещённой почтой.

Я не знал о /logs. Я могу перенастроить параметры, очистить логи, а затем попытаться отправить письма и опубликовать информацию, если вы хотите. Я также могу очистить логи сейчас, отправить письмо на Gmail (что успешно), а затем отправить на мою размещённую почту (что не удастся), и прислать логи.

Добавлю немного контекста. Друзья управляют сайтом на vBulletin 4.2.5, и я временно хосту Discourse для них, чтобы они могли ознакомиться с ним. Проблема заключается в электронной почте — я могу достаточно хорошо следовать инструкциям, чтобы вручную создавать учётные записи, но если они решат перейти на Discourse, им понадобятся адреса электронной почты для добавления пользователей. Также есть вопрос импорта — я нашёл эту ссылку, которая, думаю, может помочь.

Но проблему с электронной почтой нужно решить. Я буду держать сервер с Discourse запущенным только до тех пор, пока не решим этот вопрос. И я пытаюсь показать, какой уровень поддержки здесь предоставляется. Мой опыт, основанный на деталях из форумов и том, что я видел, говорит о том, что использование, миграция и поддержка должны быть достаточно простыми, как только будут выполнены требования к хостингу платформы. И при использовании официальных методов получение поддержки должно быть достаточно простым.

Но да — вот на каком мы этапе. Ждём обратной связи.

Всем привет. Если всё пойдёт хорошо, в эти выходные я попробую кое-что сделать. Планирую полностью очистить систему и переустановить её, а затем публиковать ход работ. Если у кого-то есть предложения до этого момента — пожалуйста, дайте знать.

Когда доберусь до этого этапа, я извлеку все доступные логи и опубликую их здесь. Для процесса я буду использовать случайно сгенерированные пароли, чтобы те, кто хочет помочь, могли получить доступ. Посмотрим, как всё получится.

Сейчас провожу проверки и изменения в файле app.yml — ранее очистил логи. Попробую отправить письма и сообщу о результатах.

EDIT
Очистка логов и отправка писем на Gmail или на мой собственный домен не показывают ошибок. Письма приходят на Gmail, но не на мой домен.

Логи в MailGun говорят примерно следующее:

{
	"recipient": "me@mydomain",
	"id": "SCBCSJxDSqupdU9Da29rRw",
	"envelope": {
		"sender": "postmaster@mg.mydomain",
		"targets": "me@mydomain",
		"transport": "smtp",
		"sending-ip": "192.168.0.1"
	},
	"timestamp": 1697462206.8430145,
	"user-variables": {},
	"message": {
		"headers": {
			"from": "Discourse Test Forum <postmaster@mg.mydomain>",
			"message-id": "9d3b190d-bcbd-4378-8eb6-fc90cd57fe35@discourse.mydomain",
			"to": "me@mydomain",
			"subject": "[Discourse Test Forum] Email Deliverability Test"
		},
		"attachments": [],
		"size": 4546
	},
	"storage": {
		"region": "us-west1",
		"key": "BAABAQUOTl3y4PtvsqlN5Z2OvaxXslLlZA",
		"env": "production",
		"url": "https://storage-us-west1.api.mailgun.net/v3/domains/mg.mydomain/messages/BAABAQUOTl3y4PtvsqlN5Z2OvaxXslLlZA"
	},
	"reason": "generic",
	"delivery-status": {
		"enhanced-code": "",
		"mx-host": "mydomain",
		"description": "",
		"certificate-verified": true,
		"attempt-no": 1,
		"code": 550,
		"message": "Verification failed for <bounce+674b6a.be6180c-me=mydomain@mg.mydomain>\nThe mail server does not recognize bounce+674b6a.be6180c-me=mydomain@mg.mydomain as a valid sender.\nSender verify failed",
		"session-seconds": 40.878,
		"tls": true
	},
	"campaigns": [],
	"severity": "permanent",
	"tags": [],
	"recipient-domain": "mydomain",
	"flags": {
		"is-routed": false,
		"is-authenticated": true,
		"is-test-mode": false,
		"is-system-test": false
	},
	"log-level": "error",
	"event": "failed"
}

Это происходит только при попытке отправки на мой собственный домен. Если я пробую любой другой домен — всё работает, независимо от того, бесплатный он или нет.

Текущие настройки в файле app.yml:

## это шаблон контейнера Docker Discourse all-in-one (standalone)
##
## После внесения изменений в этот файл ОБЯЗАТЕЛЬНО выполните пересборку:
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ И ВЫРАВНИВАНИИ!
## Для проверки файла используйте http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Раскомментируйте следующую строку, чтобы включить слушатель IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## какие TCP/IP порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал тот же порт, что и другой веб-сервер (например, Apache или nginx),
## см. https://meta.discourse.org/t/17247 для деталей
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум на 25% от общего объёма памяти.
  ## Значение будет установлено автоматически при загрузке на основе обнаруженной оперативной памяти, либо вы можете переопределить его
  db_shared_buffers: "2048MB"

  ## может улучшить производительность сортировки, но увеличивает потребление памяти на каждое подключение
  #db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от объёма памяти и количества ядер CPU.
  ## Значение будет установлено автоматически при загрузке на основе обнаруженных процессоров, либо вы можете переопределить его
  UNICORN_WORKERS: 8

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: mydomain

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (-h опция), что указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первой регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'me@mydomain'

  ## TODO: SMTP-сервер для проверки новых учётных записей и отправки уведомлений
  ## SMTP-адрес, имя пользователя и пароль обязательны
  ## ВНИМАНИЕ: символ '#' в пароле SMTP может вызвать проблемы!
  
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@mg.mydomain
  DISCOURSE_SMTP_PASSWORD: "mailgunpassword"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true             # (опционально, по умолчанию true)
  #DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_DOMAIN: mydomain
  DISCOURSE_NOTIFICATION_EMAIL: postmaster@mg.mydomain


  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: freemailaccount

  ## Адрес CDN (http или https) для этого экземпляра Discourse (настроен на получение)
  ## см. https://meta.discourse.org/t/14857 для деталей
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## Ключ лицензии MaxMind для определения местоположения по IP-адресу
  ## см. https://meta.discourse.org/t/-/137387/23 для деталей
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для деталей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-docs.git
## Любые пользовательские команды для запуска после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес 'From' для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма о регистрации снова закомментируйте эту строку. Выполнять нужно только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

Действительно, единственные изменения, которые были внесены в этот файл, следующие:

DISCOURSE_SMTP_ADDRESS: smtp.mydomain
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: email@mydomain
  DISCOURSE_SMTP_PASSWORD: "mydomainmailpassword"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true             # (опционально, по умолчанию true)
  #DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_DOMAIN: mydomain
  DISCOURSE_NOTIFICATION_EMAIL: email@mydomain

Как только получу ответ от кого-либо, внесу эти изменения, проверю логи и сообщу. Или, может быть, просто сделаю это сейчас — опубликую логи и буду ждать ответа. Не должно занять много времени. Посмотрим.

Честно говоря, я не знаю. :thinking: Похоже, это не проблема Discourse. То есть, письмо было отправлено Discourse корректно, но Mailgun не смог доставить его на указанный адрес электронной почты.

Ошибка 550 означает «Почтовый ящик пользователя недоступен (например, не найден)»

Спасибо за ваш ответ. Не знаю, в чём дело — почта работает нормально. Похоже, проблема именно с моим доменом.

Я изменил настройку на отправку с моего доменного адреса. Сейчас проверю логи и посмотрю, какие ошибки появятся.

РЕДАКТИРОВАНИЕ
Ошибок в логах нет, но я получил вот это.

Попробую запустить через ./discourse-doctor, но логи в /logs абсолютно пустые.

И я получаю те же ошибки, что были в самом начале.

Используемый почтовый адрес работает. Я скопировал и вставил все данные, включая пароль. Я тестировал тот же почтовый ящик в ThunderBird и Windows Mail — никаких проблем. Так что…

Ранее я обращался в поддержку моего хостинг-провайдера — вот их ответ.

Так что я не знаю. Может, что-то упускаю? Тестовые письма отправляются без проблем через порты 465 и 587. Я в тупике.

Есть ли какие-то специальные символы, которые могут блокироваться или вызывать проблемы с настройками почты?

Изменил настройки на порт 465 и вижу только это в /logs.

Ничего серьезного, думаю.

Хочу выразить благодарность и сказать спасибо @Arkshine за помощь до сих пор. Оказалось, что VPS не может достучаться до размещённого домена — поэтому почта не работает. Это довольно странно, но я связываюсь с хостинг-провайдером, чтобы разобраться. Буду держать в курсе.

Это оказалось довольно быстро и просто. Простой ping до размещённого домена из SSH-сессии на VPS, где запущен Discourse, показал, в чём дело. Посмотрим, как всё пойдёт.

РЕДАКТИРОВАНИЕ
Чуть не пожалел, что @Arkshine не ответил, чтобы я мог отметить это как решение. В любом случае — получил ответ от хостинг-провайдера. Оказалось, что их серверы автоматически заблокировали IP-адрес VPS из-за неудачных попыток SMTP. Не совсем понятно, что именно произошло — изменю настройки, проведу тесты снова и посмотрим. Должно быть всё в порядке: теперь размещённый IP доступен для ping с VPS. Проверил настройки почты — всё работает!

Надеюсь, эта информация кому-то пригодится. Если бы я мог отредактировать первое сообщение, то добавил бы краткую выжимку (TL;DR) — или можно просто перейти по ссылке к решению.

Ещё раз — большое спасибо @Arkshine за всю помощь. Так держать!

Я согласен, он очень помогает и является ценным ресурсом. :slight_smile:

Хочу также отметить, что его аватарка и фон профиля действительно крутые. Мне нравится.