Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

모든 랙 애플리케이션에서 인바운드 이메일 처리

그래서 귀하의 클라이언트가 방금 전화를 걸었습니다...

그는 자신의 앱이 수신 이메일을 처리하기를 원합니다. . 베이스캠프처럼.

문제 없습니다. 많은 서비스에서 POST를 통해 앱으로 이메일을 보낼 것입니다. 쉬워야 합니다. 그렇지?

아닙니다.

각 서비스는 독점 형식을 사용합니다. 일부는 구문 분석된 이메일을 보내고 일부는 원시 상태로 보냅니다. 일부는 인증 서명을 보냅니다. 일부는 그렇지 않습니다.

이 부분을 건너뛰고 표준(잘 알려진) 루비 개체로 작업할 수 있다면 좋지 않을까요?

코드를 다시 작성하지 않고 공급업체를 변경할 수 있다면 좋지 않을까요?

Incoming!을 사용하는 경우 가능합니다.

TL;DR

들어오는! Rack::Request 사용 Mail::Message를 제공합니다.

지원되는 서비스

Incoming은 다음과 같은 훌륭한 서비스를 지원합니다.

  1. 센드그리드

  2. 메일건

  3. 소인

  4. 클라우드메일인

  5. 직접 운영하는 실제 메일 서버(워)

무엇보다 확장하기 쉽습니다. 따라서 아직 존재하지도 않는 서비스와 이미 호환됩니다! (실제로는 아니지만 일종의)

그래서 수신 이메일이 필요한 이유는 무엇입니까?

사람들에게 이메일을 보내 어떤 일을 할 수 있는 선택권을 주면 그 일을 할 가능성이 높아집니다.

우리는 Incoming을 구축했습니다! Honeybadge.io용. 오류에 대한 논의를 간소화할 방법이 필요했습니다. 예를 들어 알림에 답장하기만 하면 오류에 대해 댓글을 달 수 있습니다. 대부분의 댓글이 이런 식으로 오기 때문에 큰 승리라고 생각합니다.

이 글을 쓰는 시점에서 이 보석은 약 6개월 동안 Honeybadger 팀에서 내부적으로 사용되었습니다.

코드를 보여주세요!

다음은 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 [email protected] with subject "hello world"
`

자세한 내용은 Readme를 확인하십시오.

하지만 Rails에서는 어떻게 사용하나요?

수신 사용! 레일에서도 마찬가지로 쉽습니다. 샘플 앱을 만들어 봅시다.

요구 사항:나는 문자 메시지를 싫어합니다. 그냥 내 짜증입니다. 하지만 약혼녀가 수업을 듣는 동안 사랑의 편지를 보낼 수 있어야 합니다.

분명히 답은 이메일-sms 브리지를 구축하는 것입니다!

먼저 이메일 수신기를 설정합니다.

`# 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
`

둘째, 요청을 수신기로 파이프하는 컨트롤러를 추가합니다.

`# 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
`

예, 경로가 필요합니다.

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

그게 다야.

Incoming! 다른 보석과 비교하시겠습니까?

이 공간에는 다른 보석이 있습니다. 가장 주목할만한 것은 Thoughtbot의 Griddler입니다.

그러나 Incoming! 눈에 띄는. 그것은:

  1. 여러 메일 서비스 지원

  2. 모든 랙 애플리케이션과 함께 작동 , 레일뿐만 아니라

  3. 표준 Mail::Message를 건네줍니다.

  4. 사용 사례에 대해 가정하지 않음

나를 위한 밈 사진이 있습니까?

예, 그렇습니다.

모든 랙 애플리케이션에서 인바운드 이메일 처리