2016-08-11 2 views
0

Je veux avoir la possibilité dans l'application de mes rails de recevoir des courriels entrants et les analyser d'une manière particulière.Rails Email analyse

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 

En utilisant ce contrôleur, je ne peux extraire 3 valeurs = utilisateur: expéditeur, sujet: sujet et url "corps simple".

Comment puis-je ajouter une 4ème valeur dans l'email pour analyser une: description?

Répondre

1

Une params[:description] mise en œuvre devrait fonctionner théoriquement les mêmes que les autres params objets utilisés dans votre méthode, il vous suffit de vous assurer que tout ce que appelle votre action IncomingController#create envoie un :description param. Ou, si vous ne pouvez pas ajouter de paramètres à ce qui appelle l'action du contrôleur, peut-être pourriez-vous l'ajouter au params['body-plain'] que vous utilisez actuellement pour le url? Vous pouvez stocker plusieurs champs dans le corps de l'email en utilisant un format de texte sérialisé, par exemple (en utilisant YAML):

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

Ensuite, dans votre contrôleur, vous voulez faire analyser ce champ comme ceci:

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

Comment définir le texte dans l'e-mail afin qu'il soit reconnu comme la description? Par exemple, je définis l'objet de l'e-mail pour égaler le sujet. Que puis-je définir à partir de l'e-mail pour égaler la description? – davefogo

+0

Cela dépend de ce qui appelle votre contrôleur ... Je suppose que vous avez une sorte de configuration de réception de courrier électronique qui analyse les emails dans un hachage et soumet à votre action de contrôleur? Si vous pouvez contrôler cela, vous pouvez ajouter le paramètre au hachage. Si vous ne pouvez pas faire cela, vous pouvez l'ajouter dans le corps de l'e-mail comme je l'ai expliqué dans ma réponse éditée. – rmhunter

+0

J'essaye la méthode que vous avez décrite dans la réponse mais l'URL et la description ne sont pas choisis par les params. Il les lit tous les deux comme nuls. – davefogo