ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Topcoat 邮件系统:mail! 宏 3 步声明并发送 SMTP 邮件(完整指南)

Topcoat 邮件系统:mail! 宏 3 步声明并发送 SMTP 邮件(完整指南) Topcoat 邮件系统mail! 宏 3 步声明并发送 SMTP 邮件完整指南【免费下载链接】topcoatA batteries-included framework for building web apps项目地址: https://gitcode.com/GitHub_Trending/top/topcoatTopcoat 是一个开箱即用的 Rust Web 框架它的邮件系统topcoat的mail模块允许你用一行mail!宏声明一封邮件再通过可插拔的SmtpTransport走 SMTP 协议真实投递——HTML 正文、附件、纯文本降级全部自动处理无需手写任何 MIME 报文。为什么值得用传统做法里组装 MIME、编码附件、连接 SMTP 服务器、处理收发头每一步都是坑。Topcoat 把这些线务wire concerns全部封装进传输层你只声明这封邮件长什么样。一、邮件系统的三大核心能力在动手前先了解这套系统由 crates/topcoat-mail/ 提供的三大件组成组件作用源码位置mail!宏以字段: 值的形式声明一封邮件crates/topcoat-mail/macro/docs/mail.mdMailConfigsend()注册传输方式一行代码发出邮件crates/topcoat-mail/src/config.rsTransport传输层SMTP / 文件 / 内存三种投递渠道crates/topcoat-mail/src/transport.rs✨亮点传输方式在启动时注册一次之后所有 Handler 只管send(cx, mail)完全不关心底层是 SMTP 还是文件——开发环境切换传输方式业务代码零改动。二、快速上手3 步配置邮件功能第 1 步启用 Cargo 特性在Cargo.toml中开启mail特性真正连 SMTP 服务器时再加mail-smtp[dependencies] topcoat { version 0.6.2, features [mail, mail-smtp] }第 2 步启动时注册传输把选好的传输包进MailConfig注册给路由topcoat::start(Router::builder() .discover() .mail(MailConfig::builder() .transport(FileTransport::new(outbox)) // 生产环境换成 SmtpTransport .build()) .build()) .await第 3 步在 Handler 中声明并发送let mail mail! { from: (Topcoat, welcomeexample.com), to: adaexample.com, subject: Welcome, Ada!, html: { h1Welcome!/h1 pYour account is ready./p }, }?; send(cx, mail).await?;完成 ✅ 官方文档的完整示例见 crates/topcoat/docs/mail.md可运行的完整项目见 examples/mail/。三、mail! 宏能声明哪些字段mail!宏的字段顺序任意每个字段最多出现一次重复即编译错误。它展开后调用 MailBuilder 的同名方法并额外支持地址的多种写法from / to / cc / bcc / reply_to地址可以写字符串adaexample.com、(名字, 地址)元组(Ada, adaexample.com)或Mailbox值集合里随意混用✉️subject主题行支持format!()动态拼接html直接用view!风格的 HTML 写正文邮件客户端支持的 CSS 有限保持内联样式即可text纯文本正文。默认从 HTML 自动派生——因为缺少纯文本副本的邮件在垃圾邮件过滤器中评分更低attachments附件列表headers自定义头如List-Unsubscribein_reply_to / references回复线程头️date / message_id不声明则在发送时自动生成 宏展开为异步块字段值里可以直接用.await和?——先查数据库拿收件人列表再填进to字段完全自然。四、三种传输方式按场景切换Transport是核心抽象src/transport.rs官方内置三种实现1️⃣ SMTP生产环境— SmtpTransport 是真正的投递渠道连接池复用、异步发送let transport SmtpTransport::relay(smtp.example.com)? // 465 端口隐式 TLS .credentials(username, password) .build();也支持starttls587 端口、unencrypted仅限本地开发服务器如 Mailpit以及最推荐的环境变量写法SmtpTransport::from_url(smtps://user:passsmtp.example.com:465)?2️⃣ 文件开发环境—FileTransport把每封邮件写成.eml文件而不是真的发出去文件名带发送时间戳目录列表即发送顺序。任何邮件客户端都能直接打开查看无需邮件服务器也能完整开发。3️⃣ 内存测试环境—MemoryTransport把邮件捕获在内存里供断言克隆共享同一捕获。它和真实传输一样完整组装邮件所以发送会失败的邮件在测试里也会失败测试可信度拉满。想接邮件服务商的 HTTP API实现Transporttrait 即可Mail::formatted会直接渲染 RFC 5322 线格式报文。五、附件与内联图片cid: 引用技巧附件分两类src/attachment.rs可下载附件Attachment::new(invoice.pdf, application/pdf, data)—— 收件人看到的是文件内联附件Attachment::inline(logo, image/png, data)—— 在 HTML 中用cid:logo引用正文里直接显示图片html: { img srccid:logo altExample logo pThe invoice is attached./p }, attachments: [ Attachment::inline(logo, image/png, LOGO_PNG), Attachment::new(invoice.pdf, application/pdf, PDF), ],注意内联附件必须有 HTML 正文来引用它否则send会返回InlineWithoutHtml错误。六、Receipt 回执与线程化回复send成功后返回一个Receiptsrc/transport.rs携带该邮件的Message-ID。⚠️ 它只表示投递渠道接收了邮件不代表已进收件箱。保存这个Message-ID之后给同一用户发邮件时填入in_reply_to和references字段就能把后续邮件线程化挂到同一会话里——比如账户创建成功和 24 小时后的开始上手指南会显示在同一个对话线程中。七、发送失败会报什么错SendErrorsrc/transport.rs把常见错误分门别类排查时一目了然错误含义MissingFrom没有发件人地址MissingRecipientsTo/Cc/Bcc 全空MissingBodyHTML 和纯文本都没有InlineWithoutHtml有内联附件但没有 HTML 正文Assembly/Delivery报文组装失败 / SMTP 投递失败️新手建议先用FileTransport在本地把模板和附件调到满意再切到SmtpTransport上线——这正是这套可插拔传输设计的初衷。 更多资料完整字段参考见 crates/topcoat-mail/macro/docs/mail.md交互示例含内联图片和outbox页面见 examples/mail/src/main.rs。【免费下载链接】topcoatA batteries-included framework for building web apps项目地址: https://gitcode.com/GitHub_Trending/top/topcoat创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表