GAS Gmail 郵件自動化處理

在 GAS 中,你有兩個主要的郵件服務:MailApp(僅限寄信)與 GmailApp(功能完整,可讀取、標籤、搜尋郵件)。

基礎發信 (Simple Email)

如果你只需要簡單的通知功能,MailApp 是最輕量化的選擇。

/**
 * 寄送簡單的文字通知
 */
function sendSimpleEmail() {
  MailApp.sendEmail({
    to: "user@example.com",
    subject: "系統自動通知",
    body: "這是一封來自 Google Apps Script 的自動化測試郵件。"
  });
}

MailApp 函數語法說明

  • MailApp.sendEmail(options)
    • to:收件者 Email。
    • subject:主旨。
    • body:純文字內文。
    • htmlBody:(選填) HTML 格式內文。
    • attachments:(選填) 附件物件陣列。

處理郵件執行緒 (Threads & Messages)

Gmail 是以「執行緒」(Thread) 為單位組織郵件的。

/**
 * 搜尋帶有「急件」標籤的郵件並標記為已讀
 */
function processUrgentEmails() {
  // 就像在 Gmail 搜尋框輸入一樣
  const threads = GmailApp.search("label:急件 is:unread");
  
  threads.forEach(thread => {
    console.log(`處理討論串: ${thread.getFirstMessageSubject()}`);
    thread.markRead(); // 標記為已讀
    thread.addLabel(GmailApp.getUserLabelByName("已處理"));
  });
}

GmailApp 核心函數語法說明

  • GmailApp.search(query, start, max):搜尋郵件,回傳 GmailThread 陣列。
  • thread.markRead() / thread.markUnread():切換已讀狀態。
  • thread.addLabel(labelObject):為整個執行緒加上標籤。
  • thread.getMessages():取得該執行緒中所有的個別郵件物件 (GmailMessage)。

自動儲存郵件附件

這在處理發票或報價單自動化時非常有用。

/**
 * 監控 Gmail,將特定標題郵件的附件存入雲端硬碟
 */
function saveAttachmentsToDrive() {
  const threads = GmailApp.search("subject:'報價單'");
  const folder = DriveApp.getFolderById("YOUR_FOLDER_ID");

  threads.forEach(thread => {
    const messages = thread.getMessages();
    messages.forEach(message => {
      const attachments = message.getAttachments();
      attachments.forEach(attachment => {
        folder.createFile(attachment);
        console.log(`附件已存檔: ${attachment.getName()}`);
      });
    });
  });
}

附件處理相關函數語法說明

  • message.getAttachments():取得單封郵件中的所有附件檔。
  • attachment.getName():取得附件原始檔名。
  • attachment.getContentType():取得 MIME 類型 (如 application/pdf)。
  • folder.createFile(blob):直接傳入附件物件即可將其存入 Drive。

標籤管理 (Labels)

/**
 * 自動建立新的標籤
 */
function manageLabels() {
  let label = GmailApp.getUserLabelByName("自動備份");
  
  if (!label) {
    label = GmailApp.createLabel("自動備份");
  }
}

標籤函數語法說明

  • GmailApp.getUserLabelByName(name):取得現有標籤,若不存在回傳 null
  • GmailApp.createLabel(name):建立新標籤。
  • GmailApp.deleteLabel(label):刪除標籤。