如何用 AWS 建一個 email 電子報服務

PTT 八卦版對我來說是又愛又恨的一個討論區。裡面總是有吃不完的瓜很吵架議題,實在很舒壓。但看下去又覺得很浪費時間,因為上面討論的事情大部分都離我很遠。裡面的言論也讓我感到相當的偏激,感覺對身心充滿危害。到底要怎麼取捨哪些文章要看,哪些文章不要看呢? 這個問題真的很難。

於是我開發了一個 PTT 八卦版熱門文章訂閱的功能。讓每天的八卦版十大熱門文章會跑到我的 email 信箱裡面。讓我省下很多時間瀏覽看板,尋找要看哪些文章的時間。可以淺嘗輒止又不會過度成癮。

https://ptt-gossiping-daily.lichi-chen.com/

靈感來源

參考 hacker news daily ,是每天都會發送的電子報。來源是 Hacknews 的內容。

前言

我們正在經歷史上進步速度最快的聊天機器人時期,也有以假亂真的 AI 產生各種內容雜訊,干擾我們在現實世界中的各類判斷。這是最好的時代,也是最壞的時代。

有個台大醫學系的學生 (神經元) 詢問他們班認真讀書的同學,請問一下他們的同學為什麼要這麼認真? 他的醫學系同學回他,因為我以後想要做很少的事賺很多的錢。那為了成為這個樣子我應該要選到一個好科別。要選一個好科,我需要好成績因為是用成績選科的。

講完這個大實話之後,令人瞬間無法接受。雖然講的是一個真理,但卻讓人更加迷茫。

名律師古美門曾說,任性,自我,狡猾,骯髒,醜陋,底層的渣渣,這才是我們人類。如果你真心希望追求一個人人都幸福的世界,方法只有一個,愛上醜陋。但,如何愛上醜陋?

我做了一個電子報的訂閱服務。每天會推送十篇 PTT 八卦版的熱門文章。 PTT 八卦版是一個台灣匿名論壇,裡面充滿混沌不堪的戾氣,只有在很少數的情況下會有不錯且有道理的深度文章。PTT 雖然介面老舊不利新手,且風氣日益衰退不見好轉,但目前仍是能代表一代人想法的地方。

每次台灣社會動盪不安的時候,上面總是有最新的討論。地震的時候或是各種災害發生時,也都是網友鄉民們彼此互助交換資訊的地方。就算是半夜兩點的地震,也能達到黃爆 (60000 人同時在線上)。我現在不擔心台灣的政治惡鬥會走向悲劇,這裡也不是第一天這麼混亂。曾經有一群人在太陽花學運的時候站出來。現在他們都已經成為社會上有影響力的一方,真有需要一定也都會再度站出來。

歡迎各位訂閱這個電子報或裡面的 RSS feed,來獲得每日配飯用的新聞。

技術架構

每天會定時會產生文章放到 S3 bucket 產生完成後觸發送信流程。

若用戶按下訂閱按鈕,則會先用 ReCaptcha 驗證是否為真人後,發送一封含有 JWT 的驗證信到信箱。JWT 的 secret key 存放在 secrets manager 。

SES Contact List API

如果使用者按下訂閱,就加到 SES contact list 裡面。這是一個 SES 提供的管理收件者清單的功能。

用起來感覺很原始且陽春。

  • 如果 User unsubscribe (opt-out) 某個 topic ,以後用這個 topic 作為 ListManagementOptions 發信就會發不出去。
  • 如果取消訂閱之後又加進去會失敗。Create 跟 Update 不能混用。加入前要先 Get 一下他是否已經在目前名單,如果已有就用 update ,如果沒有就 create 。
  • 刪除的話如果沒找到就會出錯。Create 如果發現此 email 已有也會出錯。感覺上好不 Restful 。

信箱內的 css 支援性不足

  • Yahoo 信箱不支援 height 。最後用 width ,然後 height 改成 auto 來控制。
  • Yahoo! Mail Android app 不支援 <style> in <head>,Gmail 不支援 <style> in <body> 。兩個公司支援的東西完全互斥,真奇怪。

最後直接從 head 複製一份 css 到 body 來解決 Yahoo Android client 的支援性問題。這就是為什麼信件中 raw HTML 會看 body 跟 head 都有一份一樣的 css 。下次我會使用一些像是 webpack 的套件直接變成 inline CSS 解這問題。

  • 陰影 box-shadow 也不支援。

Popover API

使用 Popover API 來更新成功寄出驗證信的訊息。.showPopover() 用來彈出通知。

可是有個缺點是想按掉的時候會不小心按到其他地方的連結就進去了。

Best practice

  • 用確認信來確信訂閱
  • 用 Chptcha 防機器人
  • 用 one-click unsubscribe 讓用戶取消防止 complaint
  • SPF, DKIM, DMARC 都要用
  • 用 SES VDM 來追蹤成效

廣告

如果剛好做的很大成長很快,比如說到有 10000 人訂閱的話,我擔心成本可能會無法負擔,所以到時候要賣廣告。

  • 連結 (https)
  • 圖片: 120×120 px
  • 文字: 40 全形字元

但目前看來人數都不多,應該是無謂的擔心。

歷史記錄

若想取得歷史上的日子,可以使用 /history/display-html-email/2024-07-14.html 的路徑存取。例如:

https://ptt-gossiping-daily.lichi-chen.com/history/display-html-email/2024-07-14.html

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *