ایمیل و اعلان‌های push

Antimatter برای دعوت‌نامه‌ها، بازنشانی گذرواژه، تأیید و پیام‌های از دست رفته ایمیل می‌فرستد و از طریق push proxy اعلان‌های push را به اپلیکیشن موبایل ارسال می‌کند. تا زمانی که پیکربندی نکنید، هیچ‌کدام کار نمی‌کنند.

ایمیل خروجی (SMTP)

Antimatter از طریق یک سرور SMTP که شما فراهم می‌کنید ایمیل می‌فرستد: سرور ایمیل سازمان شما یا یک سرویس ایمیل تراکنشی. بدون آن، افراد نمی‌توانند گذرواژه فراموش‌شده را بازنشانی کنند، ایمیل‌های دعوت‌نامه و تأیید به مقصد نمی‌رسند و هیچ‌کس اعلان ایمیلی برای پیام‌های از دست رفته دریافت نمی‌کند.

در کنسول سیستم › محیط › SMTP تنظیم کنید، یا با متغیرها:

تنظیمکلید و متغیرمقدار پیش‌فرض
سرور SMTPEmailSettings.SMTPServer, AM_EMAILSETTINGS_SMTPSERVERlocalhost
پورت سرور SMTPEmailSettings.SMTPPort, AM_EMAILSETTINGS_SMTPPORT10025
فعال کردن احراز هویت SMTPEmailSettings.EnableSMTPAuth, AM_EMAILSETTINGS_ENABLESMTPAUTHخاموش بدون امنیت اتصال، روشن با آن
نام کاربری سرور SMTPEmailSettings.SMTPUsername, AM_EMAILSETTINGS_SMTPUSERNAMEخالی
رمز عبور سرور SMTPEmailSettings.SMTPPassword, AM_EMAILSETTINGS_SMTPPASSWORDخالی
امنیت اتصالEmailSettings.ConnectionSecurity, AM_EMAILSETTINGS_CONNECTIONSECURITYهیچ‌کدام (خالی)؛ یا TLS یا STARTTLS
رد شدن از تأیید گواهی سرورEmailSettings.SkipServerCertificateVerificationخاموش. در محیط تولید خاموش بگذارید.

بر اساس دستورالعمل ارائه‌دهنده، از STARTTLS روی پورت 587 یا TLS روی پورت 465 استفاده کنید. سپس روی همان صفحه تست اتصال را بزنید: Antimatter یک ایمیل آزمایشی به آدرس خودتان ارسال می‌کند.

یک پیکربندی رایج با Docker Compose، در compose.override.yaml کنار compose.yaml:

services:
  antimatter:
    environment:
      AM_EMAILSETTINGS_SMTPSERVER: smtp.example.com
      AM_EMAILSETTINGS_SMTPPORT: "587"
      AM_EMAILSETTINGS_CONNECTIONSECURITY: STARTTLS
      AM_EMAILSETTINGS_ENABLESMTPAUTH: "true"
      AM_EMAILSETTINGS_SMTPUSERNAME: chat@example.com
      AM_EMAILSETTINGS_SMTPPASSWORD: ${SMTP_PASSWORD}
      AM_EMAILSETTINGS_FEEDBACKNAME: Antimatter
      AM_EMAILSETTINGS_FEEDBACKEMAIL: chat@example.com
      AM_EMAILSETTINGS_REPLYTOADDRESS: chat@example.com

SMTP_PASSWORD را در .env قرار دهید. فایل compose سایت سرور را روی شبکه پیش‌فرض قرار می‌دهد که به اینترنت دسترسی دارد، بنابراین می‌تواند به یک سرور SMTP خارجی دسترسی پیدا کند.

تنظیمات ایمیل فرستنده و اعلان‌ها

در کنسول سیستم › پیکربندی سایت › اعلان‌ها:

تنظیمکلیدمقدار پیش‌فرض
فعال کردن اعلان‌های ایمیلEmailSettings.SendEmailNotificationsروشن
نام نمایشی اعلانEmailSettings.FeedbackNameخالی
اطلاعیه از آدرسEmailSettings.FeedbackEmailtest@example.com: تغییر دهید
آدرس پاسخ به اطلاعیهEmailSettings.ReplyToAddresstest@example.com: تغییر دهید
آدرس ایمیل پشتیبانیSupportSettings.SupportEmailخالی
آدرس پستی پاورقی اطلاعیهEmailSettings.FeedbackOrganizationخالی
محتوای اعلان ایمیلEmailSettings.EmailNotificationContentsTypeارسال محتوای کامل پیام (full)، یا یک توضیح عمومی فقط با نام فرستنده (generic)
فعال کردن دسته‌بندی ایمیلEmailSettings.EnableEmailBatchingخاموش. روشن، افراد می‌توانند انتخاب کنند پیام‌های از دست رفته را هر 15 دقیقه یا هر ساعت در یک ایمیل گروه‌بندی‌شده دریافت کنند، به جای یک ایمیل برای هر کدام.
استفاده از نام کانال در اعلان‌های ایمیلیEmailSettings.UseChannelInEmailNotificationsخاموش
بنر حالت پیش نمایش را فعال کنیدEmailSettings.EnablePreviewModeBannerروشن: در حالی که اعلان‌های ایمیل خاموش هستند، یک بنر به مدیران اطلاع می‌دهد که ایمیل پیکربندی نشده است

