多數人對 Gmail 的印象停在「搜尋、歸檔、寄信」,但同一套工具其實能變成你的流程引擎。關鍵就在 Gmail service:一個把人手操作翻成程式邏輯的入口。
本文會先用白話把三個工具拆開:GmailApp=快速自動化的萬用扳手、Advanced Gmail service=API 等級的細緻控制、MailApp=單純寄信的輕量路線。
然後用情境帶著走:財務發票、客服分流、招募郵件追蹤、專案異常通知——每個例子都配上查詢語法、標籤策略與寄信草稿。最後再把安全與治理補齊:最小權限、配額與速率限制、日誌與審計。
你會發現,管理郵件其實不是更用力,而是更有章法。希望本篇文章能夠幫助到需要的您。
目錄
{tocify} $title={目錄}
Gmail service 是什麼?
在 Google Apps Script(GAS)裡,「Gmail service」通常指兩條路:
內建 Gmail 服務:
GmailApp —— 走捷徑,語法簡單、上手快,能做 80% 常見事(發信、找信、標籤、讀取郵件、建立草稿…)。
進階 Gmail 服務:
Gmail(Advanced Service,包 Gmail API)能力最完整,等於在 Apps Script 內直接用 Gmail API,可取到更細的欄位、更多端點,但要先在專案啟用,寫法偏 API 風格。
兩者都在 Apps Script 執行,差別在「抽象層級」:GmailApp 比較像幫你包好的工具箱;Advanced Service 則是原生 API 的全餐,功能細、權限敏感度也更高。
快速判斷:
只想快速發信/撈信/貼標籤 → 用 GmailApp。
需要精細控制(例如存取原始 MIME、history API、分頁遊標、完整回覆鏈細節)→ 用 Advanced Service(Gmail API)。
和我們平常用的 Gmail(網頁/手機 App)有什麼不同?
一般 Gmail(介面) 是人用的:
你登入、搜尋、勾選、套用標籤、手動整理。
Gmail service(Apps Script) 是程式用的:
它讓你的腳本以「你的身分」自動化那一切,比如每晚 2 點掃描收件匣,把發票自動轉寄+歸檔、或把特定寄件者的附件存到雲端硬碟。權限來自你對腳本的授權。
另外還有 MailApp:只負責「寄信」,不需要你的帳戶一定啟用 Gmail,但功能比 GmailApp 少;Google 曾明確說過兩者都能寄信,不同在是否依賴 Gmail 帳戶與功能廣度。
什麼時候用哪一個?
| 情境 | 建議工具 | 為什麼 |
|---|---|---|
| 寄出通知信、簡單寄送 HTML 內容 |
GmailApp.sendEmail 或
MailApp.sendEmail
|
GmailApp 好讀、帶附件/HTML 方便;若環境沒有
Gmail,就用 MailApp。
|
| 大量讀取郵件細節、操作 history、拿原始 MIME | Advanced Gmail service(Gmail API) | API 欄位完整、可做更進階的同步與過濾。 |
| 批次標籤、封存、搜尋 threads | GmailApp |
常見工作流 80% 夠用,語法短。 |
| 需要確切掌握 API 使用額度、處理 rate limit | Gmail API | 有明確「配額單位」與超限錯誤碼可處理。 |
權限與配額:先把「紅線」畫清楚
權限(Scopes)
Apps Script 由你授權所需範圍(scope)。像 Gmail 常見的 https://www.googleapis.com/auth/gmail.modify 或極寬鬆的 https://mail.google.com。做附加元件時,建議只申請「用得到的最小集合」,避免拿整箱權限。
寄信與操作配額(Quotas)
Apps Script 層面有「每天可寄信的收件者數」等限制(個人帳/Workspace 帳不同),另外也有讀寫 Gmail 的上限。
Gmail API 本身也有「每專案/每使用者每分鐘的配額單位」限制(超限會拋 rateLimitExceeded 或 userRateLimitExceeded)。
Google Workspace 的寄信限制(例如每天 2,000 封、外部收件人 3,000 位等)另有官方頁面,與你用不用 Apps Script 無關,屬於帳戶級防濫用規則。
GAS 的 Gmail service(指 GmailApp 內建服務)底下的核心 class
GmailApp:
入口服務。你所有對 Gmail 的操作都由它發起:搜尋、貼標、封存、寄信、建立草稿、抓別名(alias)… 等。可以想像成「遙控器」。
GmailThread:
郵件「對話串」。包含多封來回的信(messages),可以對整串加標籤、封存、設為已讀/未讀、移垃圾桶… 等。工作流常用它來做批次操作。
GmailMessage:
單一郵件。能讀主旨、寄件人、日期、本文、擷取附件、回覆、轉寄… 精細到單封信的層級。
GmailLabel:
使用者自訂標籤。可建立、刪除、掛/拆某標籤,並把標籤套在 thread 上(注意:標籤是貼在 thread,不是只貼某一封)。
GmailDraft:
草稿。可以抓取、送出、刪除,或把草稿轉成 GmailMessage 物件繼續處理。適合大量寄信前先「人工複核」。
GmailAttachment:
附件。其本質是個 Blob,但多了較快的 getSize() 等便利方法;通常從 GmailMessage.getAttachments() 取到。
關係圖:
GmailApp(遙控器)→ 搜尋到 GmailThread[] → 展開拿 GmailMessage[] → 每封抓 GmailAttachment[];過程中用 GmailLabel 管理分類,用 GmailDraft 安全寄出。
各類別重點&什麼時候用
GmailApp(入口與總管)
重要性:
所有流程的起點;同時也負責「寄信/建草稿/搜尋」這些高頻動作。
常見功能:
search(query, start, max):用 Gmail 查詢語法抓 thread 清單。
sendEmail(...) / createDraft(...):寄出或先建草稿(支援 HTML、附件、cc/bcc、from alias)。
getAliases():取得可用寄件別名(付費帳可從 alias 寄出)。
什麼時候用:你要「找一批信」、「快速寄一封」、「先做草稿」的時候。
GmailThread(對話串)
重要性:做「批次整理」的主戰場。
常見功能:
addLabel(label)、removeLabel(label)、moveToArchive()、moveToTrash()。
markRead() / markUnread();getMessages() 展開取單封。
什麼時候用:你只在意「這一整串」:例如所有發票串都加 invoices/2025 並封存。
GmailMessage(單封郵件)
重要性:需要讀內容、抓附件、回覆/轉寄時一定會到這層。
常見功能:
getSubject()、getFrom()、getDate()、getPlainBody()/getBody()。
getAttachments()(拿 GmailAttachment[])、reply()、forward()。
什麼時候用:做精細判斷或抽資料(例如從本文抓訂單號、把附件存雲端)。
GmailLabel(標籤)
重要性:你的分類系統;自動化的「資料夾」。
常見功能:
GmailApp.createLabel(name) 建新標籤;getUserLabelByName(name) 取得已存在的標籤;
對 thread 執行 addLabel / removeLabel。
什麼時候用:定期整理、建儀表板前打標、或做「流程階段」標記(ex. support/new → support/replied)。
GmailDraft(草稿)
重要性:大量寄送的保險絲。
常見功能:
send() 直接送出;getMessage() 拿到該草稿對應的 GmailMessage;deleteDraft()。
什麼時候用:群發前需要人工檢閱版型、收件者或附件;或用草稿當範本複製。
GmailAttachment(附件)
重要性:報表、發票、收據、履歷的自動化關鍵點。
常見功能:
作為 Blob 使用(可 copyBlob()、丟給 DriveApp.createFile());getSize() 省配額、效率好。
什麼時候用:把附件丟進指定雲端資料夾、後續 OCR/解析。
常見組合拳(把 class 串起來)
搜尋 → 打標 → 封存:GmailApp.search() → thread.addLabel() → thread.moveToArchive()(Thread 層做批次最快)。
展開處理附件:thread.getMessages() → message.getAttachments() → 存 Drive(Attachment 是 Blob)。
安全寄送:createDraft() 先建草稿 → 人工確認 → draft.send()。
和 Advanced Gmail service 的分工
你看到的這些 class 都屬於 內建 Gmail service(GmailApp) 的物件模型。若你需要更細資料(原始 MIME、history 變更、pageToken 分頁…),就要啟用 Advanced Gmail service,在 Apps Script 內直接呼叫 Gmail API。
快速實作:從 0 到自動化
搜尋郵件並批次貼標籤+封存
function labelAndArchiveInvoices() {
const LABEL = 'invoices/2025';
const query = 'from:service@vendor.com subject:invoice newer_than:1y';
const label = GmailApp.getUserLabelByName(LABEL) || GmailApp.createLabel(LABEL);
const threads = GmailApp.search(query, 0, 100); // 最多先抓 100 條
threads.forEach(t => {
t.addLabel(label);
t.moveToArchive();
});
}
GmailApp.search(query, start, max) 支援 Gmail 查詢語法,對於常見自動整理已經很夠用。
自動把附件存到雲端硬碟
function saveAttachments() {
const folder = DriveApp.getFolderById('your-folder-id');
const threads = GmailApp.search('has:attachment filename:pdf newer_than:7d', 0, 50);
threads.forEach(thread => {
thread.getMessages().forEach(msg => {
msg.getAttachments({includeInlineImages: false}).forEach(file => {
folder.createFile(file.copyBlob()).setName(file.getName());
});
});
});
}
讀取郵件 → 取 message → 取附件,是 Thread → Message → Attachment 的層級關係。
寄出 HTML 通知信(含抄送、密件副本)
function notify() {
GmailApp.sendEmail(
'to@example.com',
'系統通知:資料已更新',
'純文字備用內容',
{
htmlBody: '更新完成,請至報表查看。
',
cc: 'pm@example.com',
bcc: 'audit@example.com',
name: '自動化通知'
}
);
}
GmailApp.sendEmail 支援 HTML 內容與多種選項;若只想建立草稿,用 GmailApp.createDraft(...)。
建立草稿並插入簽名或範本
function createDraftFromTemplate() {
const tmpl = HtmlService.createTemplateFromFile('tmpl_notification'); // 你的 HTML 檔
tmpl.title = '本月對帳';
const body = tmpl.evaluate().getContent();
GmailApp.createDraft('client@example.com', '【每月對帳】9 月份', '', {htmlBody: body});
}
建立草稿再人工微調,是避免誤寄大量郵件的好習慣。
真的差在哪?GmailApp vs. Advanced Gmail service vs. MailApp(重點對照)
| 面向 | GmailApp(內建) | Advanced Gmail service(Gmail API) | MailApp |
|---|---|---|---|
| 易用性 | ★★★★☆ | ★★☆☆☆(API 風格) | ★★★★☆(只寄信) |
| 功能廣度 | 一般自動化 80% 夠用 | 最完整(history、原始 MIME、細節欄位) | 只寄信 |
| 權限(Scopes) | 依常見 Gmail 權限 | 需申請 API 專屬 scope,建議最小化 | 通常權限較窄 |
| 是否需要 Gmail 帳戶 | 需要 | 需要 | 不一定需要 Gmail(官方說明) |
| 適用場景 | 搜尋/貼標/封存/快速寄信 | 需要精細控制與同步、整合外部系統 | 只有寄信、沒有 Gmail 的環境 |
| 代表性參考 | Docs: Gmail service | Docs: Advanced Gmail | 官方說明:兩者差異 |
