2016-08-11 3 views
0

Ich möchte in meiner Rails-Anwendung die Möglichkeit haben, eingehende E-Mails zu empfangen und sie auf eine bestimmte Art zu parsen.Rails Email Parsing

incoming_controller.rb

class IncomingController < ApplicationController 
    skip_before_action :verify_authenticity_token, only: [:create] 
    skip_before_action :authenticate_user!, only: [:create] 
    def create 
    # Find the user 
    user = User.find_by(email: params[:sender]) 

    # Find the topic 
    topic = Topic.find_by(title: params[:subject]) 

    # Assign the url to a variable after retreiving it from 
    url = params["body-plain"] 

    # If the user is nil, create and save a new user 
    if user.nil? 
     user = User.new(email: params[:sender], password: "password") 
     user.save! 
    end 

    # If the topic is nil, create and save a new topic 
     if topic.nil? 
     topic = Topic.new(title: params[:subject], user: user) 

     topic.save! 
     end 

     bookmark = topic.bookmarks.build(user: user, url: url, description: "bookmark for #{url}") 

     bookmark.save! 

    # Assuming all went well. 
    head 200 
    end 
end 

diesen Controller verwenden kann ich extrahieren nur 3 Werte = user: Absender, Thema: Thema und url "body-Ebene".

Wie kann ich einen vierten Wert in der E-Mail hinzufügen, um eine: description zu analysieren?

Antwort

1

Eine params[:description] Umsetzung theoretisch die gleiche wie die anderen params Artikel im Verfahren verwendet funktionieren sollte, müssen Sie nur sicherstellen, dass das, was auch immer nennt Ihre IncomingController#create Aktion sendet eine :description param.

Oder, wenn Sie keine Parameter hinzufügen können, was auch immer die Controller-Aktion aufruft, könnten Sie es vielleicht zu der params['body-plain'] hinzufügen, die Sie derzeit für die url verwenden? Sie könnten mehrere Felder in der E-Mail Körper speichern, indem ein serialisierte Text-Format, zum Beispiel (unter Verwendung von YAML):

url: http://example.com 
description: I'm a description 

Dann in Ihrem Controller, dann würden Sie das Feld wie folgt analysieren:

class IncomingController < ApplicationController 
    require 'yaml' 
    def create 
    # ... 
    body_params = YAML.load(params['body-plain']) 
    url = body_params[:url] 
    description = body_params[:description] 
    # ... 
    end 
end 
+0

Wie würde ich den Text in der E-Mail so einstellen, dass er als Beschreibung erkannt wird? Zum Beispiel setze ich den Betreff der E-Mail dem Thema gleich. Was kann ich von der E-Mail einstellen, um der Beschreibung zu entsprechen? – davefogo

+0

Das hängt davon ab, was Ihren Controller anruft ... Ich nehme an, Sie haben eine Art E-Mail, die das Setup empfängt, das die E-Mails in einen Hash zerlegt und an Ihre Controlleraktion sendet? Wenn Sie das kontrollieren können, können Sie den Parameter zum Hash hinzufügen. Wenn Sie das nicht können, können Sie es in den E-Mail-Text einfügen, wie ich es in meiner bearbeiteten Antwort erklärt habe. – rmhunter

+0

Ich versuche die Methode, die Sie in der Antwort beschrieben haben, aber URL und Beschreibung werden nicht von den Parametern ausgewählt. Es liest sie beide als Null. – davefogo