نشانی «From» باید یکی از نشانی‌هایی باشد که سرور SMTP شما مجاز به ارسال به‌عنوان آن است؛ SPF و DKIM را برای دامنه‌اش پیکربندی کنید، وگرنه ایمیل‌ها ممکن است در پوشه‌های اسپم قرار بگیرند.

تنظیمات ورود مرتبط با ایمیل (مانند اینکه آیا حساب‌های جدید باید نشانی خود را تأیید کنند یا دعوت‌نامه‌ها می‌توانند از طریق ایمیل ارسال شوند) در بخش ورود و حساب‌ها قرار دارد.

اعلان‌های push به اپلیکیشن موبایل

نحوه عملکرد push

Antimatter هرگز مستقیماً با Apple یا Google ارتباط برقرار نمی‌کند. برای هر اعلان، یک push proxy را فراخوانی می‌کند که اعتبارنامه‌های اپلیکیشن موبایل را در اختیار دارد و اعلان را برای آیفون‌ها به Apple (APNs) و برای گوشی‌های اندروید به Google (Firebase Cloud Messaging) ارسال می‌کند. Apple و Google فقط زمانی اعلانی را تحویل می‌دهند که با اعتبارنامه‌های همان اپلیکیشن ارسال شده باشد. بنابراین یک push proxy فقط با یک نسخه (build) از اپلیکیشن موبایل کار می‌کند: همان نسخه‌ای که اعتبارنامه‌های آن را در اختیار دارد.

  • Antimatter یک push proxy عمومی اجرا نمی‌کند. شما خودتان باید push proxy Antimatter را با اعتبارنامه‌های نسخه اپلیکیشن موبایلی که کاربران شما نصب می‌کنند، اجرا کنید.
  • Antimatter هرگز اعلان‌هایی را به سرویس‌های push Mattermost (چه آزمایشی و چه میزبانی‌شده) ارسال نمی‌کند؛ زیرا این سرویس‌ها فقط برای اپلیکیشن‌های موبایل خود Mattermost اعلان تحویل می‌دهند. اگر سرور روی یکی از نشانی‌های آن‌ها (مانند https://push-test.mattermost.com که در پیکربندی‌های قدیمی‌تر Mattermost استفاده می‌شود) تنظیم شده باشد، چیزی ارسال نمی‌کند و هنگام راه‌اندازی یک هشدار در لاگ ثبت می‌شود.

یک سرور جدید، سرور اعلان push ندارد، بنابراین تا زمانی که نشانی push proxy خود را تنظیم نکنید، هیچ اعلان push ارسال نمی‌شود. تا آن زمان، اپلیکیشن موبایل کار می‌کند اما اعلانی دریافت نمی‌کند.

اجرای push proxy

push proxy در مخزن push-proxy قرار دارد. فایل README آن توضیح می‌دهد که چگونه دو اعتبارنامه را به دست آورید که از حساب‌هایی که نسخه اپلیکیشن موبایل شما را منتشر می‌کنند، می‌آیند:

  • Android: یک فایل حساب سرویس (service account) از پروژه Firebase که نسخه اندرویدی شما از آن استفاده می‌کند.
  • iOS: یک کلید احراز هویت APNs (AuthKey_<KEY ID>.p8) از حساب توسعه‌دهنده Apple که نسخه iOS شما را منتشر می‌کند، همراه با شناسه کلید (key ID) و شناسه تیم (team ID).

آن‌ها را در کنار compose.yaml و فایل پیکربندی proxy قرار دهید:

push-proxy/
  config/antimatter-push-proxy.json
  certs/AuthKey_ABCDE12345.p8
  certs/firebase-service-account.json

push-proxy/config/antimatter-push-proxy.json، همراه با شناسه بسته (bundle identifier)، شناسه کلید و شناسه تیم شما:

{
    "ListenAddress": ":8066",
    "ThrottlePerSec": 300,
    "ThrottleMemoryStoreSize": 50000,
    "ThrottleVaryByHeader": "X-Forwarded-For",
    "EnableMetrics": false,
    "SendTimeoutSec": 30,
    "RetryTimeoutSec": 8,
    "ApplePushSettings": [
        {
            "Type": "apple_rn",
            "ApplePushUseDevelopment": false,
            "ApplePushTopic": "chat.antimatter.app",
            "AppleAuthKeyFile": "./certs/AuthKey_ABCDE12345.p8",
            "AppleAuthKeyID": "ABCDE12345",
            "AppleTeamID": "FGHIJ67890"
        }
    ],
    "AndroidPushSettings": [
        {
            "Type": "android_rn",
            "ServiceFileLocation": "./certs/firebase-service-account.json"
        }
    ],
    "EnableConsoleLog": true,
    "EnableFileLog": false,
    "LogFormat": "plain",
    "LogLevel": "info"
}

ApplePushTopic شناسه بسته (bundle identifier) iOS نسخه شماست. ApplePushUseDevelopment فقط برای نسخه‌هایی که از Xcode نصب شده‌اند true است. مکالمه‌ها (calls) روی آیفون‌ها از طریق push‌های VoIP فعال می‌شوند که از همان کلید استفاده می‌کنند و در اینجا به چیزی دیگر نیاز ندارند.

این سایت افزوده‌ای آماده به فایل compose دارد: compose.push.example.yaml. این فایل تصویر منتشرشده ghcr.io/antimatterchat/push-proxy:latest را اجرا می‌کند.

curl -fsSLO https://antimatter.chat/compose.push.example.yaml
docker compose -f compose.yaml -f compose.push.example.yaml --profile push up -d
docker compose -f compose.yaml -f compose.push.example.yaml logs push-proxy

در هنگام راه‌اندازی، لاگ پروکسی نام هر هدف push را که پیکربندی کرده است ذکر می‌کند و برای هر هدفی که نمی‌تواند اعتبارنامه‌های آن را بارگذاری کند، خطایی ثبت می‌کند. پروکسی هیچ پورتی را به بیرون منتشر نمی‌کند؛ تنها Antimatter می‌تواند از طریق شبکه compose به آن دسترسی پیدا کند.

در صورت عدم استفاده از Docker، به جای آن بسته .deb یا .rpm پروکسی پوش را نصب کنید: به بسته‌های سرویس GIF و پروکسی پوش مراجعه کنید.

پروکسی push بررسی نمی‌کند که چه کسی آن را فراخوانده است. آن را به اینترنت متصل نکنید. اگر روی میزبان دیگری اجرا می‌شود، آن را پشت HTTPS قرار دهید و دسترسی به آن را محدود کنید: اعلان‌ها ممکن است متن پیام را در خود داشته باشند.

Antimatter را به پروکسی متصل کنید

در کنسول سیستم › محیط › Push Notification Server، گزینه فعال کردن Push Notifications را روی ارسال اعلان‌های فوری از طریق پروکسی اعلان اختصاصی شما و Push Notification Server را روی http://push-proxy:8066 (یا آدرس HTTPS پروکسی اگر در جای دیگری اجرا می‌شود) تنظیم کنید. صفحه با این گزینه و بدون آدرس ذخیره نمی‌شود. برای توقف ارسال اعلان‌های فوری، گزینه اعلان فشار ارسال نکنید را انتخاب کنید. یا با متغیرها روی سرویس antimatter:

AM_EMAILSETTINGS_SENDPUSHNOTIFICATIONS: "true"
AM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER: http://push-proxy:8066

برای بررسی: با اپلیکیشن موبایل وارد شوید، آن را به پس‌زمینه ببرید و حساب دیگری شما را Mention کند. اگر چیزی دریافت نشد، در لاگ Antimatter و لاگ پروکسی به دنبال push بگردید: آن‌ها مشخص می‌کنند که آیا نوع دستگاه ناشناخته است، کلیدی رد شده است، یا دستگاه به بیلد دیگری از اپلیکیشن تعلق دارد.

محتوای اعلان‌ها

کنسول سیستم › پیکربندی سایت › اعلان‌ها › محتویات Push Notification (EmailSettings.PushNotificationContents):

گزینهمقدار
توصیف عمومی با نام فرستندهgeneric_no_channel
توصیف عمومی با نام فرستنده و کانالgeneric
محتوای کامل پیام ارسال‌شده در payload اعلان (پیش‌فرض)full
محتوای کامل پیام که هنگام دریافت از سرور بازیابی می‌شودid_loaded

با id_loaded، اعلان از طریق پروکسی، Apple و Google فقط یک id را حمل می‌کند و اپلیکیشن پیام را از سرور شما بازیابی می‌کند: متن پیام هرگز از طریق سرویس‌های آن‌ها عبور نمی‌کند. این بهترین انتخاب زمانی است که پیام‌ها محرمانه باشند.

حداکثر اعلان ها در هر کانال، روی صفحه Push Notification Server، (TeamSettings.MaxNotificationsPerChannel، به‌طور پیش‌فرض 1000) بیشترین تعداد اعضایی است که یک کانال می‌تواند داشته باشد تا @here، @all و @channel کار کنند. در کانال‌های بزرگ‌تر، این اشاره‌ها و نشانگرهای تایپ غیرفعال می‌شوند.