2 个不稳定版本
0.2.0 | 2022年9月15日 |
---|---|
0.1.0 | 2022年4月12日 |
#357 in 电子邮件
165KB
1.5K SLoC
service-io
是一个用于构建提供服务的服务器的库,几乎无需费力。
- 选择一个输入连接器。
- 选择一个输出连接器。
- 选择您的服务。
- 运行它!
其中一个主要用例是在不托管服务器的情况下提供服务 (如示例所示)。
它是如何工作的?
所有这些,输入、输出和 服务 都使用同一种语言:Message
类型。
输入获取并将输入数据转换为 Message
。服务接收 Message
并生成其他 Message
,通常执行某种类型的处理。输出将 Message
转换为输出数据并交付。
特性
- 易于使用。用很少的代码运行包含大量服务器的服务器。
- 无需托管。使用现有的电子邮件基础设施(如 IMAP/SMTP 连接器)运行自定义服务器代码,无需托管服务器。
- 可扩展性。通过实现具有单个方法的 trait 创建自己的输入/输出/服务。 查看文档
- 多平台。在任何计算机上运行您的本地服务服务器。
入门指南
将以下内容添加到您的 Cargo.toml
service-io = "0.1"
示例
在您的任何家用电脑上运行此示例,并在主题中发送带有 public-ip
的电子邮件(例如,发送到 services@domain.com
),您将获得一个包含您的家用公共 IP 的响应电子邮件!
以类似的方式,在主题中发送带有 process ls -l
的电子邮件将返回一个包含运行示例的文件夹中的文件的电子邮件。
use service_io::engine::Engine;
use service_io::connectors::{ImapClient, SmtpClient, imap};
use service_io::services::{PublicIp, Process, Echo, Alarm};
use service_io::secret_manager::PasswordManager;
#[tokio::main]
async fn main() {
Engine::default()
.input(
ImapClient::default()
.domain("imap.domain.com")
.email("[email protected]")
.secret_manager(PasswordManager::new("1234")),
)
.output(
SmtpClient::default()
.domain("smtp.domain.com")
.email("[email protected]")
.secret_manager(PasswordManager::new("1234")),
)
.add_service("echo", Echo)
.add_service("alarm", Alarm)
.add_service("public-ip", PublicIp)
.add_service("process", Process)
// Add any other service you want
.run()
.await;
}
向 services@domain.com
发送的任何电子邮件都将被解释为 ImapClient
连接器的请求。如果主题的第一词与 public-ip
匹配,则请求将由 PublicIp
服务处理。服务 PublicIp
将生成一个响应,该响应将通过电子邮件由 SmtpClient
交付给请求电子邮件的发送者。
检查 Engine 类型以获取更多方法,例如输入映射/过滤器或向您的服务添加白名单。
用 Google 帐户测试它!
Gmail 只允许使用 OAuth2 作为访问机制。您不能再使用应用程序的密码来登录。因此,为了使用 IMAP 和 SMTP 连接器,我们需要与 OAuth2 相关的 3 个值:client_id
、client_secret
和 refresh_token
。按照以下步骤获取它们
- 打开您要使用的 Gmail 帐户关联的 google console。
- 创建一个新项目。
- 添加 OAuth 2.0 凭证。此步骤将为您提供
client_id
和client_secret
。 - 运行以下脚本来生成
refresh_token
(此脚本为 gmail-oauth2-tools 的 python3 端口)python3 util/oauth2.py --generate_oauth2_token --client_id=<client_id> --client_secret=<client_secret>
- 打开浏览器并将它给出的值复制到控制台。这应该显示
refresh_token
。
现在,使用 email_server 示例测试它。运行
cargo run --example email_server -- \
--imap-domain imap.gmail.com \
--smtp-domain smtp.gmail.com \
--email <user>@gmail.com \
--oauth2-path-url https://accounts.google.com/o/oauth2/v2/auth \
--oauth2-token-url https://www.googleapis.com/oauth2/v3/token \
--oauth2-client-id <client_id> \
--oauth2-client-secret <client_secret>\
--oauth2-refresh-token <refresh_token>\
-vv
如果您向您的 <user>@gmail.com
发送主题为 s-echo
的电子邮件,几秒钟后您应该收到相同的电子邮件。
恭喜! 您已经拥有了自己的无服务器服务器。
无服务器服务器用例
如果您想提供一些使用 自定义服务器代码 的自定义服务,您被迫付费和维护一个托管服务器,即使您提供的服务是偶尔的或资源使用不多。
为了解决这个问题,您可以使用现有的电子邮件基础设施,通过 IMAP 和 SMTP 协议处理电子邮件作为请求/响应,并将它们与您的服务相关联。
service-io
在此场景中有所帮助。运行本地 service-io
实例,带有 IMAP/SMTP 连接器。IMAP 连接器将定期检索您的客户发送的电子邮件,然后您的服务将处理这些电子邮件并生成响应,最后 SMTP 连接器将响应电子邮件返回给用户。
任何拥有电子邮件客户端的设备都可以与您的本地服务器部署交互。没有 托管维护 和 前端应用程序开发。
贡献
-
您实现了 服务 或 连接器 吗? 如果其功能不是私有的,与他人分享!发起一个 拉取请求,以便每个人都可以使用它 :)
-
您有任何酷炫的 想法,发现了 错误 或有任何 问题 或 疑虑 吗? 不要犹豫,发起一个问题!
依赖项
~15–31MB
~570K SLoC