MoeMail

一次性信箱檢測

輸入一個網域,看它是否屬於一次性信箱服務商。免費、免註冊 —— 我們連自己的網域也一起標出來。

可以直接貼上完整地址(name@example.com),只取網域部分,不做任何保存。

20 個常見網域的現成結論

表格裡的結論由檢測器所用的同一份資料生成,因此永遠不可能和檢測結果不一致。說明欄講的是「這是什麼服務」,結論欄講的是「封鎖清單怎麼說它」。

網域結論這是什麼
gmail.com未被列為一次性信箱Google 的個人信箱服務。
outlook.com未被列為一次性信箱微軟的個人信箱服務。
yahoo.com未被列為一次性信箱Yahoo 信箱。
icloud.com未被列為一次性信箱Apple 的信箱服務,綁定 Apple 帳號。
proton.me未被列為一次性信箱注重隱私的信箱服務商,有免費與付費方案。
qq.com未被列為一次性信箱騰訊 QQ 信箱,中國使用最廣的信箱之一。
163.com未被列為一次性信箱網易信箱,在中國使用廣泛。
gmx.com未被列為一次性信箱GMX,經營多年的免費信箱服務商。
zoho.com未被列為一次性信箱Zoho Mail,面向企業與自有網域。
simplelogin.io未被列為一次性信箱別名轉寄服務,轉寄到你真正的收件匣。
duck.com未被列為一次性信箱DuckDuckGo Email Protection,別名轉寄服務。
mailinator.com已被列為一次性信箱公開的一次性收件匣,任何人不必註冊即可開啟。
yopmail.com已被列為一次性信箱一次性收件匣服務商。
guerrillamail.com已被列為一次性信箱一次性收件匣服務商,仍在運作的最老牌之一。
sharklasers.com已被列為一次性信箱Guerrilla Mail 的備用網域之一。
10minutemail.com已被列為一次性信箱短時間後自動過期的一次性收件匣。
temp-mail.org已被列為一次性信箱一次性收件匣服務商,擁有多個地區網域。
1secmail.com已被列為一次性信箱一次性收件匣服務商,同時提供公開 API。
trashmail.com已被列為一次性信箱基於轉寄、帶有效期的一次性地址。
moemail.app這是我們自己的網域就是本站。一次性信箱服務商 —— 見下方說明。

為什麼給兩級,而不是「是」或「否」

多數免費檢測器只回答 true 或 false,這恰好隱藏了你真正需要知道的事:這個答案有多確定。我們使用兩份審核標準不同的清單,並告訴你命中的是哪一份。

已列入

網域在嚴格審核的封鎖清單裡,條目經過人工複核,誤判很少。如果你要做自動封鎖或標記,這一級才是可以直接行動的依據。

可能

只在涵蓋更廣的那份清單裡,那份清單犧牲精確度換取涵蓋率。適合作為多個訊號中的一個。只憑這一級就封鎖,偶爾會誤傷真實使用者。

未列入

兩份都沒有。請注意它代表什麼、不代表什麼:沒有任何封鎖清單是完整的,一個全新的一次性網域會在一段時間內一直通過這項檢測。

封鎖清單命中是證據,不是鐵證。任何有實際後果的判斷,都該結合你自己掌握的訊號 —— MX 記錄、網域註冊時間、帳號行為,或者一封確認信。

別名服務和一次性信箱不是同一件事

SimpleLogin、DuckDuckGo Email Protection,以及 Gmail 自帶的加號地址,給你的是一個轉寄到你長期收件匣的地址。地址是可丟棄的,後面的收件匣不是。使用者照樣會讀信、照樣會回覆、日後照樣能找回帳號。

各家封鎖清單對它們的處理並不一致,所以你可能會看到某個別名網域被標記。這一點在你決定封鎖之前值得知道:擋掉別名使用者,趕走的是注重隱私但完全真實的客戶。一次性收件匣幾分鐘後就被丟棄,而別名可能比它服務的那個帳號活得更久。

資料本身就有自相矛盾的地方,值得一看。`addy.io` 被列入了,而同一家公司的舊網域 `anonaddy.com` 沒有;`relay.firefox.com` 被列入了,但 Firefox Relay 實際發放的別名地址用的是 `mozmail.com`,而後者根本不在清單裡。這兩個標記都落在「可能」這一級、而不是「已列入」—— 這正是那一級存在的意義。

我們把自己的網域也標為一次性

MoeMail 提供的就是一次性信箱服務。我們的網域做的事情和封鎖清單描述的完全一致,所以誠實的答案是:它們本來就該在那些清單上 —— 這個檢測器也照實這麼說。

我們本來可以悄悄把自己排除掉。沒有這麼做,理由很簡單:任何人花五秒鐘就能拿自家網域試出來,而一個被抓到偏袒自己的工具毫無價值。如果你在經營網站、想擋掉一次性註冊,你應該能用這個工具把我們也擋在外面。

網站實際上是怎麼識別一次性信箱的

像這樣的封鎖清單查詢只是第一層。真實系統會疊加好幾道檢查:拿網域去比對公開與商業清單、解析 MX 記錄看它到底收不收信、看網域註冊了多久、以及觀察帳號註冊之後的行為。

這也是為什麼有些地址明明不在任何清單上卻仍被拒絕,而有些一次性地址反而能順利通過。想看更完整的版本,我們另外寫過一篇。

為什麼網站會擋一次性信箱

資料來自哪裡

檢測器查詢兩份由社群維護的開源封鎖清單。其中第二份是聚合器,所以下面把餵給它的儲存庫也一併署名,每一個都回連原始出處。我們從上游重新建置自己的副本,而不是手動改條目,所以你在這裡看到的和維護者發布的一致。

這不是資料來源的完整清單。那個聚合器還會直接抓取一次性信箱網站,那些沒有儲存庫、也沒有授權可以署名。它的原始碼是公開的,你可以自己查全量: generator.py

下載這份清單

合併去重後的清單以純文字提供 —— 每行一個網域,不需金鑰、無流量限制。可以直接用在你自己的專案裡。

disposable-domains.txt

兩份清單都不聲稱自己是最新或完整的,維護者自己也明說了這一點。網域會轉手,服務會關停,新的每天都在出現。請把這裡得到的結果當作社群維護的一份快照,而不是即時權威。

免費一次性信箱檢測 API

這個頁面跑的就是這個查詢,只是換成 JSON 介面。不需要 API key、不需要註冊、沒有配額要儲值 —— 在註冊表單裡呼叫、在 Worker 裡呼叫、在 shell 腳本裡呼叫都可以。它讀的是上面寫明的同兩份清單,所以介面給出的答案和你在這個頁面看到的完全一致。

試一下
curl "https://moemail.app/api/tools/v1/disposable-email/check?domain=mailinator.com"

端點

GEThttps://moemail.app/api/tools/v1/disposable-email/check?domain=…

查一個網域,或一個完整信箱地址 —— 地址前半段會被丟棄。回傳正規化後網域的判定結果。

GEThttps://moemail.app/api/tools/v1/disposable-email/dataset

目前回答問題的是清單的哪一份快照:各層規模、建置時間,以及每個上游檔案下載時的 SHA-256。如果你需要記錄某個決定是由哪份資料做出的,在啟動時呼叫一次就夠了。

回應欄位

domainstring
判定所針對的正規化網域:已轉小寫、去掉地址前半段和結尾的點。請拿它來比對,而不是拿你送過去的原始字串。
disposableboolean
網域出現在任一份清單裡(包括我們自己的網域)時為 true。這是粗粒度的答案 —— 在用它擋註冊之前,請先讀下面那段警告。
verdict"high" | "medium" | "none" | "ours"
命中的是哪一層。high 是人工嚴格維護的那份清單。medium 只出現在那份廣泛聚合的清單裡。none 是兩份都沒有。ours 是 MoeMail 自己的收件網域 —— 它確實是一次性信箱,而且沒有任何第三方清單收錄它。

不要只看 disposable 就擋人

我們知道的約 75,000 個網域裡,medium 佔了大約 66,000 個,而它來自一份沒有人手工審核的廣泛聚合清單。把它們全部擋掉,一定會誤傷真實使用者。如果一次誤判會讓你丟掉一個客戶,那就只對 verdict === "high" 做攔截,把 medium 當成「要求二次驗證」的理由,而不是「拒絕」的理由。disposable 這個欄位的存在,是為了讓原本對接布林型介面的程式碼能直接換過來,不是因為布林值是正確的決策邊界。

錯誤

每個錯誤都同時帶一個機器可讀的 code 和一段給人看的 error。請對 code 做分支判斷:文案隨時可能改寫,而這些 code 在 API 版本不變的前提下不會變。

