Computer >> Máy Tính >  >> Lập trình >> Ruby

Xử lý Email đến trong bất kỳ Ứng dụng Rack nào

Vì vậy, khách hàng của bạn vừa gọi ...

Anh ấy muốn ứng dụng của mình xử lý email đến . Cũng giống như Basecamp.

Bạn nghĩ không sao, rất nhiều dịch vụ sẽ gửi email cho bạn bằng ĐĂNG đến ứng dụng của bạn. Nên dễ dàng. Đúng không?

Không.

Mỗi dịch vụ sử dụng một định dạng độc quyền. Một số gửi cho bạn email đã được phân tích cú pháp, một số gửi nó thô. Một số gửi chữ ký xác thực. Một số thì không.

Thật tuyệt nếu bạn có thể bỏ qua phần này và làm việc với các vật thể ruby ​​tiêu chuẩn (nổi tiếng) phải không?

Sẽ thật tuyệt nếu bạn có thể thay đổi nhà cung cấp ... mà không cần viết lại mã của mình phải không?

Nếu bạn đang sử dụng Incoming !, bạn có thể.

TL; DR

Mới đến! lấy Rack::Request và cung cấp cho bạn một Mail::Message

Các dịch vụ được hỗ trợ

Incoming hỗ trợ các dịch vụ tuyệt vời sau:

  1. SendGrid

  2. Mailgun

  3. Dấu bưu điện

  4. CloudMailin

  5. Máy chủ thư thực tế do bạn tự chạy (woah)

Hơn hết, rất dễ dàng để gia hạn. Vì vậy, nó đã tương thích với các dịch vụ thậm chí chưa tồn tại! (không hẳn, nhưng đại loại)

Vậy tại sao tôi muốn có email đến?

Cung cấp cho mọi người tùy chọn để làm điều gì đó bằng cách gửi email cho bạn khiến họ có nhiều khả năng làm điều đó hơn.

Chúng tôi đã xây dựng Incoming! cho honeybadger.io. Chúng tôi cần một cách để sắp xếp hợp lý các cuộc thảo luận về lỗi. Ví dụ:bạn có thể nhận xét về bất kỳ lỗi nào chỉ bằng cách trả lời thông báo. Hầu hết các nhận xét của chúng tôi đều theo cách này, vì vậy chúng tôi coi đây là một chiến thắng lớn.

Tính đến thời điểm viết bài này, viên đá quý đã được nhóm Honeybadger sử dụng nội bộ trong khoảng sáu tháng.

Cho tôi xem mã!

Đây là một ví dụ đơn giản sử dụng CloudMailin.

`# First, you define an email receiver class
class EmailReceiver < Incoming::Strategies::CloudMailin
  def receive(mail)
    puts %(Got message from #{mail.to.first} with subject "#{mail.subject}")
  end
end

# Then you feed it a Rack::Request object. And you're done. 
req = Rack::Request.new(env)
result = EmailReceiver.receive(req) # => Got message from whoever@wherever.com with subject "hello world"
`

Để biết thêm chi tiết, hãy xem Readme.

Nhưng làm thế nào để bạn sử dụng nó trong Rails?

Sử dụng Incoming! trong đường ray cũng dễ dàng như vậy. Hãy xây dựng một ứng dụng mẫu.

YÊU CẦU:Tôi ghét nhắn tin. Nó chỉ là một mảnh ghép của tôi. Nhưng tôi cần có thể gửi những lời nhắn nhủ tình yêu cho vị hôn thê của mình khi cô ấy đang trong lớp học.

Rõ ràng, câu trả lời là xây dựng một cầu nối giữa email với sms!

Đầu tiên, chúng tôi thiết lập bộ nhận email của mình:

`# app/email_receivers/incoming.rb
class EmailToSmsReceiver < Incoming::Strategies::Postmark
  def receive(mail)
    send_sms([mail.subject, mail.body].join(": "))
  end
  private
    def send_sms(message)
      # Insert twilio magic here
    end
end
`

Thứ hai, chúng tôi thêm bộ điều khiển để chuyển các yêu cầu vào bộ thu của chúng tôi:

`# app/controllers/emails_controller.rb
class EmailsController < ActionController::Base
  def create
    if EmailToSmsReceiver.receive(request)
      render :json => { :status => 'ok' }
    else
      render :json => { :status => 'rejected' }, :status => 403
    end
  end
end
`

Ồ đúng vậy, chúng tôi cần một lộ trình:

`# config/routes.rb
Rails.application.routes.draw do
  post '/emails' => 'emails#create'
end
`

Vậy là xong.

Làm thế nào để Incoming! so sánh với các loại đá quý khác?

Có những viên đá quý khác trong không gian này. Đáng chú ý nhất là Thoughtbot's Griddler.

Tuy nhiên có một vài nơi mà Incoming! đứng ra. Nó:

  1. Hỗ trợ nhiều dịch vụ thư

  2. Hoạt động với bất kỳ ứng dụng giá đỡ nào , không chỉ đường ray

  3. Cung cấp cho bạn một Mail::Message tiêu chuẩn

  4. Không đưa ra giả định về trường hợp sử dụng của bạn

Bạn có meme pic cho tôi không?

Có, có chúng tôi làm.

Xử lý Email đến trong bất kỳ Ứng dụng Rack nào