網域設定
在 Cloudflare 註冊網域,或將 Spaceship 等第三方註冊商購買的網域加入 Cloudflare,再完成網站、郵件和 R2 自訂網域設定。
第一次部署 Saavo 時,可以先使用 Cloudflare 提供的 workers.dev 網址。等專案能正常存取,再設定自己的網域會比較穩妥。這樣可以分別排查部署與網域問題,也不必在專案尚未正常運作時反覆修改 DNS。
本頁以 webpagetopdf.dev 為例,依序完成以下設定:
| 用途 | 範例 | 是否必要 |
|---|---|---|
| 網站主要網域 | webpagetopdf.dev | 正式上線時建議設定 |
| 網站備用網域 | www.webpagetopdf.dev | 選用,通常重新導向主要網域 |
| 接收使用者郵件 | support@webpagetopdf.dev | 有客服人員或網站需要支援信箱時設定 |
| 寄送系統郵件 | send@mail.webpagetopdf.dev | 註冊驗證、密碼重設等功能需要 |
| R2 檔案網域 | files.webpagetopdf.dev | 需要直接公開 R2 檔案時設定 |
不必一次啟用所有地址。完成網站網域設定後就可以上線,郵件和 R2 再依產品實際需求繼續處理。
先了解註冊商與 DNS 的差別
網域註冊商負責網域的購買、續約和持有人資訊,DNS 服務則負責將網域指向網站、電子郵件和儲存服務。兩者可以由同一家公司提供,也可以分開使用。
| 購買方式 | 網域在哪裡續約 | DNS 在哪裡管理 | 適合的情況 |
|---|---|---|---|
| 在 Cloudflare 購買 | Cloudflare | Cloudflare | 操作最少,準備長期使用 Cloudflare |
| 在 Spaceship 等第三方購買 | 原註冊商 | 加入後由 Cloudflare 管理 | 其他註冊商的價格、網域後綴或付款方式更合適 |
在 Spaceship 修改名稱伺服器,只是將 DNS 管理權交給 Cloudflare,並沒有把網域移轉到 Cloudflare Registrar。網域到期後仍需在 Spaceship 續約,註冊人資訊和自動續約也繼續在那裡管理。
盡量將所有 Cloudflare 資源放在同一個帳戶
網域 Zone、Saavo Worker 和 R2 Bucket 應放在同一個 Cloudflare 帳戶。一位 Cloudflare 使用者可以加入多個帳戶,操作前請先確認目前的帳戶名稱和 Account ID,避免網域加入一個帳戶,專案卻部署在另一個帳戶。
在 Cloudflare 購買網域
如果準備長期使用 Cloudflare,直接透過 Cloudflare Registrar 註冊最方便。購買後,網域會自動使用 Cloudflare DNS,不需要再修改名稱伺服器。
購買前先準備好:
- 已完成電子郵件驗證的 Cloudflare 帳號。
- 可以長期使用的聯絡電子郵件地址。
- 正確的註冊人姓名、地址和電話。
- 可以完成付款,並支援後續自動續約的付款方式。
註冊人的電子郵件地址不要使用正在購買的網域,例如 admin@webpagetopdf.dev。這時該信箱還無法收信,一旦註冊局要求驗證,或續約失敗,很可能收不到通知。使用現有且長期可管理的信箱比較可靠。
不要只看第一年的價格
Cloudflare 搜尋結果會同時顯示首年價格和續約價格。優惠只適用於第一年,之後續約通常會恢復原價,標示 Premium 的網域也可能貴上許多。請確認網域拼字、續約價格和註冊年限後再付款,網域註冊完成後通常無法退款。
搜尋並選擇網域
登入 Cloudflare Dashboard,切換到準備部署 Saavo 的帳戶,再開啟 Domain Registration → Register Domains。
搜尋框可以輸入完整網域,例如 webpagetopdf.dev,也可以輸入產品名稱,讓 Cloudflare 建議不同後綴。找到想購買的網域後,先核對拼字、首年價格和續約價格,再按下對應的購買按鈕。

搜尋結果只代表網域當下看起來仍可註冊。進入購買流程後,Cloudflare 還會向註冊局做最後確認。如果接著提示無法註冊,回到搜尋頁面重新選擇即可。
填寫註冊資訊
在 Complete your registration 頁面選擇註冊年限,並確認自動續約設定。Cloudflare 預設啟用自動續約,右側會同時顯示本次付款金額、到期日期和預估續約價格。
接著填寫真實、完整的註冊人資訊。Cloudflare 目前只接受 ASCII 字元,姓名和地址不要填中文,可以依實際資訊使用拼音或英文。這裡填入的電子郵件地址必須能長期使用,電話也要選擇正確的國家或地區代碼。

填寫後,按下右側的 Continue to pay for…,進入訂單確認頁面。
核對訂單並付款
在 Register domain 頁面再次核對網域、註冊年限、應付金額和付款方式。閱讀網域註冊協議、服務條款與隱私權政策,確認後勾選頁面要求的選項,再按下 Complete purchase。

不要因為瀏覽器已記住付款方式就直接送出。網域拼錯、選錯後綴,或未看清楚續約價格,通常無法在購買後透過退款解決。
等待註冊完成
Cloudflare 通常會在幾十秒內完成註冊。頁面顯示 Your domain is on its way,且網域前出現成功標記後,就代表網域已註冊到目前的帳戶。

按下網域右側的 Manage,可以直接進入管理頁面。日後也能從 Domain Registration → Manage Domains 找到它。
檢查網域狀態
在網域管理頁面確認狀態為 Active,並檢查到期時間、續約價格和 Auto renew 是否符合預期。

如果 Cloudflare 或註冊局寄來註冊人電子郵件驗證通知,請及時完成驗證。地址尚未驗證或驗證失效時,網域可能會暫停解析。日後聯絡資訊或付款方式有變,也應及時更新。
Cloudflare Registrar 目前的購買流程、欄位限制和名稱伺服器要求,請以官方註冊新網域說明為準。
在 Cloudflare 註冊的網域必須繼續使用 Cloudflare DNS
目前仍有這項限制。只要網域仍由 Cloudflare Registrar 管理,就不能將權威名稱伺服器改成其他 DNS 服務商。網站和電子郵件仍可使用第三方服務,只需在 Cloudflare 設定對應的 A、CNAME、MX 或 TXT 記錄,也可以視需要將個別子網域另外委派出去。
如果必須讓整個網域改用其他 DNS 服務,需先將網域移轉到其他註冊商,並留意新註冊、剛轉入或修改註冊人資訊後,可能有移轉鎖定期。Business 和 Enterprise 方案提供的 Custom Nameservers,只是自訂 Cloudflare 名稱伺服器的名稱,不代表改用第三方 DNS。
在 Spaceship 購買並加入 Cloudflare
如果網域是在 Spaceship 購買,註冊和續約仍由 Spaceship 管理,只需將 DNS 交給 Cloudflare。整個流程不需要再次購買網域,也不需要移轉到 Cloudflare Registrar。
以下使用 Cloudflare 的 Full setup(完整設定)方式:先將網域加入 Cloudflare,再到 Spaceship 將名稱伺服器改成 Cloudflare 指派的位址。完成後,DNS 記錄統一在 Cloudflare 管理,網域續約仍在 Spaceship 處理。
在 Spaceship 購買網域
開啟 Spaceship 網域搜尋,輸入準備註冊的完整網域。加入購物車前,請仔細核對網域拼字、註冊價格、續約價格、註冊年限,以及可能產生的 ICANN 費用,不要只看第一年的優惠價。
填寫真實聯絡資訊並付款後,回到 Domain List,確認網域已出現在帳戶中且可以管理。結帳時推薦的主機、Spacemail 和其他加購服務,都不是加入 Cloudflare 的必要條件,暫時用不到就不必購買。
選擇連接既有網域
Cloudflare 會列出三種操作:連接既有網域、將網域移轉到 Cloudflare,以及購買新網域。網域已在 Spaceship 註冊,因此選擇 Connect a domain。

不要選擇 Transfer a domain。連接網域只是將 DNS 交給 Cloudflare,移轉網域則會更換註冊商,兩者不同。
輸入根網域
在 Domain name 填入根網域,例如 webpagetopdf.dev。不要填 www.webpagetopdf.dev,也不要包含 https://、連接埠或路徑。

頁面下方也會顯示 AI 爬蟲策略和 DNS 記錄匯入方式。這些選項不會影響網域能否加入 Cloudflare,第一次設定可以先保留預設值,之後再依網站需求個別調整。確認網域後,按下 Continue。
檢查 Cloudflare 掃描到的 DNS 記錄
選擇方案後,會進入 Review your DNS records 頁面。Cloudflare 會嘗試掃描原 DNS 服務的記錄,但結果不一定完整,不能將它視為原始記錄的完整備份。

如果網域剛購買、尚未使用,頁面通常只有 Spaceship 自動加入的停放頁記錄,可以刪除。如果網域已有網站、電子郵件或其他服務,不要全部刪除,應先逐項核對並補齊原 DNS 中有效的 A、AAAA、CNAME、MX、TXT 等記錄。
確認記錄後,按下 Continue to activation。之後仍可在 Cloudflare 的 DNS → Records 新增或修改記錄。
儲存 Cloudflare 指派的名稱伺服器位址
Cloudflare 會顯示需要替換的舊位址,以及指派給目前網域的兩個 Cloudflare 名稱伺服器位址。先不要關閉頁面,下一步需要將這兩個位址填入 Spaceship。

每個網域取得的位址可能不同。請複製自己頁面顯示的內容,不要直接照抄本教學截圖中的 guss.ns.cloudflare.com 和 june.ns.cloudflare.com。
如果網域原本啟用了 DNSSEC,請先在原 DNS 服務中關閉,並刪除舊的 DS 記錄。等 Cloudflare 確認網域連接成功後,再透過 Cloudflare 重新啟用 DNSSEC。
改用 Cloudflare 名稱伺服器
在開啟的面板選擇 Custom nameservers,刪除 Spaceship 原有的位址:
launch1.spaceship.net
launch2.spaceship.net接著填入 Cloudflare 為目前網域指派的兩個位址。以本頁截圖中的網域為例:
guss.ns.cloudflare.com
june.ns.cloudflare.com以上只是範例,實際操作請以自己的 Cloudflare 頁面為準。核對兩個位址,確認沒有遺漏、多餘空格,也沒有混入原有的 Spaceship 位址,再儲存設定。
如果 Spaceship 提示現有的產品連接和 DNS 記錄將失效,請先確認需要保留的記錄已加入 Cloudflare,再確認切換。Spaceship 中的原有記錄將不再對外解析。
通知 Cloudflare 並等待連接完成
回到剛才的 Cloudflare 引導頁面,按下底部的 I updated my nameservers。Cloudflare 會開始檢查名稱伺服器,網域狀態會先顯示 Pending Nameserver Update,確認成功後改為 Active。
名稱伺服器更新通常不會立即完成。Cloudflare 提示最長可能需要 24 小時,Spaceship 則提示全球 DNS 完整生效可能需要 48 小時。等待期間不要反覆切回 Spaceship 名稱伺服器,否則只會更難判斷狀態。
網域變成 Active 後,DNS 記錄就改在 Cloudflare 管理。如果前面關閉了 DNSSEC,這時再依 Cloudflare 提供的 DS 資訊重新啟用。
如果超過 24 小時仍停在 Pending Nameserver Update,請檢查 Spaceship 是否儲存成功、兩個位址是否完整、是否仍混有 Spaceship 名稱伺服器,以及註冊局是否還保留舊的 DS 記錄。詳細排查方式請參閱 Cloudflare 的 Pending Nameserver Update 和完整設定流程。
修改 Nameserver 不等於移轉網域
連接完成後,DNS 記錄在 Cloudflare 管理,網域續約仍在 Spaceship 管理。不要因為 Cloudflare 已顯示 Active,就關閉 Spaceship 的自動續約或刪除註冊人資訊。
規劃網域用途
開始新增記錄前,先決定每個名稱的用途。簡單的產品可以這樣安排:
| 名稱 | 用途 | 由誰設定 |
|---|---|---|
webpagetopdf.dev | 網站唯一的正式入口 | Saavo domain:set |
www.webpagetopdf.dev | 重新導向正式入口 | Cloudflare Redirect Rules |
support@webpagetopdf.dev | 接收使用者來信 | Cloudflare Email Routing |
mail.webpagetopdf.dev | 透過 Resend 寄送系統郵件 | Resend + Cloudflare DNS |
files.webpagetopdf.dev | 公開 R2 檔案 | R2 Custom Domain |
support@webpagetopdf.dev 是電子郵件地址,不是要建立的網站子網域。mail 和 files 才是實際的 DNS 子網域,不要將同一個子網域同時交給 Resend 和 R2 使用。
綁定網站網域
先完成一次 npm run deploy:init,確認 workers.dev 網址能正常開啟。Saavo 的網域指令要求遠端 Worker 和 .env.production 已存在,不適合在首次部署前執行。
在專案根目錄執行:
npm run domain:set -- https://webpagetopdf.dev這個指令會完成四件事:
- 在
wrangler.jsonc寫入 Worker Custom Domain。 - 將
.env.production中的VITE_SITE_URL改成正式網址。 - 重新檢查、建置及部署專案。
- 存取新網域,執行健康檢查。
Cloudflare 會為 Worker 建立必要的 DNS 記錄並簽發憑證,不要預先替同一個 Hostname 手動建立 CNAME。如果該名稱已有 CNAME,Custom Domain 就會建立失敗。請先確認舊記錄是否仍在使用,再決定是否刪除。
指令執行成功後,再處理以下與正式網域有關的設定:
- 在 Turnstile Widget 的 Hostname Management 加入
webpagetopdf.dev,並將實際金鑰寫入.env.production。 - 如果已啟用 GitHub 或 Google 登入,到對應平台更新 OAuth Callback URL。
- 如果已啟用 Stripe,到 Stripe 更新 Webhook 網址。
- 檢查網站名稱、Canonical URL、Open Graph 和 Sitemap 是否已使用正式網域。
domain:set 會在終端機顯示新的 OAuth Callback 和 Stripe Webhook 網址,但不會代為修改這些第三方平台,也不會更新 Resend 的網域設定或 R2 自訂網域。
處理 www 網址
建議只保留一個正式入口,例如統一使用 https://webpagetopdf.dev。Worker Custom Domain 會精確比對 Hostname,綁定根網域不會自動接管 www.webpagetopdf.dev。
如果希望使用者輸入 www 也能存取,可以在 Cloudflare 建立一條從 www.webpagetopdf.dev 到 https://webpagetopdf.dev 的 Redirect Rule,並保留原有路徑和查詢參數。作為重新導向來源的 www,還需要一筆已啟用代理的 DNS 記錄。Cloudflare 官方的 Custom Domains 文件提供了沒有來源伺服器時可使用的占位位址。

不要讓根網域和 www 同時回傳完整頁面。長期保留兩個入口,會增加 Cookie、OAuth 回呼和搜尋引擎標準網址不一致的可能性。
設定郵件接收
config/base.ts 中的 supportEmail,只會告訴 Saavo 要在頁面顯示哪個客服信箱,以及系統郵件的 Reply-To 要使用哪個地址。填入 support@webpagetopdf.dev 不會自動建立信箱,必須另外設定收信方式。
先依實際用途選擇方案:
| 需要解決的問題 | 合適的方案 | 建議 |
|---|---|---|
只想收到使用者寄給 support@... 的郵件 | 透過 Cloudflare Email Routing 轉寄到現有信箱 | 最簡單,適合多數 Saavo 專案 |
| 需要獨立收件匣、搜尋、附件和多人管理 | 專業電子郵件服務,或另外部署開源網頁信箱 | 不要只依賴郵件轉寄 |
| 需要大量暫時地址、驗證碼收件匣或郵件 API | 以 Workers 為基礎的臨時信箱專案 | 適合開發工具,不適合作為正式客服信箱 |
將客服郵件轉寄到現有信箱
Cloudflare Email Routing 不會提供新的收件匣。收到寄給 support@webpagetopdf.dev 的郵件後,它會將郵件轉寄到你正在使用的 Gmail、Outlook 或其他信箱。
為網域啟用 Email Routing
登入 Cloudflare Dashboard,開啟 Compute → Email Service → Email Routing,按下 Onboard Domain,再選擇 webpagetopdf.dev。
Cloudflare 會為根網域加入收信所需的 MX、SPF 和 DKIM 記錄。確認頁面中的網域正確後,完成設定。DNS 記錄通常幾分鐘內就會生效,少數情況可能需要更久。
新增並驗證實際收信的地址
開啟 Destination Addresses,在頁面下方填入平常使用的電子郵件地址,再按下 Add address。

Cloudflare 會寄出驗證郵件,請開啟郵件並按下驗證連結。Destination Address 屬於整個 Cloudflare 帳戶,同一個已驗證地址可供多個網域重複使用。完成驗證前,指向它的轉寄規則不會生效。
建立 support 轉寄規則
回到 Email Routing,選擇 webpagetopdf.dev,開啟 Routing Rules,按下 Create routing rule。
依下表填寫:
| 設定項目 | 填寫內容 |
|---|---|
| Email pattern | support |
| Action | Send to an email |
| Destination | 剛才驗證的實際信箱 |
儲存後,寄給 support@webpagetopdf.dev 的郵件就會轉寄到這個信箱。除非確實需要接收寄給任意地址的郵件,否則不建議一開始就啟用 Catch-all。公開網域若接收所有地址的郵件,很容易收到大量垃圾郵件。
測試轉寄並修改 Saavo 設定
使用另一個信箱寄送測試郵件到 support@webpagetopdf.dev。不要使用 Destination Address 寄信給自己,部分郵件服務會合併、隱藏或捨棄這類郵件,容易讓人誤以為轉寄失敗。
確認能收到郵件後,再修改 Saavo 設定:
supportEmail: 'support@webpagetopdf.dev',Cloudflare 官方的郵件路由操作說明會隨管理介面更新。如果入口與本文略有不同,請以 Email Service → Email Routing 下的 Domain、Destination Addresses 和 Routing Rules 為準。
郵件轉寄不等於完整的信箱服務
直接在個人信箱回覆轉寄的郵件時,收件者通常會看到你的個人電子郵件地址。如果需要一律以 support@webpagetopdf.dev 收發郵件,或需要寄件備份、草稿、搜尋、團隊協作等功能,應使用完整的電子郵件服務,或自行部署網頁信箱。
不要讓兩項服務同時接管根網域的郵件
如果根網域已使用 Google Workspace、Microsoft 365、Spacemail 等信箱服務,不要再啟用 Cloudflare Email Routing,覆寫原有的 MX 記錄。先決定由哪項服務負責收信,再使用它提供的 DNS 記錄。重複加入兩組 MX 記錄,無法讓兩項服務穩定地同時收信。
使用 Worker 建立自己的收件匣
Email Routing 的轉寄目標除了現有信箱,也可以是 Worker。
Worker 收到郵件後,可以解析內文和附件,將資料存入 D1、Durable Objects 或 R2,再透過網頁或 API 提供收件匣功能。

這類專案通常採用以下結構:
外部郵件伺服器
↓
Cloudflare Email Routing
↓
Email Worker
├─ D1 / Durable Objects:郵件、對話串和信箱資訊
├─ R2:附件
└─ 網頁介面或 API:閱讀、搜尋和管理郵件它們並不是在 Worker 中執行的傳統 SMTP、IMAP 郵件伺服器。收信入口仍由 Cloudflare 提供。如果要寄信到任意外部地址,則需要以下其中一種寄送管道:
- Cloudflare Email Sending:可直接透過
send_email繫結寄送,但寄送到任意地址需要 Workers Paid 方案。 - Resend:設定簡單,也與 Saavo 目前預設的寄信方式一致。
- 其他 SMTP 或郵件 API:是否支援取決於個別開源專案。
自行儲存郵件不一定比轉寄可靠。Worker 逾時、解析失敗、D1 或 R2 設定錯誤,同樣可能導致收信失敗。你還需要自行處理登入保護、附件安全、垃圾郵件、備份和資料保留。只有確實需要獨立收件匣或郵件 API 時,才值得承擔這些維護工作。
可以實際部署的開源專案
以下只列出原始碼公開、授權條款明確、近期仍有維護,且確實以 Cloudflare Workers 為核心的專案。關注程度是 2026 年 8 月查看 GitHub 時的約略數值,只供評估社群規模,不代表專案已適合儲存重要郵件。
| 專案 | 關注程度 | 實際用途 | 注意事項 |
|---|---|---|---|
| cloudflare/agentic-inbox | 約 7k Stars | Cloudflare 官方的完整網頁信箱範例,支援收發、搜尋、對話串、附件和 AI 草擬回覆 | 使用 Email Routing、Durable Objects、R2、Workers AI 和 Email Sending。正式環境必須設定 Cloudflare Access,所有通過同一項 Access 原則的使用者都能存取全部信箱 |
| dreamhunter2333/cloudflare_temp_email | 約 11.5k Stars | 功能較完整的臨時信箱,支援多網域、附件、轉寄、API、管理後台和多種寄信方式 | 定位仍是臨時信箱。SMTP、IMAP 代理需要額外執行 Python 服務,並非所有功能都只依賴 Cloudflare |
| oiov/vmail | 約 1.5k Stars | 較輕量的臨時信箱,支援多網域、D1 儲存、REST API 和郵件寄送 | 適合驗證碼收件匣或開發工具。寄信需另外選用 Cloudflare Email、Resend 或 MailChannels |
| G4brym/email-explorer | 約 150 Stars | 適合日常使用的自架網頁信箱,支援使用者與信箱管理、收發、搜尋和附件 | 社群規模較小,需要自行維護身分驗證、資料備份、資源用量和版本升級 |
Saavo 專案該怎麼選?
一般產品如果只需要接收客服來信,使用 Email Routing 轉寄就足夠,系統郵件繼續透過 Resend 寄送。確實需要獨立網頁信箱時,可以將 Agentic Inbox 或 Email Explorer 當成獨立專案部署,不要直接放進 Saavo 的主 Worker。臨時信箱專案較適合開發工具、驗證碼測試或郵件 API 產品,不適合儲存正式客服往來郵件。
選擇郵件寄送服務
收信和寄信是兩組不同的設定。Email Routing 處理其他人寄給 support@webpagetopdf.dev 的郵件,寄信服務則讓 Saavo 主動寄送註冊驗證、密碼重設和帳號安全通知。
Saavo 目前支援 Resend 和 Cloudflare Email Sending,兩種方式共用同一組業務程式碼,但部署條件不同:
| 寄送方式 | 專案設定 | 部署前需要準備 | 適合的使用者 |
|---|---|---|---|
| Resend | emailProvider.type: 'resend' | 驗證寄件網域,建立 RESEND_API_KEY | Saavo 的預設方案,適合希望設定簡單、使用獨立郵件平台的人 |
| Cloudflare Email | emailProvider.type: 'cloudflare' | 啟用 Workers Paid,將寄件網域加入 Email Sending,並設定 EMAIL 繫結 | 已使用 Workers Paid,希望也在 Cloudflare 管理郵件的人 |
Cloudflare Email Sending 目前仍為 Beta
Email Routing 可在 Workers Free 和 Paid 方案使用,但透過 Email Sending 寄信給任意使用者,需要 Workers Paid。服務配額和價格可能持續調整,決定使用前,請查看 Cloudflare 的最新價格,以及目前帳戶頁面顯示的額度。
使用 Resend
Resend 是範本的預設選擇。如果沒有明確理由改用 Cloudflare,保留以下設定即可:
emailProvider: {
type: 'resend',
},建議使用獨立子網域,例如 mail.webpagetopdf.dev,寄件者地址可設為 send@mail.webpagetopdf.dev。首次部署時,deploy:init 會要求填入 RESEND_API_KEY。網域驗證、API Key 和 Saavo 設定的完整操作,請參閱設定 Resend。
使用 Cloudflare Email Sending
Cloudflare Email Sending 不需要 RESEND_API_KEY,但必須先啟用 Workers Paid,並將準備使用的寄件網域加入 Email Service。以下以截圖中的 email.webpagetopdf.dev 為例。
開啟 Email Sending
登入 Cloudflare Dashboard,進入 Compute → Email Service → Email Sending。

頁面右側會顯示目前計費週期的用量和寄送額度。按下右上角的 Onboard Domain,開始新增寄件網域。
選擇寄件網域
Zone 選擇 webpagetopdf.dev。建議另外使用專門寄信的子網域,例如 email.webpagetopdf.dev。如果不填 Subdomain,就會使用根網域寄信。

後續的寄件者地址必須屬於這裡新增的網域。截圖使用 email.webpagetopdf.dev,因此 Saavo 的寄件者可設為 send@email.webpagetopdf.dev,不能繼續使用其他寄件網域的地址。
確認後按下 Continue。
核對並新增 DNS 記錄
Cloudflare 會列出準備新增的 MX 和 TXT 記錄,分別用於退信處理、SPF、DKIM 和 DMARC。這些記錄通常位於 cf-bounce、_domainkey 和 _dmarc 等專用名稱下。

不要照抄教學截圖中的記錄值。確認頁面沒有要求刪除仍在使用的衝突記錄後,按下 Activate,讓 Cloudflare 自動寫入目前網域需要的內容。
等待寄件網域生效
回到 Email Sending 清單,等待網域狀態顯示 Enabled,DNS records 顯示 Configured。Cloudflare 說明,使用其 DNS 時通常幾分鐘內就能完成,少數情況可能需要更久。
網域尚未啟用時,不要急著部署正式環境。即使 Worker 已有 EMAIL 繫結,也會因寄件網域尚未獲准而寄送失敗。
修改 Saavo 的郵件設定
將郵件服務提供者改成 Cloudflare:
emailProvider: {
type: 'cloudflare',
},再將寄件者改成剛才啟用的寄件網域。supportEmail 是使用者回覆郵件時使用的地址,可以繼續使用已設定好收信功能的 support@webpagetopdf.dev。
fromEmailAddress: {
name: 'Webpage to PDF',
email: 'send@email.webpagetopdf.dev',
},
supportEmail: 'support@webpagetopdf.dev',設定 EMAIL 繫結並部署
如果尚未首次部署,直接執行 npm run deploy:init。部署指令碼會讀取 emailProvider.type 和寄件者地址,在 wrangler.jsonc 產生限制寄件者的 send_email 繫結,不會再詢問 RESEND_API_KEY。
如果專案已完成首次部署,之後才從 Resend 改用 Cloudflare,需先檢查 wrangler.jsonc。若目前沒有 EMAIL 繫結,請手動加入:
"send_email": [
{
"name": "EMAIL",
"allowed_sender_addresses": [
"send@email.webpagetopdf.dev"
]
}
],send_email 是 wrangler.jsonc 的頂層設定,不要寫成通用的 bindings: [{ type: 'email' }]。allowed_sender_addresses 也必須與 config/base.ts 的 fromEmailAddress.email 完全一致。
設定後執行:
npm run doctor
npm run deploy:update實際寄出一封測試郵件
在正式環境觸發一次註冊驗證或密碼重設,確認外部信箱能收到郵件,並檢查寄件者、Reply-To 和郵件內容是否正確。如果沒有收到,先查看垃圾郵件,再到 Cloudflare Email Sending 的記錄和 Suppressions 檢查寄送結果。
只看到網域狀態為 Enabled,不能證明 Saavo 已設定正確。寄件網域、fromEmailAddress、EMAIL 繫結和實際部署版本必須一致。
Cloudflare 目前支援透過 Workers Binding、REST API 和 SMTP 使用 Email Sending。Saavo 使用 Workers Binding,詳細規則請參閱 Cloudflare 的寄送郵件和設定寄送繫結說明。
為 R2 綁定檔案網域
Saavo 的一般上傳透過 Worker 的 MAIN_R2 繫結存取 Bucket,即使未設定檔案網域,也能透過 /uploaded/... 讀取檔案。只有業務明確需要回傳獨立的公開檔案網址時,才需要綁定 R2 Custom Domain。
以下以 files.webpagetopdf.dev 為例:
- 在 Cloudflare Dashboard 開啟 Storage & databases → R2 object storage。
- 選擇
deploy:init為目前專案建立的 Bucket。 - 開啟 Settings,找到 Custom Domains。
- 按下 Add 或 Connect Domain,填入
files.webpagetopdf.dev。 - 檢查 Cloudflare 準備新增的 DNS 記錄,確認後連接。
- 等待狀態從 Initializing 變成 Active。
- 上傳一個可公開的測試檔案,透過新網域存取它。
R2 Bucket 和網域 Zone 必須位於同一個 Cloudflare 帳戶。不要手動建立指向 r2.dev 的 CNAME,Cloudflare 明確不支援用這種方式將正式網域連接到 R2。完整限制請參閱 R2 Public buckets。
確認可以透過網域存取物件後,再修改 Saavo 設定:
upload: {
// ...
storage: {
// ...
r2: {
publicBaseUrl: 'https://files.webpagetopdf.dev',
},
},
},接著執行:
npm run deploy:updatepublicBaseUrl 只會影響永久儲存且需要絕對網址的 R2 上傳結果。預設回傳相對網址的頭像、客服案件圖片和通知配圖,仍然使用 /uploaded/...,有有效期限的檔案也必須經過 Worker。如果應用程式不需要產生 R2 公開網址,就保留 false。
這項設定不會關閉 Cloudflare 上已啟用的公開存取。如果要讓 Bucket 停止公開,還需在 R2 設定中關閉 r2.dev 網址,並移除已綁定的自訂網域。
綁定 R2 網域會公開物件
Custom Domain 適合公開圖片、下載檔案和其他允許匿名存取的內容。不要為了設定方便,就將私人檔案放在公開網域下。這類檔案應繼續透過需要驗證權限的 API,或短期有效的簽章連結存取。
買好網域不代表設定已完成。網站、郵件接收、郵件寄送和檔案存取都分別驗證通過後,這個網域才算真正與專案整合完成。



