Трудности с настройкой SMTP в Discourse через Azure Communication Service

Всем привет,

У меня возникли сложности с настройкой SMTP на моей установке Discourse, и это оказалось настоящим испытанием. Я перелопатил множество постов, таких как этот, но безрезультатно.

Вот суть дела: я подозреваю, что мои проблемы связаны с форматом и длиной имени пользователя и пароля, которые мне предписано использовать. Я подключаюсь к службе Azure Communication Service в качестве SMTP-сервера, что требует специфической конфигурации с использованием приложения Azure Entra (ранее Azure Active Directory).

Если коротко, формат имени пользователя выглядит примерно так (это не реальные учетные данные, а пример):

<Имя ресурса Azure Communication Services>.<Идентификатор приложения Entra>.<Идентификатор арендатора приложения Entra>

Вот пример: my-communication-service.7d8233e0-c230-4468-a2de-1d03aa64bb71.49ba4f9c-3b18-43df-b5fd-5e203ba6e031

Более подробную информацию можно найти по этой ссылке.

Тем временем пароль должен соответствовать формату секретного ключа, сгенерированного Azure, например:

b_C8Q~WjHH~MtFQptMj8wR1KroOZYigGy3A3Zc5M

Теперь, у меня эта настройка отлично работает в C# с аналогичными учетными данными.

 private static void SendMail()
    {
        string smtpAuthUsername = "my-communication-service.7d8233e0-c230-4468-a2de-1d03aa64bb71.49ba4f9c-3b18-43df-b5fd-5e203ba6e031";
        string smtpAuthPassword = "a~C8Q~WjHH~MtFQptMj8wR1KroOZYigGy3A3Zc5M";

        string sender = "DoNotReply@my-domain.com";
        string recipient = "admin@my-domain";
        string subject = "Вы выбраны";
        string body = "Одно прекрасное тело";
        string smtpHostUrl = "smtp.azurecomm.net";

        using (var client = new SmtpClient(smtpHostUrl))
        {
            client.Port = 587;
            client.Credentials = new NetworkCredential(smtpAuthUsername, smtpAuthPassword);
            client.EnableSsl = false;

            var message = new MailMessage(sender, recipient, subject, body);

            try
            {
                client.Send(message);
                Console.WriteLine("Электронное письмо было успешно отправлено через Smtp.");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Smtp не удался с исключением: {ex.Message}.");
            }
        }
    }

Однако, когда я пытаюсь применить эти настройки в Discourse, начинаются проблемы. Вот как у меня настроено:

DISCOURSE_SMTP_ADDRESS: smtp.azurecomm.net
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: "my-communication-service.7d8233e0-c230-4468-a2de-1d03aa64bb71.49ba4f9c-3b18-43df-b5fd-5e203ba6e031"
DISCOURSE_SMTP_PASSWORD: "b_C8Q~WjHH~MtFQptMj8wR1KroOZYigGy3A3Zc5M"
DISCOURSE_SMTP_ENABLE_START_TLS: true
DISCOURSE_SMTP_DOMAIN: my-domain.com
DISCOURSE_NOTIFICATION_EMAIL: DoNotReply@my-domain.com

Однако, несмотря на эту настройку, я продолжаю получать ошибку аутентификации, согласно фрагменту журнала:

Job exception: Net::SMTPAuthenticationError

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

Любые подсказки или предложения, что еще можно попробовать, будут крайне полезны.

Здравствуйте, я столкнулся с той же проблемой в службе Azure Communication Service.

Согласно документации Microsoft, возможно, проблема в том, что приложение должно поддерживать Microsoft Entra, но, к сожалению, Discourse не поддерживает это.

Тем временем я также жду информации о любых других доступных методах.

Я столкнулся с той же проблемой и нашел эту тему в поиске в интернете. Похоже, что (как и в случае с почтовыми серверами Microsoft 365 до отключения аутентификации по паролю) поддерживается только AUTH LOGIN, а не AUTH PLAIN, который является настройкой по умолчанию в Discourse на момент написания этого текста.

Установка параметра DISCOURSE_SMTP_AUTHENTICATION: login в конфигурации контейнера позволяет электронной почте работать. Также стоит отметить, что по умолчанию разрешён только один адрес отправителя «от»: DoNotReply@domain.example. Если вы не зададите его, ваши письма будут отклоняться с ошибкой «550 5.3.5 Имя пользователя отправителя электронной почты недействительно».

Похоже, это уже исправлено, спасибо @justinm

Я тоже пытаюсь настроить это, следуя предложенному здесь совету. Однако мне также не удалось это сделать, но я не могу найти никаких логов, касающихся проблемы с SMTP. Вы знаете, какой файл логов мне следует проверить? Спасибо.

Вам следует проверить URL /logs.

Если вы отлаживаете систему, возможно, вам быстрее поможет задача rake 'emails:test[your_email]'.

Также вы можете установить переменные окружения, чтобы опробовать различные варианты без необходимости пересборки контейнера, например:

$ DISCOURSE_SMTP_PORT=587 DISCOURSE_SMTP_USER_NAME=bilbo DISCOURSE_SMTP_PASSWORD=ring rake emails:test'[frodo@shire.net]'

Я использую образ discourse/discourse 2025.12.0. Интересно, что даже если я не устанавливаю переменную DISCOURSE_SMTP_PASSWORD, в файле production.log не отображается никаких ошибок, как будто задача регистрации пользователя-администратора не вызывается. Единственный доступный лог:

Started POST "/finish-installation/register" for xxx at 2026-01-09 16:48:11 +0000
Processing by FinishInstallationController#register as HTML
Parameters: {"authenticity_token"=>"xxx", "email"=>"xxx", "username"=>"xxx", "password"=>"[FILTERED]", "commit"=>"Register"}
Redirected to xxx

Completed 302 Found in 489ms (ActiveRecord: 0.0ms (0 queries, 0 cached) | GC: 131.6ms)

Вы ищете https://whateveryoursiteis.com/logs

Изменено, проблема решена. Проблема заключалась в том, что переменная окружения для имени пользователя должна быть DISCOURSE_SMTP_USER_NAME, а не DISCOURSE_SMTP_USERNAME.

Ниже приведённая конфигурация работает:

DISCOURSE_SMTP_USER_NAME: <Имя пользователя SMTP службы Azure Communication Service (не обязательно должно быть в формате <Имя ресурса Azure Communication Services>.<Идентификатор приложения Entra>.<Идентификатор арендатора приложения Entra>)>
DISCOURSE_SMTP_PASSWORD: xxx
DISCOURSE_SMTP_DOMAIN: вашдомен
DISCOURSE_NOTIFICATION_EMAIL: DoNotReply@вашдомен
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_ENABLE_START_TLS: true

Вы можете выполнить команду rake admin:create из контейнера, чтобы создать учётную запись напрямую.

Также я только что узнал, что способ обработки переменных окружения изменился — теперь мы считываем их только при запуске контейнера.

Если вы хотите протестировать другое значение, необходимо отредактировать файл /var/www/discourse/config/discourse.conf.

:+1: