电子邮件和推送通知

Antimatter 会发送电子邮件用于邀请、密码重置、验证和未读消息,并通过推送代理向移动应用发送推送通知。在配置之前,这两项功能均无法使用。

出站电子邮件(SMTP)

Antimatter 通过您提供的 SMTP 服务器发送电子邮件:可以是您组织的邮件服务器,也可以是事务性电子邮件服务。如果没有配置,用户将无法重置遗忘的密码,电子邮件邀请和验证邮件无法送达,且没有人会收到未读消息的电子邮件通知。

请在 系统控制台 › 环境 › SMTP 中设置,或使用以下变量:

设置项键与变量默认值
SMTP 服务器EmailSettings.SMTPServer, AM_EMAILSETTINGS_SMTPSERVERlocalhost
SMTP 服务器端口EmailSettings.SMTPPort, AM_EMAILSETTINGS_SMTPPORT10025
开启 SMTP 验证EmailSettings.EnableSMTPAuth, AM_EMAILSETTINGS_ENABLESMTPAUTH无连接安全时关闭,有连接安全时开启
SMTP 服务器用户名EmailSettings.SMTPUsername, AM_EMAILSETTINGS_SMTPUSERNAME空
SMTP 服务器密码EmailSettings.SMTPPassword, AM_EMAILSETTINGS_SMTPPASSWORD空
连接安全EmailSettings.ConnectionSecurity, AM_EMAILSETTINGS_CONNECTIONSECURITY无(留空);或 TLS 或 STARTTLS
跳过服务器证书验证EmailSettings.SkipServerCertificateVerification关闭。在生产环境中请保持关闭。

根据提供商的建议,在端口 587 上使用 STARTTLS 或在端口 465 上使用 TLS。然后单击同一页面上的 测试连接:Antimatter 会向您的地址发送一封测试邮件。

使用 Docker Compose 的典型设置,位于 compose.yaml 旁边的 compose.override.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:请更改此值
通知 Reply-To 地址EmailSettings.ReplyToAddresstest@example.com:请更改此值
客户支持邮件地址SupportSettings.SupportEmail空
通知页脚邮件地址EmailSettings.FeedbackOrganization空
电子邮件通知内容EmailSettings.EmailNotificationContentsType发送完整消息内容(full),或仅包含发件人名称的通用描述(generic)
开启邮件批量发送EmailSettings.EnableEmailBatching关闭。开启后,用户可以选择每 15 分钟或每小时将未读消息合并为一封电子邮件,而不是每封消息单独发送一封电子邮件。
在邮件通知中使用频道名称EmailSettings.UseChannelInEmailNotifications关闭
开启预览模式横幅EmailSettings.EnablePreviewModeBanner开启:在电子邮件通知关闭期间,横幅会提示管理员电子邮件未配置

发件人地址必须是您的 SMTP 服务器被允许使用的地址;请为其域名配置 SPF 和 DKIM,否则邮件可能会被归入垃圾邮件文件夹。

与电子邮件相关的登录设置(例如新账户是否必须验证地址、是否可以通过电子邮件发送邀请)位于 登录和账户 中。

向移动应用发送推送通知

推送通知的工作原理

Antimatter 从不直接与 Apple 或 Google 通信。对于每条通知,它会调用一个 推送代理,该代理持有移动应用的凭据,并将通知转发给 Apple(APNs)以用于 iPhone,或转发给 Google(Firebase Cloud Messaging)以用于 Android 手机。Apple 和 Google 仅在通知使用其对应应用的凭据发送时才会进行投递。因此,一个推送代理只能配合一个版本的移动应用使用:即其持有凭据的那个版本。

  • Antimatter 不提供公共推送代理。您需要自行运行 Antimatter 推送代理,并使用用户所安装的移动应用版本的凭据。
  • Antimatter 从不向 Mattermost 的推送服务(无论是测试环境还是托管环境)发送通知:这些服务仅用于向 Mattermost 自家的移动应用投递通知。如果服务器被设置为其中一个地址(例如 https://push-test.mattermost.com,这是旧版 Mattermost 配置中使用的地址),它将不会发送任何内容,并在启动时记录一条警告。

新服务器没有推送通知服务器,因此在您设置推送代理的地址之前,它不会发送任何推送通知。在此期间,移动应用可以正常工作,但不会收到通知。

运行推送代理

推送代理位于 push-proxy 仓库中。其 README 文件解释了如何获取两个凭据,这些凭据来自发布您的移动应用版本的账户:

  • 安卓:您的安卓构建所使用的 Firebase 项目的服务账号文件。
  • iOS:发布您的 iOS 版本的 Apple 开发者账户的 APNs 身份验证密钥(AuthKey_<KEY ID>.p8),包含其密钥 ID 和团队 ID。

将它们与代理的配置文件一起放在 compose.yaml 旁边:

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

push-proxy/config/antimatter-push-proxy.json,包含您的捆绑包标识符、密钥 ID 和团队 ID:

{
    "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 是您版本的 iOS 捆绑包标识符。ApplePushUseDevelopment 仅在从 Xcode 安装的版本中设置为 true。通话通过 VoIP 推送在 iPhone 上响起,使用相同的密钥,此处无需额外配置。

该网站提供了一个现成的 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

启动时,代理的日志会列出它设置的每个推送目标,并为任何无法加载凭据的目标记录错误。代理不发布任何端口:只有 Antimatter 能通过 compose 网络访问它。

如果不使用 Docker,请改为安装推送代理的 .deb 或 .rpm 软件包:参见 GIF 服务和推送代理软件包。

推送代理不检查调用者身份。请勿将其暴露在互联网上。如果它在另一台主机上运行,请将其置于 HTTPS 之后并限制可访问者:通知可能包含消息文本。

将 Antimatter 指向代理

在 系统控制台 › 环境 › 推送通知服务器 中,将 启动发送推送通知 设置为 通过您自己的推送代理发送推送通知,并将 推送通知服务器 设置为 http://push-proxy:8066(如果代理在其他地方运行,则使用其 HTTPS 地址)。如果选择此选项但未填写地址,则无法保存页面。若要停止发送推送通知,请选择 不发送推送通知。或者,在 antimatter 服务上使用变量:

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

检查方法:使用移动应用登录,将其置于后台,然后让另一个账号提及您。如果没有收到通知,请在 Antimatter 的日志和代理的日志中查找 push:它们会说明是设备类型未知、密钥被拒绝,还是设备属于另一个应用构建版本。

通知包含的内容

系统控制台 › 站点配置 › 通知 › 推送通知内容(EmailSettings.PushNotificationContents):

选项值
仅包含发送者名称的通用描述generic_no_channel
包含发送者和频道名称的通用描述generic
在通知负载中发送完整消息内容(默认)full
接收时从服务器获取完整消息内容id_loaded

使用 id_loaded 时,通过代理发送的通知、Apple 和 Google 仅携带一个 id,应用会从您的服务器获取消息:消息文本永远不会通过他们的服务。当消息保密时,这是最佳选择。

在推送通知服务器页面上的 大频道通知阈值(TeamSettings.MaxNotificationsPerChannel,默认为 1000)是频道中允许 @here、@all 和 @channel 生效的最大成员数量。在更大的频道中,这些提及和正在输入指示器将被禁用。