电子邮件和推送通知
Antimatter 会发送电子邮件用于邀请、密码重置、验证和未读消息,并通过推送代理向移动应用发送推送通知。在配置之前,这两项功能均无法使用。
出站电子邮件(SMTP)
Antimatter 通过您提供的 SMTP 服务器发送电子邮件:可以是您组织的邮件服务器,也可以是事务性电子邮件服务。如果没有配置,用户将无法重置遗忘的密码,电子邮件邀请和验证邮件无法送达,且没有人会收到未读消息的电子邮件通知。
请在 系统控制台 › 环境 › SMTP 中设置,或使用以下变量:
| 设置项 | 键与变量 | 默认值 |
|---|---|---|
| SMTP 服务器 | EmailSettings.SMTPServer, AM_EMAILSETTINGS_SMTPSERVER | localhost |
| SMTP 服务器端口 | EmailSettings.SMTPPort, AM_EMAILSETTINGS_SMTPPORT | 10025 |
| 开启 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.FeedbackEmail | test@example.com:请更改此值 |
| 通知 Reply-To 地址 | EmailSettings.ReplyToAddress | test@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 服务和推送代理软件包。
将 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 生效的最大成员数量。在更大的频道中,这些提及和正在输入指示器将被禁用。