Nếu bạn đã từng xem Yêu cầu nhận xét (RFC) xung quanh việc gửi và nhận email, bạn sẽ thấy các vấn đề kỹ thuật phức tạp liên quan khi nhấn gửi trong hộp thư đến email của bạn.
Rất may, nhiều công cụ hiện có cung cấp dịch vụ Giao thức truyền thư đơn giản (SMTP) cho các nhà phát triển của chúng tôi — từ máy chủ Postfix mà bạn quản lý đến dịch vụ gửi có thể mở rộng hoàn toàn như SendGrid, Amazon SES hoặc Postmark. Tuy nhiên, việc di chuyển giữa các nhà cung cấp vì lý do khả năng phân phối hoặc giá cả có nghĩa là phải viết lại hoặc tái cấu trúc ứng dụng của chúng tôi để đáp ứng các đặc thù của từng dịch vụ.
Rails giúp chúng tôi ở đây bằng cách cung cấp Hộp thư Hành động. Trong bài đăng này, chúng tôi sẽ đi sâu vào cách bạn có thể sử dụng Hộp thư hành động để tích hợp và khắc phục sự cố khi gửi email đến.
Nhưng trước tiên, hãy nhanh chóng xác định Hộp thư Hành động là gì.
Hộp thư hành động cho Rails là gì?
Hộp thư hành động sử dụng tính năng nén khái niệm để nhận email trong Ruby on Rails. Nén khái niệm có nghĩa là nó gói gọn tất cả những khác biệt nhỏ giữa mọi dịch vụ SMTP và ghi mã xử lý gửi đến của bạn chỉ một lần. Bạn thậm chí có thể viết nhà cung cấp cho một dịch vụ mới.
Khái niệm chính của ActionMailbox là định tuyến dựa trên người nhận email. Bằng cách thiết lập nhà cung cấp email gửi đến, thư đi tới một miền sẽ được chuyển vào ứng dụng của bạn. Bạn có thể xem địa chỉ người nhận để xác định cách xử lý từng thư.
Nếu bạn thực hiện thao tác của người soát vé đường ray để gửi email kiểm tra, như tôi đã làm ở đây:

Sau đó, email gửi đến của bạn sẽ có người nhận từ To , CC , BCC , và X-Original-To các trường.
Mỗi địa chỉ đều được kiểm tra để xác định nơi nó sẽ được định tuyến, nhưng thư chỉ được định tuyến một lần.
Một khía cạnh quan trọng của quá trình phát triển là kiểm tra email từ hệ thống của bạn. Rails có một tập hợp các trang phát triển theo các tuyến đường /rails/conductor/ cho phép bạn nhập email cục bộ vào thiết lập phát triển của mình.
Bạn có thể nhập email theo cách thủ công, như tôi đã làm trong ví dụ trên hoặc bạn có thể tải lên một email hoàn chỉnh với tất cả các tiêu đề.
Một cách tuyệt vời để có được một email hoàn chỉnh (có tiêu đề, nội dung thư và tệp đính kèm) là sử dụng ứng dụng email như Thunderbird. Lưu email riêng lẻ ở dạng .eml , mở tệp bằng trình soạn thảo văn bản và sao chép toàn bộ nội dung vào trang dẫn.
Bây giờ bạn có thể kiểm tra quá trình xử lý email phức tạp hơn.
Bản trình diễn đăng và bình luận cho ứng dụng Rails
Hãy cùng nhau thực hiện một bản demo nhỏ để cho thấy tất cả điều này hoạt động như thế nào. Tôi rất ngưỡng mộ 37Signals và tôi đặc biệt thích việc viết blog của họ với Hey World. Nhưng họ không cho phép bình luận, vì vậy hãy tạo một bản sao bao gồm các bình luận cho mỗi bài đăng trên blog.
Hãy làm theo mã trong bài đăng này.
Tạo một ứng dụng mới (Tôi đang sử dụng CSS Tailwind, nhưng bạn có thể chọn những gì phù hợp với mình). Tôi cũng sẽ thêm Văn bản hành động cho Post và Comment người mẫu.
Giàn giáo cho chúng ta một cách nhanh chóng để xem Bài đăng và Nhận xét. Thêm liên kết trong post.rb , và bài đăng sẽ hiển thị các bình luận liên quan:
Trong posts/_post.html.erb , hãy thêm một phần nhận xét:
Bây giờ chúng tôi có một chế độ xem bài viết và bình luận thưa thớt. Thiết lập email gửi đến để đăng lên blog:
Điều này sẽ tạo ra ApplicationMailbox . Chúng tôi sẽ thiết lập một lộ trình để mọi thứ cho blog@ đi tới Hộp thư Bài đăng của chúng tôi và tạo một bài đăng.
Bạn có thể kiểm tra điều này một cách nhanh chóng bằng cách truy cập http://localhost:3000/rails/conductor/action_mailbox/inbound_emails và gửi một số email đến dịch vụ của bạn. Nếu bạn gửi thứ gì đó tới blog@whatever.com , email sẽ được gửi đến hộp thư đến trên ứng dụng của chúng tôi. Nếu bạn gửi email cho bất kỳ địa chỉ nào khác, thư sẽ bị trả lại.
Nhận Email bằng Hộp thư Bưu điện
Hãy thiết lập Hộp thư Đăng để nhận email và đăng lên blog. Mỗi Hộp thư có quyền truy cập vào inbound_email gốc và mail đồ vật. InboundEmail là một trình bao bọc xung quanh mail lớp được sử dụng trong toàn bộ đường ray.
Vì mục đích của chúng tôi, chúng tôi quan tâm đến email đến từ ai, chủ đề và nội dung của nó. Chúng ta có thể trích xuất những thứ này và tạo một Post bản ghi sẽ hiển thị trên trang đầu blog của chúng tôi.
Gửi một email khác đến địa chỉ blog của bạn và sau đó làm mới trang chỉ mục. Bạn nên xem bài viết!
Bây giờ để thêm bình luận cho một bài viết. Đầu tiên, bất kỳ người bình luận email nào cũng cần tham khảo đúng bài viết khi gửi email. Một cách đơn giản để thực hiện việc này là mã hóa ID bài đăng trong địa chỉ email gửi đến (như comment+123@whatever.com , trong đó số 123 trong địa chỉ email đề cập đến phần tử Bài đăng).
Tạo CommentMailbox :
Thêm tuyến đường trong Hộp thư hành động để gửi bất kỳ email nào có comment+123 tới CommentMailbox :
Trong _post.html.erb , thêm liên kết để tạo địa chỉ email để ai đó có thể mở ứng dụng email của họ và gửi email:
Email đến sẽ được chuyển đến CommentMailbox và phân tích cú pháp thành nhận xét đính kèm với bài đăng blog chính xác.
process phương thức tạo nhận xét từ nội dung email và email người gửi. Nó tham chiếu đến Post được truy vấn trong post phương pháp. Phương thức này lấy địa chỉ email của người nhận đầu tiên và sử dụng biểu thức chính quy để lấy ID bài đăng.
Nếu Post không tồn tại hoặc không thể phân tích cú pháp mã thông báo, email bị trả lại khiến quá trình xử lý bị dừng.
Bây giờ hãy chuyển đến biểu mẫu người dẫn Rails và gửi nhận xét đến địa chỉ cho mỗi Bài đăng. Bình luận sẽ xuất hiện bên dưới bài đăng trên trang chỉ mục!
Một ví dụ phức tạp hơn về sử dụng hộp thư hành động
Email thực sự rất phức tạp. Hãy tưởng tượng bạn đã thiết lập một công cụ giám sát ứng dụng, bạn triển khai một cái gì đó như thế này cho ứng dụng của mình và bạn bắt đầu thấy lỗi trong trang tổng quan APM của mình.
Bạn có thể thấy lỗi phân tích cú pháp hoặc bài đăng/bình luận có nhiều lỗi định dạng kỳ lạ.
Ứng dụng của bạn nhận được email HTML và bạn lấy nguồn nội dung thô và đăng nó lên trang web. Gem thư cho phép chúng tôi xem liệu email đến có nội dung HTML hay không và chúng tôi có thể lấy bất kỳ phần nào từ thư mà chúng tôi cần.
Hãy thay đổi CommentMailbox và PostMailbox để kiểm tra các email có nhiều phần và lấy ra phần HTML, quay lại văn bản nếu đó là phần duy nhất còn lại.
Mỗi email không có phần hoặc nhiều phần. Thứ tự ưu tiên là xem có phần HTML không và sử dụng nó, còn nếu không, hãy thử lấy và sử dụng phần văn bản. Nếu không có phần văn bản hoặc HTML được phân tích cú pháp, chúng tôi sẽ sử dụng nội dung email như trước.
PostMailbox bây giờ phức tạp hơn một chút:
CommentMailbox cũng có một phương pháp xử lý khác:
Bây giờ chúng ta có thể xử lý các email đến từ điện thoại của ai đó.
Thêm hộp thư hành động vào ứng dụng Rails của bạn
Nhờ Hộp thư Hành động, chúng ta có thể coi email như một con đường I/O khác cho ứng dụng Rails của mình. Chúng tôi có thể viết mã độc lập với các nhà cung cấp dịch vụ email bằng cách sử dụng tính năng nén khái niệm. Tôi thậm chí còn có thể di chuyển các nhà cung cấp dịch vụ email mà không cần tốn nhiều công sức vì không phải lo lắng về cơ sở hạ tầng cơ bản.
Các công cụ APM như AppSignal cũng cung cấp một bảng điều khiển thuận tiện để giám sát tất cả các ActionMail gửi đi của bạn và theo dõi khả năng gửi.
Dưới đây là ví dụ hiển thị một trong những ứng dụng gửi và nhận nhiều email của tôi:

Điều này giúp bạn hiểu rõ hơn những gì đang diễn ra bên trong ứng dụng của mình.
Kết thúc
Trong bài đăng này, trước tiên chúng tôi đã xác định các khả năng của Action Mailer cho Rails. Sau đó, chúng tôi thiết lập một dự án demo trong đó chúng tôi tích hợp các email gửi đến và phân tích chúng để tạo bài đăng cho blog.
Tôi hy vọng bạn thấy điều này hữu ích. Chúc bạn viết mã vui vẻ!
Tái bút. Nếu bạn muốn đọc các bài đăng của Ruby Magic ngay khi chúng được đăng tải, hãy đăng ký nhận bản tin Ruby Magic của chúng tôi và không bao giờ bỏ lỡ một bài đăng nào!
John Beatty
Tác giả khách mời John của chúng tôi đã học Rails để xây dựng API cho ứng dụng iPhone vào năm 2010 và anh ấy đã không hối hận. Anh hiện đang dạy lập trình cho học sinh Trung học, xây dựng phần mềm tùy chỉnh cho trường học và viết blog.
Tất cả bài viết của John Beatty