2

我的应用程序为每个用户创建一个唯一的电子邮件,用户将电子邮件发送到该地址进行处理。使用 Sendgrid,我将传入的电子邮件通过管道传输到我的域(托管在 Heroku 上)到一个地址:

site.com/receive_email

我使用 TO 字段来确定用户,因为电子邮件地址是随机生成的。

我已经尝试过使用像Mailman这样的外部脚本,但由于我托管在 Heroku 上,我需要有一个全职工作人员来保持这个过程的进行。目前并没有真正为这个测试应用程序寻找那个。

剩下的就是将其作为 POST 请求进行处理。我可以在 receive_emails 访问 POST 哈希(参数 [“主题”] 等)。

这是我卡住的地方

您是否建议处理来自 POST 参数的原始数据,或者我可以使用 Mailman 或 ActionMailer 之类的东西为我处理电子邮件?

4

2 回答 2

3

我没有使用 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

祝你好运。

于 2013-01-07T23:27:57.060 回答
0

ActionMailer已经依赖于Mailgem,您可以使用它来解析传入的电子邮件并提取您想要的部分。处理多部分电子邮件特别有用。

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
于 2013-01-07T23:59:05.013 回答