5 个版本
0.1.0-alpha.8 | 2024年3月19日 |
---|---|
0.1.0-alpha.7 | 2024年3月5日 |
0.1.0-alpha.6 | 2024年2月27日 |
0.1.0-alpha.4 | 2024年1月30日 |
#50 in 电子邮件
472 每月下载次数
34KB
741 行
通过将电子邮件视为代码来提高发货速度 🚀
网站 • 获取您的 API 密钥 • Twitter
Templateless 允许您快速轻松地生成和发送事务性电子邮件,以便您专注于构建您的产品。
它非常适合 SaaS、Web 应用程序、移动应用程序、脚本和您需要以编程方式发送电子邮件的任何地方。
✨ 特点
- 👋 设计上反对拖放 — 电子邮件是您代码的一部分
- ✅ 组件作为代码 — 函数调用变为电子邮件 HTML 组件
- 💻 任何语言的 SDK — 使用您最喜欢的 编程语言
- 🔍 精心测试 — 让我们担心电子邮件客户端兼容性
- 💌 使用您最喜欢的 ESP — Amazon SES、SendGrid、Mailgun + 更多
- 💪 电子邮件基础设施 — 速率限制、重试、计划 + 更多
- ⚡ 批量发送 — 使用一个 API 调用发送 1 封或 1,000 封电子邮件
🚀 开始使用
通过 Cargo 安装
cargo add templateless
或手动添加到您的 Cargo.toml
[dependencies]
templateless = "0.1"
🔑 获取您的 API 密钥
以下示例需要 API 密钥 ⬇️
- 每月 3,000 封电子邮件
- 所有流行的电子邮件提供商集成
- 立即开始发送
👩💻 快速示例
这就是发送注册确认电子邮件的全部过程
use templateless::{Content, Email, EmailAddress, Templateless, Result};
#[tokio::main]
async fn main() -> Result<()> {
let content = Content::builder()
.text("Hi, please **confirm your email**:")
.button("Confirm Email", "https://your-company.com/signup/confirm?token=XYZ")
.build()?;
let email = Email::builder()
.to(EmailAddress::new("<YOUR_CUSTOMERS_EMAIL_ADDRESS>"))
.subject("Confirm your signup 👋")
.content(content)
.build()?;
let _result = Templateless::new("<YOUR_API_KEY>")
.send(email)
.await?;
Ok(())
}
更多 Rust 示例在 示例 文件夹中 ✨
[!NOTE] 🚧 SDK 尚未稳定。 随着更多功能的添加,此 API 可能会更改。请关注仓库中的 变更日志 中的更改。
🏗 调试
您可以通过在仪表板中激活 测试模式 来生成 测试 API 密钥。通过使用这些密钥,您将能够查看完全渲染的电子邮件,而无需实际发送它们。
当您在SDK中使用测试API密钥时,尝试发送电子邮件时,您的日志中将显示以下输出
Templateless [TEST MODE]: Emailed user@example.com, preview: https://tmpl.sh/ATMxHLX4r9aE
预览链接将显示电子邮件,但您必须登录到无模板才能查看。
🔳 组件
电子邮件是通过函数调用来程序化构建的。无需处理HTML或拖放构建器。
以下所有组件都可以混合搭配,以创建动态电子邮件
文本 / Markdown
文本组件允许您插入一个段落。每个段落支持基本的Markdown
-
粗体文本:
**粗体文本**
-
斜体文本:
_斜体文本_
-
链接:
[链接文本](https://example.com)
-
也是一个链接:
<https://example.com>
-
标题 (h1-h6)
#大标题
######小标题
-
无序列表
- item one - item two - item three
-
有序列表
1. item one 1. item two 1. item three
Content::builder()
.text("## Thank you for signing up")
.text("Please **verify your email** by [clicking here](https://example.com/confirm?token=XYZ)")
.build()?;
链接
链接组件添加锚点标签。这与带有Markdown编写的链接的文本组件相同
Content::builder()
.link("Confirm Email", "https://example.com/confirm?token=XYZ")
.build()?;
按钮
按钮也可以用作行动号召。按钮颜色通过仪表板的应用程序颜色设置。
Content::builder()
.button("Confirm Email", "https://example.com/confirm?token=XYZ")
.build()?;
图片
图片组件将链接到电子邮件中的图片。请注意,出于隐私原因,许多电子邮件客户端将阻止自动加载图片。
// Simple
Content::builder()
.image("https://placekitten.com/300/200")
.build()?;
// Clickable & with attributes
Content::builder()
.component(
Image::new("https://placekitten.com/300/200")
.url("https://example.com")
.width(200)
.height(100)
.alt("Alt Text")
.build()?
)
.build()?;
仅需要 src
参数;其他都是可选的。
如果您已开启“图片优化”
-
您的图片将被缓存并由我们的CDN分发,以加快加载速度。缓存不会过期。如果您想重新缓存,只需在图片URL的末尾添加一个查询参数即可。
-
图片将被转换为电子邮件客户端广泛支持的格式。以下图片格式将自动处理
- Jpeg
- Png
- Gif
- WebP
- Tiff
- Ico
- Bmp
- Svg
-
免费账户的最大图片大小为5MB,付费账户为20MB。
-
如果您想指定
width
和/或height
(它们是可选的)。请注意,如果图片太大,将会缩小以适应电子邮件主题。
一次性密码
OTP组件专为显示临时密码和重置码而设计。
Content::builder()
.text("Here's your **temporary login code**:")
.otp("XY78-2BT0-YFNB-ALW9")
.build()?;
社交图标
您可以通过指定用户名轻松添加带有链接的社交图标。通常,此组件位于电子邮件的页脚中。
这些都是支持的平台
Content::builder()
.socials(&[
SocialItem::new(Service::Website, "https://example.com"),
SocialItem::new(Service::Email, "[email protected]"),
SocialItem::new(Service::Phone, "123-456-7890"), // `tel:` link
SocialItem::new(Service::Facebook, "Username"),
SocialItem::new(Service::YouTube, "ChannelID"),
SocialItem::new(Service::Twitter, "Username"),
SocialItem::new(Service::X, "Username"),
SocialItem::new(Service::GitHub, "Username"),
SocialItem::new(Service::Instagram, "Username"),
SocialItem::new(Service::LinkedIn, "Username"),
SocialItem::new(Service::Slack, "Org"),
SocialItem::new(Service::Discord, "Username"),
SocialItem::new(Service::TikTok, "Username"),
SocialItem::new(Service::Snapchat, "Username"),
SocialItem::new(Service::Threads, "Username"),
SocialItem::new(Service::Telegram, "Username"),
SocialItem::new(Service::Mastodon, "@[email protected]"),
SocialItem::new(Service::Rss, "https://example.com/blog"),
])
.build()?;
在浏览器中查看
如果您希望收件人能够在浏览器中阅读电子邮件,您可以添加“在浏览器中查看”组件,该组件将自动生成链接。通常,此组件位于电子邮件的页眉或页脚中。
您可以提供链接的文本。如果没有提供,则使用默认值:“在浏览器中查看”
知道链接的人将能够查看电子邮件。
Content::builder()
.view_in_browser()
.build()?;
存储徽章
通过商店徽章链接到您的移动应用程序
Content::builder()
.store_badges(&[
StoreBadgeItem::new(StoreBadge::AppStore, "https://apps.apple.com/us/app/example/id1234567890"),
StoreBadgeItem::new(StoreBadge::GooglePlay, "https://play.google.com/store/apps/details?id=com.example"),
StoreBadgeItem::new(StoreBadge::MicrosoftStore, "https://apps.microsoft.com/detail/example"),
])
.build()?;
二维码
您还可以即时生成二维码。它们将以图片形式显示在电子邮件中。
以下是所有支持的数据类型
// URL
Content::builder()
.qr_code("https://example.com")
.build()?;
// Email
Content::builder()
.component(QrCode::email("[email protected]"))
.build()?;
// Phone
Content::builder()
.component(QrCode::phone("123-456-7890"))
.build()?;
// SMS / Text message
Content::builder()
.component(QrCode::sms("123-456-7890"))
.build()?;
// Geo coordinates
Content::builder()
.component(QrCode::coordinates(37.773972, -122.431297))
.build()?;
// Crypto address (for now only Bitcoin and Ethereum are supported)
Content::builder()
.component(QrCode::cryptocurrency_address(Cryptocurrency::Bitcoin, "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa"))
.build()?;
// You can also encode any binary data
Content::builder()
.component(QrCode::new(&[1, 2, 3]))
.build()?;
签名
生成的签名可以添加到您的电子邮件中,以增添一丝个人风格。这将使用几种可用的字体之一,将您的自定义文本与图片嵌入
// Signature with a default font
Content::builder()
.signature("John Smith")
.build()?;
// Signature with a custom font
Content::builder()
.component(Signature::new("John Smith", Some(SignatureFont::ReenieBeanie)))
.build()?;
以下是可用的字体
SignatureFont::ReenieBeanie
预览 →SignatureFont::MeowScript
预览 →SignatureFont::Caveat
预览 →SignatureFont::Zeyada
预览 →SignatureFont::Petemoss
预览 →
签名不应超过64个字符。仅允许字母数字字符和大多数常见符号。
组件可以放置在电子邮件的标题、正文和页脚中。标题和页脚的样式通常与正文略有不同(例如,文本较小)。
let header = Header::builder() // Header of the email
.text("Smaller text")
.build()?;
let content = Content::builder() // Body of the email
.text("Normal text")
.build()?;
目前有2种主题可供选择:Theme::Unstyled
和 Theme::Simple
let content = Content::builder()
.theme(Theme::Simple)
.text("Hello world")
.build()?;
🤝 贡献
- 欢迎贡献
- 请star此仓库以获得更多曝光度 <3
📫 联系我们
-
如果您需要客户支持,请随时通过电子邮件发送给我们 [email protected]
-
有建议或想要提供反馈?以下是我们如何联系
- 对于功能请求,请发起讨论
- 发现了一个错误?打开一个问题!
- 向@Templateless打个招呼 👋
🍻 许可证
依赖项
~7–21MB
~281K SLoC