مشكلة في إعداد SMTP في Discourse مع خدمة اتصالات Azure

مرحباً بالجميع،

لقد كنت أصارع مع إعداد SMTP على تثبيت Discourse الخاص بي، وقد كان ذلك تحديًا كبيرًا. لقد تعمقت في العديد من المشاركات مثل هذه دون جدوى.

إليك القصة: أشك في أن مشاكلي مرتبطة بتنسيق وطول اسم المستخدم وكلمة المرور التي يُطلب مني استخدامها. أنا أستخدم Azure Communication Service لخادم SMTP الخاص بي، والذي يتطلب تكوينًا محددًا يتضمن Azure Entra App (المعروف سابقًا باسم Azure Active Directory).

للوصول إلى صلب الموضوع، يبدو تنسيق اسم المستخدم شيئًا كهذا (ليست بيانات اعتماد فعلية، مجرد مثال):

اسم مورد خدمات الاتصال في Azure.معرف تطبيق 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 = "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، أعتقد أنه قد يكون السبب هو أن Microsoft Entra يجب أن يكون مدعومًا من قبل التطبيق، ولكن Discourse للأسف لا يدعم ذلك.

في هذه الأثناء، أتطلع إلى أي طرق أخرى متاحة أيضًا.

لقد واجهت نفس المشكلة ووجدت هذا الموضوع في بحث على الويب، ويبدو أنه (تمامًا مثل خوادم البريد الإلكتروني Microsoft 365 قبل أن تتخلى عن المصادقة المستندة إلى كلمة المرور) يتم دعم AUTH LOGIN فقط، وليس AUTH PLAIN الذي هو الافتراضي في Discourse في وقت كتابة هذا التقرير.

يؤدي تعيين DISCOURSE_SMTP_AUTHENTICATION: login في تكوين الحاوية إلى عمل البريد الإلكتروني. ومن الجدير بالذكر أيضًا أنه بشكل افتراضي، فإن البريد الإلكتروني الوحيد المسموح به للمرسل هو DoNotReply@domain.example الافتراضي - إذا لم تقم بتعيين هذا، فسيتم رفض رسائل البريد الإلكتروني الخاصة بك مع الخطأ “550 5.3.5 اسم مستخدم مرسل البريد الإلكتروني غير صالح”.

4 إعجابات

يبدو أن هذا تم إصلاحه الآن

لقد كنت أحاول إعداده أيضًا باتباع الاقتراح هنا. ومع ذلك، لم أتمكن من تشغيله أيضًا ولكن لا يمكنني العثور على أي سجلات بخصوص مشكلة 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: <اسم مستخدم خدمة الاتصال Azure SMTP (لا يحتاج إلى أن يكون <اسم مورد خدمات الاتصال Azure>.<معرف تطبيق Entra>.<معرف مستأجر تطبيق Entra>
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: