Rails 앱에 이메일을 전달하는 가장 좋은 방법

Rails 앱에 이메일을 전달하는 가장 좋은 방법

저는 수신 메일을 처리하고 이를 수신 메일을 처리하는 Rails 앱에 전달해야 하는 시스템 아키텍처에 대해 생각하고 있습니다. 그런 일을 하는 가장 좋은 방법이 무엇인지 잘 모르겠습니다.

다음과 같이 작동해야 합니다:

  • 메일은 contact@user_id.myapp.com과 같은 주소로 전송됩니다.
  • 메일서버는 메일을 받아 Rails 앱에 전달합니다(또는 메일을 저장하고 Rails 앱이 가져옵니다).
  • Rails 앱은 메일을 처리합니다(일부는 분석한 후 이를 DB에 넣습니다).

기본적으로 queque처럼 작동해야 합니다. 메일 트래픽이 갑자기 급증하더라도 Rails 앱이 중단되어서는 안 됩니다.

나는 완전한 해결책을 찾고 있지 않습니다. 나는 단지 당신의 의견에 관심이 있습니다. 나는 3가지 가능한 옵션을 생각해냈습니다.

  • Rails는 Pop3를 통해 메일 서버에 연결하고 메시지만 다운로드합니다(아마 느림).
  • 메일 서버는 POST 요청을 통해 메일을 Rails APP로 보냅니다. (아마도 너무 느릴 수 있으며, 메일 폭탄을 만나면 웹 서버가 종료될 수 있습니다.)
  • maildir은 사실상 Rails 앱 서버의 파일 시스템(메일 서버와 앱 서버는 분리되어야 함)에 연결되어 있으며 Rails는 그 파일 시스템에서 직접 읽습니다.

성능과 보안 측면에서 가장 좋은 접근 방식은 무엇이라고 생각하시나요? 여기서 뭔가 빠졌나요? 더 좋은 방법이 있나요? 이제 모범 사례 리소스가 있습니까?

감사해요!

답변1

다음은 도움이 될 수 있는 게시물입니다.

Rails를 사용하여 이메일 및 첨부 파일 수신

이 기사에는 RailsCron 설정에 대한 이전 게시물에 대한 링크도 있습니다.

답변2

나는 앱이 POP3를 사용하여 이 작업을 수행하는 것을 본 적이 있습니다(Spiceworks가 제가 생각할 수 있는 한 가지 예입니다). 앱을 분리하는 것이 괜찮은 방법이라고 생각합니다. 메일 서버에서 서버를 분리하여 메일 서버가 자신의 업무에 집중하도록 하고 클라이언트가 메시지에 대한 대기열/저장 업무에서 해방되도록 합니다.

답변: 보안

떠오르는 POP3 관련 문제는 일반 텍스트 자격 증명의 기본 사용입니다. SSL(메일 서버에 따라 다름)을 통해 실행할 수 있으면 해당 문제를 완화할 수 있습니다.

re: 성능 및 확장

POP3 액세스가 그렇게 느려질지는 잘 모르겠습니다. 새 메일이 들어올 때 경합 및 잠금 문제가 발생할 수 있으므로 파일 시스템 수준에서 통합을 수행하는 데 주의해야 합니다(으-- 재미있는 파일 시스템 경합 문제의 예로 NFS를 통해 maildir을 마운트하는 것을 생각해 보세요). POP3는 사서함의 항목에 원자적으로 액세스하는 좋은 방법입니다.

동일한 POP3 사서함에서 동시에 여러 소비자를 실행하는 것은 문제가 될 수 있습니다(더 많은 메시지 트래픽을 처리하기 위해 확장하려는 경우). 이를 위해 메일 서버 측에서 스크립트를 작성하여 들어오는 메시지를 라운드 로빈 방식으로 사서함 그룹에 배포하고 각 소비자를 지정된 사서함에 연결하려고 할 수 있습니다. (다중 소비자 아키텍처에 IMAP을 사용하는 것을 고려할 수도 있지만, 그건 내가 전혀 생각하지 않고 연기를 날리는 것뿐입니다.)

확실히 SMTP를 코드에 직접 받아들이는 것보다 더 많은 계층과 잠재적인 병목 현상을 추가하고 있지만 메일 서버 작성자가 이미 수행한 모든 작업을 활용하고 있습니다. 하지만 나는 사용자 정의 SMTP 서버 코드의 확장 문제보다는 메일 서버의 확장 문제를 선호합니다.

답변3

Rails는 아마도 해당 작업에 잘못된 도구일 것입니다. 아마도 stdin에서 이메일을 받아 데이터베이스에 삽입하는 작은 스크립트를 작성하고 싶을 것입니다. 이를 위해 동일한 ActiveRecord 코드를 사용할 수 있습니다. 그런 다음 메일을 스크립트로 파이핑하여 배달하도록 MTA를 설정하기만 하면 됩니다.

성능이 조금 더 필요한 경우 LTMP를 통해 이메일을 수락하는 데몬이 되도록 스크립트를 다시 작성할 수 있습니다. 이렇게 하면 모든 메일에 대해 프로세스를 시작하는 비효율성을 줄일 수 있습니다.

답변4

POP(해당 경로로 이동하는 경우) 대신 IMAP(S)를 사용하세요. 이렇게 하면 작업이 수행된 후에 서버에 내용을 "읽은" 상태로 둘 수 있습니다.

관련 정보