Computer >> Hướng Dẫn Máy Tính >  >> Phần Mềm >> Thư Điện Tử

Xây dựng danh sách đăng ký email serverless với Go trên AWS

Bài viết chia sẻ cách tôi xây dựng quy trình đăng ký subscription với xác thực email không "kém chất lượng". Bạn cũng làm được.

Muốn xem thực tế? Đăng ký email list của tôi tại victoria.dev.

Bây giờ tôi sẽ chỉ cách xây dựng.

Giới thiệu Simple Subscribe

Nếu quan tâm quản lý mailing list/bản tin riêng, bạn có thể thiết lập Simple Subscribe trên tài nguyên AWS riêng để thu thập email.

API open source này viết bằng Go, chạy trên AWS Lambda. Khách truy cập web đăng ký vào list, lưu trong bảng DynamoDB, sẵn sàng query hoặc export bất cứ lúc nào.

Khi ai đó đăng ký, họ nhận email yêu cầu xác nhận subscription. Đôi khi gọi là "double opt-in", tôi thích术语 "verified".

Simple Subscribe chạy trên serverless infrastructure, dùng AWS Lambda xử lý subscription, confirmation, unsubscribe.

Tìm dự án Simple Subscribe với code hoàn toàn open-source trên GitHub. Khuyến khích pull code và theo dõi!

Bài viết chia sẻ từng bước build, tư duy sau single-responsibility functions của API, và security considerations cho dự án AWS như này.

Xây dựng verified subscription flow

Quy trình đăng ký email không verified đơn giản: người dùng điền email vào form, email vào database.

Tuy nhiên, nếu tôi đã dạy bạn gì về không tin user input, ý tưởng non-verified sign up nên khiến bạn cảnh giác. Spam ngon khi chiên sandwich, nhưng không vui khi làm tăng AWS bill.

Có thể dùng CAPTCHA hoặc puzzle cho verification is-it-a-human, nhưng tạo ma sát đủ lớn làm bỏng potential subscribers.

Thay vào đó, confirmation email giúp đảm bảo cả tính đúng đắn của địa chỉ và sự tỉnh táo của user.

Để xây subscription flow với email confirmation, tạo single-responsibility functions thỏa mãn mỗi logical step:

  1. Chấp nhận email address và ghi nhận.
  2. Generate token liên kết với email đó và ghi nhận.
  3. Gửi confirmation email đến địa chỉ đó với token.
  4. Chấp nhận verification request có cả email address và token.

Để đạt mỗi mục tiêu, Simple Subscribe dùng official AWS SDK for Go tương tác với DynamoDB và SES.

Tại mỗi giai đoạn, xem data trông như thế nào và cách lưu trữ. Điều này giúp xử lý các vấn đề như: "Sự việc gì nếu ai đó đăng ký 2 lần?" hoặc threat-modeling: "Sự việc gì nếu ai đó đăng ký với email họ không sở hữu?"

Sẵn sàng? Hãy phân tích từng bước xem phép màu diễn ra như thế nào.

Đăng ký (Subscribing)

Quy trình bắt đầu với web form đơn giản, như trên trang chủ của tôi. Form input với attributes type="email" required giúp validation nhờ browser. Khi submit, form gửi GET request đến Simple Subscribe subscription endpoint.

Simple Subscribe nhận GET request với query string chứa email của subscriber. Nó generate giá trị id và thêm cả email và id vào bảng DynamoDB.

Table item trông như:

emailconfirmidtimestamp
subscriber@example.comfalseuuid-xxxxx2020-11-01 00:27:39

Cột confirm (boolean) cho thấy item là subscription request chưa confirmed. Để verify email trong database, cần tìm item đúng và đổi confirm thành true.

Khi làm việc với data, cân nhắc mục tiêu mỗi thao tác và cách so sánh incoming request với existing data.

Ví dụ, nếu ai đó đăng ký lại cùng email, bạn xử lý thế nào?

Bạn có thể nói: "Tạo line item mới với id mới." Tuy nhiên, có thể không phải strategy tốt nhất khi serverless app database tính tiền theo request volume.

Vì DynamoDB Pricing phụ thuộc vào lượng data read/write, có lợi tránh pile excess data.

Với suy nghĩ đó, khôn ngoan xử lý duplicate subscription request bằng update thay vì thêm line mới.

Simple Subscribe thực sự dùng cùng function để add hoặc update database item. Thường gọi là "update or insert" (upsert).

Trong database như SQLite dùng UPSERT syntax. Với DynamoDB, dùng update operation. Với Go SDK, syntax là UpdateItem.

Khi nhận duplicate subscription request, database item matched trên email only. Nếu tìm thấy existing line item, id và timestamp bị override, update existing record và tránh flooding table với duplicate requests.

Xác thực địa chỉ email

Sau khi submit form, intended subscriber nhận email từ SES chứa link. Link xây dựng từ email và id từ table, format:

<BASE_URL><VERIFY_PATH>/?email=subscriber@example.com&id=uuid-xxxxx 

Trong setup này, id là UUID đóng vai secret token. Cung cấp identifier match đủ phức tạp và khó đoán. Cách này ngăn chặn đăng ký với email không kiểm soát.

Truy cập link gửi request đến verification endpoint với email và id trong query string.

Lần này, quan trọng so sánh cả email và id incoming với database record. Điều này verify rằng recipient của confirmation email là người initiate request.

Verification endpoint đảm bảo giá trị match item trong database, thực hiện update operation set confirm thành true, update timestamp. Item trông như:

emailconfirmidtimestamp
subscriber@example.comtrueuuid-xxxxx2020-11-01 00:37:39

Query cho emails

Bây giờ có thể query table để build email list. Tùy email sending solution, có thể làm manually, với Lambda khác, hoặc từ command line.

Vì data cho requested subscriptions (confirm = false) lưu cùng confirmed subscriptions, quan trọng phân biệt data khi query email để gửi. Chỉ return emails với confirm = true.

Cung cấp unsubscribe links

Giống verify email, Simple Subscribe dùng email và id làm arguments cho function xóa item từ DynamoDB để unsubscribe email.

Để cho phép người dùng tự remove khỏi list, cần cung cấp URL trong mỗi email gửi đi bao gồm email và id của họ làm query string đến unsubscribe endpoint. Format:

<BASE_URL><UNSUBSCRIBE_PATH>/?email=subscriber@example.com&id=uuid-xxxxx 

Khi link clicked, query string truyền đến unsubscribe endpoint. Nếu email và id khớp database item, item bị xóa.

Cung cấp phương pháp tự động remove khỏi list không cần can thiệp con người, là một phần của triết lý đạo đức và tôn trọng xử lý data được委托.

Chăm sóc data của bạn

Khi quyết định chấp nhận data người khác, trách nhiệm chăm sóc nó. Áp dụng cho mọi thứ bạn xây. Với Simple Subscribe, nghĩa là bảo mật database, và định kỳ prune table.

Để tránh retain email addresses với confirm = false quá lâu, tốt nhất thiết lập cleaning function chạy định kỳ. Có thể manual, với AWS Lambda function, hoặc command line.

Để clean up, tìm database items với confirm = false và timestamp cũ hơn thời điểm cụ thể. Tần suất clean up tùy use case và request volumes.

Cũng tùy use case, có thể muốn backup data. Nếu đặc biệt quan tâm data integrity, khám phá On-Demand Backup hoặc Point-in-Time Recovery cho DynamoDB.

Xây dựng subscriber base độc lập

Xây subscriber list riêng có thể là nỗ lực empowering! Dù định bắt đầu bản tin, gửi thông báo content mới, hay tạo community quanh công việc, không gì cá nhân và trực tiếp hơn email từ tôi đến bạn.

Khuyến khích bạn bắt đầu xây subscriber base với Simple Subscribe hôm nay. Giống hầu hết công việc của tôi, nó open source và free cho personal use. Đi sâu code tại GitHub repository hoặc tìm hiểu thêm tại SimpleSubscribe.org.

Nếu thích bài viết, cho tôi biết. Tham gia hàng nghìn người học cùng tôi tại victoria.dev. Ghé thăm hoặc subscribe qua RSS cho thêm projects như này.