400missing_domain沒有傳 domain 參數,或者傳了空值。
400invalid_domain不是一個像樣的網域。domain 被重複傳入時、以及傳入 Unicode 網域時也回傳這個 —— Unicode 網域請先轉成 punycode(xn--…)。
400input_too_long參數超過 320 個字元,而這已經是一個真實地址可能達到的最大長度。

限流、快取與穩定性

每個 IP 每 10 秒 17 次,由 Cloudflare 在邊緣執行,不是在這個 API 內部。沒有任何 key 能提高這個上限,也沒有付費方案 —— 如果你需要的量超過它,請直接下載全量清單,在本地查。

超過之後,Cloudflare 會在邊緣直接擋掉,請求根本到不了這個 API:429Retry-After: 10,以及一小段 text/plain 內容 —— 不是上面那個 JSON 結構。有兩個後果需要提前考慮。攔截回應**不帶** Access-Control-Allow-Origin,所以瀏覽器看到的是一個不透明的網路錯誤,而不是一個能讀的 429;而且因為請求從未到達這裡,也就沒有 code 欄位可以分支。請把「突發之後立刻失敗的請求」當作被限流處理。

回應可快取一天(s-maxage=86400),並帶一個由上游檔案雜湊推導出來的 ETag,所以在資料沒變的期間,條件請求幾乎不花任何成本。清單是建置時編譯進去的,因此在下一次部署之前答案不會改變。有一個後果值得知道:命中快取的請求根本到不了限流器,所以這個限額是在塑造流量,而不是在做硬保證。

所有回應都帶 Access-Control-Allow-Origin: *,因此瀏覽器可以直接從你的註冊表單呼叫它,中間不需要任何代理。

v1 承諾的是形狀,不是資料:欄位不會被刪除或改名,狀態碼的含義也不會變 —— 除非路徑裡出現新的版本段。至於判定結果本身,只要上游清單變了它就會變。

程式碼範例

每一段都是對 verdict 做判斷,而不是對布林值做判斷,因為後者並不是你真正想做的那個決策。

cURL
curl "https://moemail.app/api/tools/v1/disposable-email/check?domain=mailinator.com"
# {"domain":"mailinator.com","disposable":true,"verdict":"high"}

curl "https://moemail.app/api/tools/v1/disposable-email/dataset"
# {"high":8742,"medium":66885,"total":75627,"builtAt":"…","status":"upstream",…}
Node.js
const ENDPOINT = "https://moemail.app/api/tools/v1/disposable-email/check"

async function verdictFor(domain) {
  const res = await fetch(`${ENDPOINT}?domain=${encodeURIComponent(domain)}`)
  const body = await res.json()
  if (!res.ok) throw new Error(body.code)   // branch on `code`, never on `error`
  return body.verdict
}

// "medium" means "only in the broad aggregator list" — a signal, not a verdict.
// Gate signups on the tier you are willing to defend to a real user.
const verdict = await verdictFor("mailinator.com")
const reject = verdict === "high" || verdict === "ours"
Python
import requests

ENDPOINT = "https://moemail.app/api/tools/v1/disposable-email/check"

def verdict_for(domain: str) -> str:
    r = requests.get(ENDPOINT, params={"domain": domain}, timeout=5)
    r.raise_for_status()
    return r.json()["verdict"]

# Note: use requests (or set an explicit User-Agent). Cloudflare's managed bot
# rules block the default "Python-urllib/3.x" agent with a 403 before the
# request ever reaches this API.

if verdict_for("mailinator.com") in ("high", "ours"):
    ...  # reject the signup
PHP
<?php
function verdict_for(string $domain): string {
    $url = 'https://moemail.app/api/tools/v1/disposable-email/check?domain=' . urlencode($domain);
    $ctx = stream_context_create(['http' => [
        'timeout' => 5,
        // Send a real User-Agent: identify your app, and stay clear of any
        // bot rule that keys on a default library agent.
        'header'  => "User-Agent: my-app/1.0\r\n",
    ]]);
    $body = json_decode(file_get_contents($url, false, $ctx), true);
    return $body['verdict'];
}

if (in_array(verdict_for('mailinator.com'), ['high', 'ours'], true)) {
    // reject the signup
}
Cloudflare Worker
export default {
  async fetch(request) {
    const email = new URL(request.url).searchParams.get("email") ?? ""
    const domain = email.split("@").pop()

    // Responses are cacheable (s-maxage=86400), so the Cache API turns a
    // repeated lookup into zero subrequests.
    const res = await fetch(
      `https://moemail.app/api/tools/v1/disposable-email/check?domain=${encodeURIComponent(domain)}`,
      { cf: { cacheTtl: 86400, cacheEverything: true } },
    )
    const { verdict } = await res.json()

    return Response.json({ allow: verdict !== "high" && verdict !== "ours" })
  },
}

這些清單由公開的上游資料編譯而成,其中一部分的授權要求署名資訊隨資料一起傳遞。因此每個回應都帶一個 Link: rel="license" 標頭指回上面的署名清單,而完整的授權條文隨可下載資料集的檔案標頭一起散布。

和其它免費查詢 API 的比較

免費、不需要 key 的一次性網域查詢介面有那麼幾個。下面是這一個和它們的差別 —— 也包括它做得更少的地方。

比較項MoeMailKickbox OpenDeBounce Freevalidator.pizza
不需要 API key 或註冊
瀏覽器可直接呼叫(CORS)
信賴度粒度兩層,另加自有網域單一布林單一布林,但以字串回傳單一布林
公開資料來源,並給出檢查碼
可下載全量清單
資料版本可查詢
即時 MX / 網域年齡查詢
明示的限流每 10 秒 17 次,有文件未標明未標明x-ratelimit-limit: 1

表中每一格都是在 2026-08-22 透過實際呼叫對方端點核實的,請求形狀與上面那段 cURL 範例一致 —— 你可以自己重跑。這裡沒有一條取自廠商的宣傳頁面:曾有一條搜尋結果聲稱 Kickbox 那個端點支援 CORS,實際上並不支援。

這四個都是黑名單查詢。它們回答的只是「這個網域是否已知為一次性信箱」,僅此而已;包括本介面在內,沒有一個能告訴你某個信箱是否真實存在。validator.pizza 走得最遠,它會即時解析 MX 記錄和網域年齡 —— 如果你要的是這個,就用它。

付費的信箱驗證服務 —— ZeroBounce、Kickbox 自家的驗證 API、Bouncer —— 做的事比這裡任何一個都多得多,包括信箱是否真實存在、以及 catch-all 偵測,並且按次收費。它們沒有進這張表,因為拿一個免費黑名單自己挑的維度去衡量它們,是一張作弊的表。

常見問題

不是。Gmail 是 Google 的個人信箱服務,不出現在任何一次性信箱封鎖清單中。它上面的地址屬於長期存在的帳號,所以不是用完即丟的地址。Gmail 的加號地址(name+tag@gmail.com)看起來像一次性地址,但信件仍然會落進同一個長期收件匣。

不會。查詢是在建置時編譯進站台的清單上進行的,你輸入的網域不會被寫進我們任何記錄或資料庫。

可以。貼上完整地址即可,只會取 @ 後面的部分。@ 前面的內容會被立即丟棄,不會離開這次請求。

封鎖清單總是落後於現實。新的一次性網域不斷上線,需要時間被通報和複核。「未列入」只說明目前還沒有清單收錄它,不代表這個網域可信。

如果你要清掉一次性註冊,按「已列入」這一級擋是合適的。「可能」這一級要謹慎 —— 那份清單用精確度換了涵蓋率,只憑它封鎖偶爾會趕走真實客戶。別名轉寄服務尤其需要小心。

我們會定期從上游重新建置。因為清單隨站台一起發布、而不是請求時才去抓取,所以你查詢的是我們最近一次部署時的版本。

有 —— 一個免費的 JSON 介面,不需要 key 也不需要註冊:GET /api/tools/v1/disposable-email/check?domain=example.com。每個 IP 每 10 秒 17 次,回應帶 Access-Control-Allow-Origin: *,所以可以直接從瀏覽器呼叫。完整的介面說明,以及 Node、Python、PHP 和 Cloudflare Worker 的範例程式碼,都在上面的 API 章節裡。

會一直免費,因為它幾乎不花我們什麼成本:清單是建置時編譯進去的,回應在邊緣快取一天,所以大多數呼叫根本到不了伺服器。沒有 key 可買,也沒有更高的方案。如果你需要的吞吐超過這個限額,請下載全量清單在本地查 —— 那份檔案本來就是為此發布的,而且本地查詢比任何網路呼叫都快。

你自己需要一個一次性信箱?

MoeMail 可以建立臨時信箱,有效期由你決定 —— 10 分鐘到 3 天 —— 到期連信件一起刪除。