Skip to the content.

通知组件

提供 SMTP 邮件、阿里云模板短信、命名模板和本地持久化站内通知。引用 MS.Microservice.Notifications 项目或包即可使用,无需启动单独服务;源码与包接入方式。

功能 入口 用途
邮件 SmtpEmailSender.SendAsync 发送纯文本或 HTML 邮件,支持 To、Cc、Bcc
短信 AliyunSmsSender.SendAsync 通过阿里云发送单个号码的已审核模板短信
模板 NamedTokenTemplate.Render 将 或 替换为字典值
站内通知 LocalNotificationInbox 按用户发布、分页查询、统计未读数、标记已读

发送邮件

using MS.Microservice.Notifications.Email;
using MS.Microservice.Notifications.Templates;

var sender = new SmtpEmailSender(new SmtpEmailOptions
{
    Host = "smtp.example.com",
    UserName = configuredUserName,
    Password = configuredPassword
});
var body = NamedTokenTemplate.Render("你好,。", new Dictionary<string, string?>
{
    ["Name"] = "张三"
});
var accepted = await sender.SendAsync(new EmailMessage
{
    From = new("sender@example.com", "应用通知"),
    To = [new("recipient@example.com")],
    Subject = "处理完成",
    TextBody = body
}, cancellationToken);
参数 默认值 说明
Host 必填 SMTP 服务器
Port 587 SMTP 端口
TlsMode RequireStartTls 要求 STARTTLS;也可选择连接即 TLS
UserName / Password 不认证 使用时须成对提供,且必须启用 TLS
TimeoutMilliseconds 30000 客户端 I/O 等待超时
DisconnectTimeoutMilliseconds 2000 发送成功后的断开等待上限

EmailMessage 至少需要一个收件人及 TextBody、HtmlBody 中的一种正文。显示名单独传入 EmailAddress.DisplayName。当前接口不提供附件或 OAuth token 获取。

返回回执只表示 SMTP 服务器已接受,最终送达需邮件服务的投递反馈确认。组件不自动重试;超时或网络中断时,远端是否已接受可能无法确定,应先核对发送状态再决定重发。

模板缺少变量会报错,不执行模板中的代码。生成 HTML 文本时可设置 htmlEncodeValues: true;它只编码替换值,不能用于 JavaScript、CSS 或 URL 上下文,也不净化模板本身。

发送短信

using MS.Microservice.Notifications.Sms;

var sms = new AliyunSmsSender(new AliyunSmsOptions
{
    AccessKeyId = configuredAccessKeyId,
    AccessKeySecret = configuredAccessKeySecret
});
var accepted = await sms.SendAsync(new SmsMessage("13900000000", "已审核签名", "SMS_123456")
{
    TemplateParameters = new Dictionary<string, string> { ["code"] = "012345" },
    OutId = "job-123"
});
参数 默认值 说明
AccessKeyId / AccessKeySecret 必填 从宿主安全配置读取,不放入请求或源码
SecurityToken 无 使用临时 STS 凭证时提供;凭证过期后由宿主更新实例
TimeoutMilliseconds 30,000 SDK 一次 HTTP 请求的总等待预算,范围 1–100,000 ms
MaximumTemplateBytes 16 KiB 序列化后模板变量 JSON 的大小上限
PhoneNumber / SignName / TemplateCode 必填 单个号码、已审核签名、SMS_ 模板编码
TemplateParameters 无 最多 32 个字符串变量,变量名须与模板一致
OutId 无 业务关联标识,不提供发送去重保证

组件通过官方 SDK 调用中国站 SendSms HTTPS 接口。号码接受 6–20 个 ASCII 数字和可选前导 +;实际号码、国家/地区、签名、模板和发送频率仍由服务商校验。当前不提供批量发送、国际短信专用接口或投递状态回调。

返回 RequestId、BizId 和本地记录的接受时间,表示服务商接受请求,不表示手机收到短信。业务拒绝抛出 SmsRejectedException;其他 SDK 或网络异常直接传播。组件不自动重试,超时后发送状态可能不确定,应核对状态再决定重发。SDK 没有在途取消接口,因此此方法没有 CancellationToken 参数;请求超时不包括调用前的本地准备。

站内通知

using MS.Microservice.Notifications.Inbox;

var inbox = new LocalNotificationInbox(configuredPrivateDirectory);
var message = await inbox.PublishAsync(userId, "文件处理完成", "输出已生成。",
    "/tools/jobs/123", cancellationToken);
var page = await inbox.ListAsync(userId, take: 20, cancellationToken: cancellationToken);
await inbox.MarkReadAsync(userId, message.Id, cancellationToken);
参数或结果 默认值 说明
owner 必填 由宿主从已验证身份取得,所有操作都须检查所属用户权限
subject / body 必填 纯文本;标题最多 200、正文最多 16,000 个 UTF-16 单元
actionPath 无 应用内以 / 开始的路径,最多 2048 个 UTF-16 单元
skip / take 0 / 50 按创建时间和 Id 倒序分页,默认每页最多 100 条
MaximumNotificationBytes 64 KiB 单份通知或已读回执的编码大小上限
MaximumScanEntries / MaximumScanBytes 10000 / 32 MiB 一次查询的通知数和累计读取上限
TotalCount / UnreadCount — 本次查询扫描到的总数和未读数

通知和已读时间保存在指定目录,重启后可继续读取。目录需由应用可信管理,内容不加密;宿主负责历史保留期。查询超出扫描预算会报错,持续大量通知应使用数据库后端。并发插入时 offset 翻页可能重复或跳项,可按 Id 去重或重新加载。

实现说明