在 Discourse 中使用 Azure Communication Service 配置 SMTP 时遇到困难

大家好,

我一直在努力在我的 Discourse 安装中设置 SMTP,这确实是一个挑战。我查阅了许多帖子,例如这一个,但都没有成功。

情况是这样的:我怀疑我的问题与我必须使用的用户名和密码的格式及长度有关。我正在使用 Azure Communication Service 作为我的 SMTP 服务器,这需要一种特定的配置,其中涉及 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 不支持这一点。

同时,我也期待其他可用的方法。

我遇到了同样的问题,在网络搜索中找到了这个主题,看起来(就像微软 365 电子邮件服务器在放弃基于密码的身份验证之前一样)只支持 AUTH LOGIN,而不支持 AUTH PLAIN,而 AUTH PLAIN 是 Discourse 在撰写本文时默认支持的。

在容器配置中设置 DISCOURSE_SMTP_AUTHENTICATION: login 可以使电子邮件正常工作。另外值得注意的是,默认情况下,唯一允许的“发件人”电子邮件是默认的 DoNotReply@domain.example - 如果你不设置这个,你的电子邮件将被拒绝,并显示“550 5.3.5 Email sender’s username is invalid”。

4 个赞

看起来现在已经修复了

我一直在尝试根据这里的建议进行设置。但是,我也无法使其正常工作,但我找不到任何有关 SMTP 问题的日志。您知道我应该查看哪个日志文件吗?谢谢。

您需要检查 /logs URL。

如果您正在调试,尝试运行 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_PASSWORDproduction.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: <Azure通信服务 SMTP 用户名 (不需要是 <Azure 通信服务资源名称>.<Entra 应用程序 ID>.<Entra 租户 ID>)>
DISCOURSE_SMTP_PASSWORD: xxx
DISCOURSE_SMTP_DOMAIN: yourdomain
DISCOURSE_NOTIFICATION_EMAIL:  DoNotReply@yourdomain
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_ENABLE_START_TLS: true

你可以从容器中运行 rake admin:create 直接创建一个帐户

另外,我刚刚了解到我们处理环境变量的方式已经改变了——我们只在容器启动时查看它们。

如果你想测试一个不同的值,你需要编辑 /var/www/discourse/config/discourse.conf

:+1: