93 lines
2.9 KiB
Go
93 lines
2.9 KiB
Go
// manager 展示多通道管理器的完整用法。
|
||||
|
|
//
|
|||
|
|
// 功能:
|
|||
|
|
// 1. 注册多个不同类型的通道(smtp/aliyun/aws),统一路由
|
|||
|
|
// 2. 同一类型注册多份配置(主备 SMTP 切换)
|
|||
|
|
// 3. 发送时按实例名指定通道,或发送时临时指定配置
|
|||
|
|
// 4. 遍历当前注册的通道实例信息
|
|||
|
|
//
|
|||
|
|
// 怎么运行:
|
|||
|
|
// 1. 替换下方各通道的凭据为真实值
|
|||
|
|
// 2. 在项目根目录执行:go run ./examples/manager
|
|||
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"context"
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
"code.yun.ink/pkg/mailx"
|
|||
|
|
"code.yun.ink/pkg/mailx/aliyun"
|
|||
|
|
"code.yun.ink/pkg/mailx/aws"
|
|||
|
|
"code.yun.ink/pkg/mailx/smtp"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
ctx := context.Background()
|
|||
|
|
|
|||
|
|
mgr := mailx.NewManager()
|
|||
|
|
|
|||
|
|
// ===== 注册多个不同类型的通道 =====
|
|||
|
|
// 用 Register 注册时,实例名 = 通道类型名(smtp / aliyun / aws / mailgun)
|
|||
|
|
_ = mgr.Register(smtp.New(smtp.Config{
|
|||
|
|
Host: "smtp.qq.com", Port: 587, User: "a@qq.com", Password: "code",
|
|||
|
|
}))
|
|||
|
|
_ = mgr.Register(aliyun.New(aliyun.Config{
|
|||
|
|
AccessKeyID: "ak", AccessKeySecret: "sk", AccountName: "noreply@example.com",
|
|||
|
|
}))
|
|||
|
|
_ = mgr.Register(aws.New(aws.Config{
|
|||
|
|
AccessKeyID: "ak", AccessKeySecret: "sk", Region: "ap-northeast-1",
|
|||
|
|
Sender: "noreply@example.com",
|
|||
|
|
}))
|
|||
|
|
|
|||
|
|
// ===== 同一类型注册多份配置(主备切换) =====
|
|||
|
|
// 用 RegisterNamed 指定实例名,可注册多个 smtp 实例
|
|||
|
|
_ = mgr.RegisterNamed("smtp-main", smtp.New(smtp.Config{
|
|||
|
|
Host: "smtp.qq.com", Port: 465, User: "a@qq.com", Password: "main-code",
|
|||
|
|
}))
|
|||
|
|
_ = mgr.RegisterNamed("smtp-backup", smtp.New(smtp.Config{
|
|||
|
|
Host: "smtp.163.com", Port: 465, User: "a@163.com", Password: "backup-code",
|
|||
|
|
}))
|
|||
|
|
|
|||
|
|
// ===== 设置默认通道(不设置则用第一个注册的) =====
|
|||
|
|
_ = mgr.SetDefault("aliyun")
|
|||
|
|
|
|||
|
|
// ===== 遍历当前注册的通道实例信息 =====
|
|||
|
|
fmt.Println("registered instances:")
|
|||
|
|
for _, info := range mgr.Senders() {
|
|||
|
|
fmt.Printf(" - %s (type: %s)\n", info.Name, info.Type)
|
|||
|
|
}
|
|||
|
|
fmt.Println("default:", mgr.Default())
|
|||
|
|
|
|||
|
|
msg := mailx.NewMessage().
|
|||
|
|
From("noreply@example.com").
|
|||
|
|
To("user@example.com").
|
|||
|
|
Subject("Notice").
|
|||
|
|
Text("hello").
|
|||
|
|
HTML("<h1>Hello</h1>").
|
|||
|
|
Build()
|
|||
|
|
|
|||
|
|
// ===== 用默认通道发送 =====
|
|||
|
|
if err := mgr.Send(ctx, msg); err != nil {
|
|||
|
|
fmt.Println("default send:", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ===== 按实例名指定通道发送 =====
|
|||
|
|
if err := mgr.SendWith(ctx, "aws", msg); err != nil {
|
|||
|
|
fmt.Println("aws send:", err)
|
|||
|
|
}
|
|||
|
|
if err := mgr.SendWith(ctx, "smtp-backup", msg); err != nil { // 主 SMTP 失败时可切备用
|
|||
|
|
fmt.Println("smtp-backup send:", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ===== 发送时临时指定配置,无需提前注册 =====
|
|||
|
|
if err := mgr.SendBy(ctx, smtp.New(smtp.Config{
|
|||
|
|
Host: "smtp.163.com", Port: 465, User: "b@163.com", Password: "code",
|
|||
|
|
}), msg); err != nil {
|
|||
|
|
fmt.Println("temp smtp send:", err)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// ===== 注销一个实例(可选) =====
|
|||
|
|
mgr.Unregister("smtp-main")
|
|||
|
|
fmt.Println("after unregister, instances:", mgr.Names())
|
|||
|
|
}
|