#service #message #async #server

service-io

快速、简便(且无需托管!)构建服务服务器

2 个不稳定版本

0.2.0 2022年9月15日
0.1.0 2022年4月12日

#357 in 电子邮件

Apache-2.0

165KB
1.5K SLoC

Rust 1K SLoC Python 180 SLoC // 0.4% comments

service-io 是一个用于构建提供服务的服务器的库,几乎无需费力。

  1. 选择一个输入连接器。
  2. 选择一个输出连接器。
  3. 选择您的服务。
  4. 运行它!

其中一个主要用例是在不托管服务器的情况下提供服务 (如示例所示)

它是如何工作的?

所有这些,输入、输出和 服务 都使用同一种语言: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_idclient_secretrefresh_token。按照以下步骤获取它们

  1. 打开您要使用的 Gmail 帐户关联的 google console
  2. 创建一个新项目。
  3. 添加 OAuth 2.0 凭证。此步骤将为您提供 client_idclient_secret
  4. 运行以下脚本来生成 refresh_token(此脚本为 gmail-oauth2-tools 的 python3 端口)
    python3 util/oauth2.py --generate_oauth2_token --client_id=<client_id> --client_secret=<client_secret>
    
  5. 打开浏览器并将它给出的值复制到控制台。这应该显示 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