尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Seerr 邮件通知配置完全指南:SMTP、TLS 加密与 OpenPGP 签名详解

Seerr 邮件通知配置完全指南:SMTP、TLS 加密与 OpenPGP 签名详解 Seerr 邮件通知配置完全指南SMTP、TLS 加密与 OpenPGP 签名详解【免费下载链接】seerrOpen-source media request and discovery manager for Jellyfin, Plex, and Emby.项目地址: https://gitcode.com/GitHub_Trending/je/seerr本指南以 Seerr 的 Email 通知配置文档docs/using-seerr/notifications/email.md为主线系统讲解在Settings → Notifications → Email中配置 SMTP 发信所需的全部字段并深入源码剖析底层实现从 Nodemailer 传输层的加密选项映射、PGP 加密封装到通知投递流程与校验规则。读完本文你将能独立完成 Seerr 邮件通知的完整接入、排障与高级加密配置。邮件通知在 Seerr 中的角色Seerr 作为面向 Jellyfin、Plex 与 Emby 的媒体请求与发现管理器邮件通知是它最重要的“主动触达”渠道之一。当媒体请求状态发生变化待批准、已批准、已上架、被拒绝、失败、用户提交问题Issue或问题被回复/解决时Seerr 都会通过 EmailAgent 向相关用户与管理员发送邮件。相关实现位于 server/lib/notifications/agents/email.ts。邮件通知的分发由 server/lib/notifications/index.ts 中的NotificationManager统一调度它遍历所有已注册的 Agent调用shouldSend()判断是否启用再调用send()实际投递。对 EmailAgent 而言shouldSend()的判定条件非常明确email.tsenabled为 trueemailFrom发件地址非空smtpHost非空smtpPort有效。也就是说只有这四个条件同时满足邮件 Agent 才会被激活。进入邮件通知设置页在 Seerr 的Settings → Notifications → Email页面即可完成全部配置。该页面由 src/components/Settings/Notifications/NotificationsEmail.tsx 实现表单通过/api/v1/settings/notifications/email接口读写配置接口定义在 server/routes/settings/notifications.ts提供 GET 读取、POST 保存、POST/email/test发送测试邮件三个端点。必填与基础字段Require User Email要求用户填写邮箱开启后所有用户必须在个人设置中提供有效的邮箱地址以确保每个人都能收到邮件通知。该选项对应配置项userEmailRequired默认关闭。从源码结构看该配置被持久化在NotificationAgentEmail.options.userEmailRequired中server/lib/settings/index.ts。由于邮件通知按收件人逐一投递用户邮箱的完整性与合法性直接决定通知能否送达——这也是该选项存在的意义。Sender Name发件人名称可选为发件人配置一个友好名称如 “Seerr”。默认值为Seerr。该值在 server/lib/email/index.ts 中被拼装进 Nodemailer 的message.frommessage: { from: { name: settings.options.senderName, address: settings.options.emailFrom, }, },最终收件方看到的是形如Seerr notifyexample.com的发件人。Sender Address发件地址设置希望显示在邮件 “from” 字段中的邮箱地址对应配置项emailFrom。注意部分邮件服务商要求该地址必须是您拥有的真实地址例如 Gmail 要求使用您的实际邮箱否则会被拒收或标记为异常。前端表单对该字段做了邮箱格式校验validator.isEmail且不强制要求顶级域名见 NotificationsEmail.tsx。SMTP 服务器配置SMTP HostSMTP 主机填写 SMTP 服务器的主机名或 IP 地址对应smtpHost。这里有一个值得注意的实现细节在 server/lib/email/index.ts 中Seerr 自定义了getSocket回调通过net.connect建立底层 TCP 连接并设置 10 秒超时只有当net.isIP(settings.options.smtpHost)返回 false即填的是主机名而非 IP时才会使用该自定义连接逻辑用于显式控制连接超时与错误回调。填 IP 地址时则交给 Nodemailer 默认处理。SMTP PortSMTP 端口填写 SMTP 主机支持的端口号465和587最常见默认值为587server/lib/settings/index.ts。Nodemailer 将把该端口用于 TCP 连接。Encryption Method加密方式这是连接安全的核心设置界面提供四个选项NotificationsEmail.tsx它们与底层 Nodemailer 的三个 TLS 开关secure、ignoreTls、requireTls一一映射界面选项映射到的传输层配置说明NoneignoreTls: true完全不使用 TLS明文连接仅建议内网测试环境Use STARTTLS if available默认三个开关全为 false有机会则升级为 STARTTLS端口 587 的推荐选择Always use STARTTLSrequireTls: true强制要求 STARTTLS服务器不支持则连接失败Use Implicit TLSsecure: true连接即建立 TLS端口 465 的推荐选择映射关系见前端提交逻辑NotificationsEmail.tsxsecure: values.encryption implicit, ignoreTls: values.encryption none, requireTls: values.encryption opportunistic,这些选项最终原样传入 Nodemailer 的传输配置server/lib/email/index.tsconst transport nodemailer.createTransport({ name: applicationUrl ? new URL(applicationUrl).hostname : undefined, host: settings.options.smtpHost, port: settings.options.smtpPort, secure: settings.options.secure, ignoreTLS: settings.options.ignoreTls, requireTLS: settings.options.requireTls, ... });提示按惯例465 端口配合 “Use Implicit TLS”587 端口配合 “Use STARTTLS if available”。具体请以邮件服务商的官方文档为准。Allow Self-Signed Certificates允许自签名证书对应配置项allowSelfSigned。开启后传输层会设置rejectUnauthorized: false允许连接使用自签名证书的 SMTP 服务器常见于自建邮件服务。默认关闭生产环境请谨慎开启tls: settings.options.allowSelfSigned ? { rejectUnauthorized: false } : undefined,SMTP Username PasswordSMTP 用户名与密码分别对应authUser与authPass用于向 SMTP 服务器认证。只有当两者都非空时Nodemailer 才会附加auth配置server/lib/email/index.tsauth: settings.options.authUser settings.options.authPass ? { user: settings.options.authUser, pass: settings.options.authPass } : undefined,常见坑如果您的邮箱账号开启了双重认证2FA通常需要去服务商处生成“应用专用密码”App Password填入此处而不是直接使用账号密码。Application URL 对连接的影响原文档特别指出如果已在Settings → General中配置 Application URLSeerr 会显式将来源服务器主机名传给 SMTP。源码印证了这一行为server/lib/email/index.tsconst { applicationUrl } getSettings().main; const transport nodemailer.createTransport({ name: applicationUrl ? new URL(applicationUrl).hostname : undefined, ... });即从 Application URL 中解析出 hostname作为 Nodemailer 传输层的name字段在 EHLO 阶段作为服务器标识。同时 Application URL 还决定了邮件正文中 “查看详情” 跳转链接actionUrl与实例 Logo 地址的拼接见 email.ts因此建议务必正确配置。高级配置OpenPGP 加密与签名可选配置项说明Seerr 支持使用 OpenPGP 对邮件进行加密与签名PGP Private KeypgpPrivateKey服务端的私钥用于对邮件签名PGP PasswordpgpPassword解锁该私钥的密码短语收件人侧每个用户需在个人设置中配置各自的PGP 公钥用户设置中的pgpKeySeerr 才会使用该公钥加密发给他的邮件。没有公钥的用户将收到未加密的邮件仅当私钥与密码同时存在时才会执行签名详见下方源码分析。私钥格式要求配置时务必保持密钥内容完整、原样粘贴私钥以-----BEGIN PGP PRIVATE KEY BLOCK-----开头以-----END PGP PRIVATE KEY BLOCK-----结尾。前端校验正则NotificationsEmail.tsx/-----BEGIN PGP PRIVATE KEY BLOCK-----.-----END PGP PRIVATE KEY BLOCK-----/s并且表单做了双向联动校验填写pgpPassword时pgpPrivateKey必填反之亦然NotificationsEmail.tsx。底层实现邮件如何被加密当用户配置了 PGP 公钥时server/lib/email/index.ts 会通过transport.use(stream, openpgpEncrypt({...}))在 Nodemailer 的消息流上挂载一个 PGP 转换器if (pgpKey) { transport.use( stream, openpgpEncrypt({ signingKey: settings.options.pgpPrivateKey, password: settings.options.pgpPassword, encryptionKeys: [pgpKey], }) ); }加密逻辑实现在 server/lib/email/openpgpEncrypt.ts核心要点按收件人公钥逐封处理PreparedEmail构造时接收当前收件人的pgpKey作为encryptionKeys若无有效公钥消息原样透传openpgpEncrypt.ts。可选签名仅当signingKey与password同时存在时才用openpgp.decryptKey解密私钥再作为signingKeys参与加密openpgpEncrypt.ts。构造 multipart/encrypted 结构将原始邮件头与内容头分离用随机生成的 boundarynm_ 14 字节随机数组装成符合 OpenPGP MIMERFC 3156规范的两段式消息第一段声明application/pgp-encryptedVersion: 1第二段携带encrypted.asc密文openpgpEncrypt.ts。失败降级若加密过程抛错会记录错误日志并退回发送未加密的原文保证通知不丢失openpgpEncrypt.ts。通知类型与邮件模板Seerr 邮件通知覆盖以下事件类型枚举定义见 server/lib/notifications/index.ts媒体请求MEDIA_PENDING待批准、MEDIA_APPROVED已批准、MEDIA_AVAILABLE已上架、MEDIA_DECLINED被拒绝、MEDIA_FAILED添加失败、MEDIA_AUTO_REQUESTED / MEDIA_AUTO_APPROVED自动请求/自动批准问题IssueISSUE_CREATED、ISSUE_COMMENT、ISSUE_RESOLVED、ISSUE_REOPENEDTEST_NOTIFICATION测试邮件。对应模板位于 server/templates/email按事件类型分为media-request/、media-issue/、test-email/等每个目录包含html.pug与subject.pug主题行。EmailAgent.buildMessageemail.ts会按收件人 locale 生成对应语言的正文并注入applicationUrl、applicationTitle、Logo、海报图若开启 Embed Poster等变量。测试与验证配置完成后建议立即点击表单底部的Test按钮发送测试邮件NotificationsEmail.tsx。该按钮会以当前表单值而非已保存的配置调用POST /api/v1/settings/notifications/email/test后端通过new EmailAgent(req.body)临时构建 Agent 并触发TEST_NOTIFICATIONserver/routes/settings/notifications.ts测试成功返回 204。测试通过后点击Save保存配置前端会提示 “Email notification settings saved successfully!”。若发送失败可在服务端日志中检索Error sending email notification或Invalid email address provided for user等关键字email.ts定位原因。常见排障建议发不出去优先核对smtpHost、smtpPort与加密方式是否匹配465 → Implicit TLS587 → STARTTLS确认emailFrom是否被服务商允许。认证失败检查authUser/authPass启用 2FA 的账号请改用应用专用密码。自签名证书报错内网/自建 SMTP 可临时开启 “Allow Self-Signed Certificates”生产环境建议更换受信证书。PGP 配置不生效确认私钥粘贴完整含 BEGIN/END 行确认收件用户在个人设置中配置了 PGP 公钥并检查日志中是否有 OpenPGP 加密失败降级提示。收件人邮箱无效开启 “Require User Email” 后仍有个别用户未填邮箱时服务端会记录Invalid email address provided for user告警并跳过该用户。总结Seerr 的邮件通知体系虽然界面简洁但背后是完整的 Nodemailer 传输层 可插拔的 OpenPGP 加密管线NotificationAgentEmail配置结构server/lib/settings/index.ts承载全部选项PreparedEmailserver/lib/email/index.ts负责传输与加密装配EmailAgentserver/lib/notifications/agents/email.ts负责事件分发与投递。按照本文步骤配置 SMTP 与加密选项并善用 Test 按钮验证即可让每一位用户及时收到媒体请求与问题处理的最新动态。【免费下载链接】seerrOpen-source media request and discovery manager for Jellyfin, Plex, and Emby.项目地址: https://gitcode.com/GitHub_Trending/je/seerr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表