Получение и обработка электронной почты: Heroku, Sendgrid и, возможно, Mailman

Мое приложение создает уникальную электронную почту для каждого пользователя, и пользователи отправляют электронную почту на этот адрес для обработки. Используя Sendgrid, я отправил входящие электронные письма на свой домен (размещенный на Heroku) по адресу:

site.com/receive_email

Я использую поле TO, чтобы определить пользователя, так как адрес электронной почты генерируется случайным образом (возможно, это проблема безопасности, но только со мной)

Я экспериментировал с использованием внешнего скрипта, такого как Mailman, но, поскольку я размещен на Heroku, мне нужен рабочий, работающий полный рабочий день, чтобы этот процесс продолжался. На данный момент не совсем то, что нужно для этого тестового приложения.

Это оставляет обработку как запрос POST. У меня есть доступ к хешу POST (params["subject"] и т. Д.) В receive_emails.

Вот где я застреваю

Вы бы предложили работать с необработанными данными из параметров POST, или я могу использовать что-то вроде Mailman или ActionMailer для обработки электронной почты для меня?

2 ответа

Я не использовал Sendgrid для преобразования писем в почтовые запросы, но он отлично работает с cloudmailin, надстройкой heroku. Вот пример, когда кто-то отправляет электронное письмо в ваше приложение, оно обрабатывается cloudmailin/sendgrid и превращается в сообщение, а затем отправляет его вашему контроллеру, а затем контроллер просматривает параметры сообщения, находит отправителя из электронного письма. адрес, и если отправитель еще не существует, создает учетную запись для нее:

class CreateUserFromIncomingEmailController < ApplicationController

  require 'mail'

  skip_before_filter :verify_authenticity_token

  parse_message(params[:message])

  def create
    User.find_or_create_by_email(@sender)
  end

private

  def parse_message(message_params)
    @message    = Mail.new(message_params)
    @recipients = @message.to
    @sender     = @message.from.first
  end

end

Удачи.

ActionMailer уже зависит от Mail драгоценный камень, вы можете использовать его для анализа входящей электронной почты и извлечения частей, которые вы хотите. Особенно полезно иметь дело с составными электронными письмами.

require 'mail'

class IncomingEmails < ApplicationController
  skip_before_filter :verify_authenticity_token

  def receive_email
    comment = Comment.new(find_user, message_body)
    comment.save

  rescue
    # Reject the message
    logger.error { "Incoming email with invalid data." }
  end

  private

  def email_message
    @email_message ||= Mail.new(params[:message])
    # Alternatively, if you don't have all the info wrapped in a
    # params[:message] parameter:
    #
    # Mail.new do
    #   to      params[:to]
    #   from    params[:from]
    #   subject params[:subject]
    #   body    params[:body]
    # end
  end

  def find_user
    # Find the user by the randomly generated secret email address, using
    # the email found in the TO header of the email.
    User.find_by_secret_email(email_message.to.first) or raise "Unknown User"
  end

  def message_body
    # The message body could contain more than one part, for example when
    # the user sends an html and a text version of the message. In that case
    # the text version will come in the `#text_part` of the mail object.
    text_part = email_message.multipart? ? email_message.text_part : email_message.body
    text_part.decoded
  end
end
Другие вопросы по тегам