Read MailKite inboxes from any standard client or library — Apple Mail, Thunderbird, mobile, or your own code — over IMAPS with an app password. A JMAP-on-Workers gateway is in beta for modern, JSON-native mailbox access.
A real IMAP server on imap.mailkite.dev:993 — connect the mail apps and libraries you already use, no proprietary client required.
Generate and revoke per-client app passwords in the dashboard, so a lost device never means rotating your whole account.
A JMAP-on-Workers gateway is in beta for JSON-native, low-latency mailbox access from modern clients and code.
Messages and attachments are served from MailKite's storage on Cloudflare — the same inbox the webhook, webmail UI, and API see.
Point a domain at MailKite (or use a managed subdomain) and create the mailbox address you want to read.
Issue an app password for the mailbox in the dashboard — that's the credential your client or code uses.
Use imap.mailkite.dev:993 with the address and app password, from a mail app or an IMAP library.
A standard IMAPS connection in whatever language you're already using — the same credentials also work from any mail app.
Dashboard → Mailboxes → you@yourdomain.com
Click [ + App password ] (copy it — shown once)
Point any mail app at:
Incoming IMAP imap.mailkite.dev : 993 (TLS)
Username you@yourdomain.com
Password <the app password>
Outbound goes through the Send API or the SMTP relay,
SPF/DKIM aligned to your domain.import { ImapFlow } from "imapflow";
const client = new ImapFlow({
host: "imap.mailkite.dev",
port: 993,
secure: true,
auth: { user: "you@yourdomain.com", pass: process.env.MAILKITE_IMAP_PASSWORD },
});
await client.connect();
const lock = await client.getMailboxLock("INBOX");
try {
for await (const msg of client.fetch({ seen: false }, { source: true })) {
handle(msg.source);
}
} finally {
lock.release();
}
await client.logout();import imaplib
m = imaplib.IMAP4_SSL("imap.mailkite.dev", 993)
m.login("you@yourdomain.com", APP_PASSWORD) # from the dashboard
m.select("INBOX")
_, data = m.search(None, "UNSEEN")
for num in data[0].split():
_, msg = m.fetch(num, "(RFC822)")
handle(msg[0][1])<?php
$mbox = imap_open(
"{imap.mailkite.dev:993/imap/ssl}INBOX",
"you@yourdomain.com",
getenv("MAILKITE_IMAP_PASSWORD")
);
foreach (imap_search($mbox, "UNSEEN") ?: [] as $num) {
handle(imap_fetchbody($mbox, $num, ""));
}
imap_close($mbox);Properties props = new Properties();
props.put("mail.store.protocol", "imaps");
Session session = Session.getInstance(props);
Store store = session.getStore("imaps");
store.connect("imap.mailkite.dev", 993, "you@yourdomain.com", System.getenv("MAILKITE_IMAP_PASSWORD"));
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
for (Message msg : inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false))) {
handle(msg);
}c, err := client.DialTLS("imap.mailkite.dev:993", nil)
if err != nil { log.Fatal(err) }
defer c.Logout()
if err := c.Login("you@yourdomain.com", os.Getenv("MAILKITE_IMAP_PASSWORD")); err != nil {
log.Fatal(err)
}
c.Select("INBOX", false)
criteria := imap.NewSearchCriteria()
criteria.WithoutFlags = []string{imap.SeenFlag}
uids, _ := c.Search(criteria)
seqset := new(imap.SeqSet)
seqset.AddNum(uids...)
messages := make(chan *imap.Message, 10)
go c.Fetch(seqset, []imap.FetchItem{imap.FetchRFC822}, messages)
for msg := range messages { handle(msg) }require "net/imap"
imap = Net::IMAP.new("imap.mailkite.dev", port: 993, ssl: true)
imap.login("you@yourdomain.com", ENV["MAILKITE_IMAP_PASSWORD"])
imap.select("INBOX")
imap.search(["UNSEEN"]).each do |id|
raw = imap.fetch(id, "RFC822")[0].attr["RFC822"]
handle(raw)
end
imap.logout# IMAP over TLS — curl speaks it, so you can check credentials
# without a mail client.
curl --ssl-reqd "imaps://imap.mailkite.dev/INBOX?UNSEEN" \
-u "you@yourdomain.com:$MAILKITE_IMAP_PASSWORD" Any IMAPS-capable client — Apple Mail, Thunderbird, mobile mail apps — plus any language's IMAP library for programmatic access. Connect to imap.mailkite.dev:993 with an app password.
A JMAP-on-Workers gateway is in beta for JSON-native, low-latency mailbox access. IMAPS is the stable, general-purpose path today.
App passwords are per-client and independently revocable, so you can connect several devices and pull one without disrupting the others or rotating your login.
Start free on unlimited domains — no credit card. Or browse the other solutions.