2023年2月16日

FB 社團如何篩選貼文通知﹍操作 Google Apps Script 定時過濾 Gmail 郵件

FB 社團如何篩選貼文通知﹍操作 Google Apps Script 定時過濾 Gmail 郵件

Wayne Fu 0 A+
相信每個人加入的 FB 社團都很多,但不見得每篇新貼文都有興趣看,主要也是時間不夠。如果能篩選出有興趣的貼文才收到通知,就能節省相當多時間。 如果是 FB 社團管理員,官方提供了「關鍵字提醒」的功能,但一般社員無法享受這個福利。 以下的「基本作法」是一種常見思路:
  • 參照「訂閱FB社團通知郵件」→「二、Facebook 設定」,可將 FB 社團所有新貼文寄到 Gmail
  • 在 Gmail 設定關鍵字篩選
這個流程對於多數情況已經很夠用了,能夠接受的話可以不用看本篇的作法。而本篇的 Google Apps Script(以下簡稱 GAS) 解決方案,主要能改善以下幾點:
  • Gmail 篩選器如果關鍵字只設定「一個中文字」時,會漏掉許多郵件,代表篩選器的關鍵字必須為設定「兩個中文字」以上,形成一個詞彙,才能精確篩選。
  • 如果 Chrome 有安裝「Gmail 檢查新信」這類套件,FB 社團新郵件通知可能還是很頻繁,會打擾工作頻率。
  • 使用 GAS 可定時檢查 Gmail,每隔一段時間才統整相關郵件,並寄發通知,讓我們在指定時間才接收 FB 社團新貼文。
(圖片出處: unsplash.com)

一、原理說明

1. 操作流程 接續「基本作法」的流程:
  • 在 Gmail 篩選器,針對 FB 社團寄來的新貼文郵件,「標上星號」,並「標示為已讀取」,如此 Chrome 套件就不會頻繁通知有新郵件
  • 在 GAS 寫程式,讀取所有「標上星號」郵件的內容,與自行設定「關鍵字」進行比對
  • 所有符合的郵件整合成一封郵件,寄到指定 Gmail 信箱
  • 將所有處理過的郵件移除星號
  • 依照需求設定排程,例如每 n 小時執行一次程式,或是每天指定時刻執行,如此只有固定時刻會收到篩選後的郵件內容
2. GAS 說明文件 過去在「使用 Gmail API 寄信的簡易管道」曾經說明,操作 Gmail API 是非常難搞的一件事,最方便的處理管道還是交給 GAS,因為 GAS 提供了一個 GmailApp 服務,可以用最無腦的方式寄送 Gmail 郵件。 以下提供操作 GmailApp 需要瞭解的官方文件: 根據官方文件,使用 GmailApp 的額度一天可寄 100 封郵件,可讀取 20000 封郵件,每封郵件內容最多 200KB。

二、範例程式碼

以下為 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 相關文章:
0 0
如這篇文章對你有幫助,歡迎「分享」到 FB、「追蹤」粉絲團、「訂閱」最新文章

沒有留言:

張貼留言注意事項:

◎ 勾選「通知我」可收到後續回覆的mail!
◎ 請在相關文章留言,與文章無關的主題可至「Blogger 社團」提問。
◎ 請避免使用 Safari 瀏覽器,否則無法登入 Google 帳號留言(只能匿名留言)!
◎ 提問若無法提供足夠的資訊供判斷,可能會被無視。建議先參考這篇「Blogger 提問技巧及注意事項」。
◎ CSS 相關問題非免費諮詢,建議使用「Chrome 開發人員工具」尋找答案。
◎ 手機版相關問題請參考「Blogger 行動版範本的特質」→「三、行動版範本不一定能執行網頁版工具」;或參考「Blogger 行動版範本修改技巧 」,或本站 Blogger 行動版標籤相關文章。
◎ 非官方範本問題、或貴站為商業網站,請參考「Blogger 免費諮詢 + 付費諮詢
◎ 若是使用官方 RWD 範本,請參考「Blogger 推出全新自適應 RWD 官方範本及佈景主題」→ 不建議對範本進行修改!
◎ 若留言要輸入語法,"<"、">"這兩個符號請用其他符號代替,否則語法會消失!
◎ 為了過濾垃圾留言,所有留言不會即時發佈,請稍待片刻。
◎ 本站「已關閉自刪留言功能」。

TOP