接收和处理电子邮件:Heroku,Sendgrid,可能还有Mailman

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

site.com/receive_email

我使用TO字段来确定用户,因为电子邮件地址是随机生成的(可能是那里的安全问题,但只是在我身边)

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

这使得它作为POST请求处理。 我可以在receive_emails访问POST哈希(params [“subject”]等)。

这是我被卡住的地方

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

我没有使用Sendgrid将电子邮件转换为post请求,但它可以与cloudmailin一起使用,这是一个heroku插件。 以下是有人向您的应用程序发送电子邮件的示例,它由cloudmailin / sendgrid处理并转换为post,然后将其发送到您的控制器,然后控制器查看邮件参数,从电子邮件中找到发件人地址,如果发件人尚不存在,则为她创建一个帐户:

 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 gem,您可以使用它来解析传入的电子邮件并提取您想要的部分。 处理多部分电子邮件特别有用。

 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 
Interesting Posts