asopi tech
asopi techIndie Developer

Asopitech With · メールクライアント

Gmail with Alopex DB

Gmailは、メールの送受信と保管、検索を備えたメールサービスです。これをAlopex DBを使って再現すると…?

更新: 2026/10/12

どんなサービスか

Gmailのようなメールサービスは、メールの送受信と保管に加えて、受信箱の中を問いかけで探す検索、長いスレッドの要約、返信の下書きを支援します。扱うデータは、メッセージ、スレッド、ラベル、連絡先、添付ファイルの情報です。

データの置き場所

  • SQLテーブル:メッセージ、スレッド、ラベル、メッセージとラベルの対応をテーブルに持ちます。差出人、日付、ラベルでの絞り込みは、普通のSQLです。
  • ベクトル:本文の埋め込みをベクトル列に持ち、「先週届いた、出張の手配に関するメール」のような問いで探します。
  • 全文検索:件名と本文に全文検索の索引を張り、注文番号のような言葉は、言葉そのもので探します。
  • カラムナーテーブル:送受信の記録をHTTPの取り込みでカラムナーテーブルに入れ、差出人別や月別の件数を集計します。

受信したメールを、アプリがひとまとまりで書き込みます。メッセージの行、ラベル、本文の埋め込みを、同じトランザクションでコミットします。埋め込みはアプリが作ります。検索は、書き込み途中のメールを見ません。

配置の形

Alopex DBを、ユーザーの端末のメールクライアントに組み込みます。メールボックスは、ひとつの .alopex ファイルです。受信箱の検索も意味の検索も手元で完結するので、オフラインでも動き、本文は端末の外に出ません。

Alopex DBが合う理由

メールの検索は、条件での絞り込み、言葉の一致、意味の近さを組み合わせて初めて使いやすくなります。Alopex DBは、これらをSQLの中でまとめて扱い、書き込みをトランザクションで守ります。

コードで見る

メッセージとラベルをテーブルに持ち、ラベルで絞って新しい順に並べます。受信箱の基本の操作です。

import alopex

# メールボックスは1つの .alopex ファイル
db = alopex.Database.open("gmail.alopex")

db.execute_sql("""
    CREATE TABLE IF NOT EXISTS messages (
        id INTEGER PRIMARY KEY,
        sender TEXT,
        subject TEXT,
        received DATE
    )
""")
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS message_labels (
        message_id INTEGER,
        label TEXT
    )
""")

messages = [
    (1, "boss@example.com", "出張の手配", "2026-10-20"),
    (2, "news@example.com", "週刊ニュース", "2026-10-19"),
    (3, "boss@example.com", "見積もりの確認", "2026-10-18"),
]
for m in messages:
    db.execute_sql("INSERT INTO messages (id, sender, subject, received) VALUES (?, ?, ?, ?)", list(m))
for mid, label in [(1, "仕事"), (3, "仕事"), (2, "ニュース")]:
    db.execute_sql("INSERT INTO message_labels (message_id, label) VALUES (?, ?)", [mid, label])

# 「仕事」ラベルのメールを、新しい順に並べる
rows = db.execute_sql("""
    SELECT m.received, m.sender, m.subject
    FROM messages AS m
    JOIN message_labels AS l ON l.message_id = m.id
    WHERE l.label = ?
    ORDER BY m.received DESC
""", ["仕事"])

for row in rows:
    print(row["received"], row["subject"])

差出人・日付・ラベルでの絞り込みは、普通のSQLです。ここに意味検索や全文検索を足していけます。

メールとラベルと埋め込みを同じトランザクションで書き込めるAlopex DBで、メールクライアントを試作してみよう。手順はクイックスタートにあります。

関連リンク