Azure Communication Serviceを使ったDiscourseのSMTP設定に苦労しています

皆さん、こんにちは。

Discourse の SMTP 設定に苦労しており、かなりの難題となっています。多くの投稿を調べましたが(例えばこちら)、うまくいきませんでした。

状況は以下の通りです。問題は、使用を求められているユーザー名とパスワードの形式と長さに起因しているのではないかと疑っています。SMTP サーバーとして Azure Communication Service を利用しており、Azure Entra アプリ(旧 Azure Active Directory)を必要とする特定の構成が必要です。

端的に言うと、ユーザー名の形式は次のようになります(実際の認証情報ではなく、例です)。

<Azure Communication Services リソース名>.<Entra アプリケーション ID>.<Entra アプリケーション テナント ID>

例: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 = "You a chosen";
    string body = "One gorgeous 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("The email was successfully sent using Smtp.");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Smtp failed with the exception: {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

ユーザー名とパスワードを単一引用符、二重引用符、または省略するなど、さまざまな方法で囲んで試しましたが、結果は同じでした。

他に試せることについてのポインタや提案があれば、大いに感謝します。

「いいね!」 1

Azure Communication Serviceで同様の問題が発生しました。

Microsoft Docsによると、アプリケーションでMicrosoft Entraがサポートされている必要があるようですが、Discourseは残念ながらそれをサポートしていません。

それまでの間、他に利用可能な方法があれば教えていただけると幸いです。

私も同じ問題に遭遇し、ウェブ検索でこのトピックを見つけました。Microsoft 365 のメールサーバーがパスワードベースの認証を廃止する前と同様に、AUTH LOGIN のみがサポートされており、AUTH PLAIN はサポートされていないようです。AUTH PLAIN は、この記事の執筆時点では Discourse のデフォルトとなっています(デフォルトはこちら)。

コンテナ構成で DISCOURSE_SMTP_AUTHENTICATION: login を設定すると、メールが機能するようになります。また、デフォルトでは、「from」メールとして許可されるのは DoNotReply@domain.example のみであることにも注意してください。これを設定しないと、「550 5.3.5 Email sender’s username is invalid」というエラーでメールが拒否されます。

「いいね!」 4

これで修正されたようです