Получение и обработка электронной почты: 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