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で、メールクライアントを試作してみよう。手順はクイックスタートにあります。