相信每個人加入的 FB 社團都很多,但不見得每篇新貼文都有興趣看,主要也是時間不夠。如果能篩選出有興趣的貼文才收到通知,就能節省相當多時間。 如果是 FB 社團管理員,官方提供了「關鍵字提醒」的功能,但一般社員無法享受這個福利。 以下的「基本作法」是一種常見思路:
- 參照「訂閱FB社團通知郵件」→「二、Facebook 設定」,可將 FB 社團所有新貼文寄到 Gmail
- 在 Gmail 設定關鍵字篩選
- Gmail 篩選器如果關鍵字只設定「一個中文字」時,會漏掉許多郵件,代表篩選器的關鍵字必須為設定「兩個中文字」以上,形成一個詞彙,才能精確篩選。
- 如果 Chrome 有安裝「Gmail 檢查新信」這類套件,FB 社團新郵件通知可能還是很頻繁,會打擾工作頻率。
- 使用 GAS 可定時檢查 Gmail,每隔一段時間才統整相關郵件,並寄發通知,讓我們在指定時間才接收 FB 社團新貼文。
一、原理說明
1. 操作流程接續「基本作法」的流程:- 在 Gmail 篩選器,針對 FB 社團寄來的新貼文郵件,「標上星號」,並「標示為已讀取」,如此 Chrome 套件就不會頻繁通知有新郵件
- 在 GAS 寫程式,讀取所有「標上星號」郵件的內容,與自行設定「關鍵字」進行比對
- 所有符合的郵件整合成一封郵件,寄到指定 Gmail 信箱
- 將所有處理過的郵件移除星號
- 依照需求設定排程,例如每 n 小時執行一次程式,或是每天指定時刻執行,如此只有固定時刻會收到篩選後的郵件內容
- 操作說明:Gmail Service
- 搜尋參數:可搭配 Gmail 使用的搜尋運算子
- 使用額度:Google 服務的配額
二、範例程式碼
以下為 GAS 範例程式碼,修改參數請參考註解說明:function filterEmail() { var receiver = "xxx@gmail.com", // 收件者郵件 subject = "FB 社團篩選郵件", // 郵件標題 keyword = ["關鍵字1", "關鍵字2"], // 所有要篩選的字串 from = "facebookmail.com", // 寄件者網域 query = "is:starred from:(" + from + ")", // 搜尋參數 篩選標記星號、從 FB 寄來的郵件 quota = 200000, // 郵件大小上限 200k threads = GmailApp.search(query), // 搜尋符合條件的郵件 l = threads.length, // 郵件數量 html = "", // 寄出的郵件 html 內容 i = 0, serial = 0, newHtml, thread; // 沒有郵件則不處理 if (!l) { return; } for (i; i < l; i++) { thread = threads[i]; // 篩選郵件 html 內容 newHtml = getHtml(thread); // 內容超過郵件大小上限時 分批寄出信件 if ((html + newHtml).length > quota) { serial++; sendMail(html, serial); html = newHtml; } else { // 沒超過時 多封郵件內容整合為一封 html += newHtml; } // 郵件移除星號 GmailApp.unstarMessages(thread.getMessages()); } // 寄出整合後的郵件 if (html) { serial++; sendMail(html, serial); } // 取得郵件 html 內容 function getHtml(thread) { var message = thread.getMessages()[0], from = message.getFrom(), // 寄件者 subject = message.getSubject(), // 郵件主旨 body = message.getBody(), // 郵件 html 內容 plainBody = message.getPlainBody(), // 郵件純文字內容 html = "", i; // 篩選關鍵字 for (i in keyword) { // 內容可根據自己需求 選擇使用 body 或 plainBody 來產生 if (body.indexOf(keyword[i]) > -1) { html += "寄件者:" + from + "<br/>"; html += "主旨:" + subject + "<br/>"; html += "內容:" + body + "<br/><br/><br/>"; return html; } } return html; } // 寄出郵件 function sendMail(html, serial) { var date = Utilities.formatDate(new Date(), "GMT+8", "yyyy-MM-dd HH:mm"), // 日期格式化 subject_date = subject + "" + date + "-" + serial; // 組合信件標題 加上日期及序號 // 寄信 MailApp.sendEmail({ to: receiver, subject: subject_date, htmlBody: html }); } }
三、補充說明
1. 授權第一次執行 GAS 程式碼時,因為取得 Gmail 郵件需要權限,請參考「製作可執行 GAS 指令碼的圖片按鈕」→「三、撰寫 Apps Script 指令碼」的流程進行授權。 2. 排程執行程式碼 GAS 設定排程自動執行的操作,可參考「排程抓證交所台股交易資料」→「五、設定排程」。更多 Google Apps Script 相關文章: