在我的rails应用程序中,lib类用于接收电子邮件。电子邮件接收器类解析电子邮件并使用HTTP响应将其发布到应用程序控制器。代码如下所示:
uri = 'http://localhost:3000/incoming_mail'
body = {'from'=> from, 'to' => to, 'subject' => subject, 'message' => message}
response = Net::HTTP::post_form(URI.parse(uri), body)
问题是我不想指定完整的网址。有没有办法使用' incoming_mail_path'而不是' localhost:3000 / incoming_mail' ? 我试着添加:
include Rails.application.routes.url_helpers
但这不起作用,并给出以下错误:
<class:EmailReceiver>': uninitialized constant EmailReceiver::Rails (NameError)
任何人都可以为此提出解决方案。
我在这里发布了整个类(用include语句更新了类):
require 'mail'
require 'net/https'
require 'net/http'
require 'uri'
class EmailReceiver
include Rails.application.routes.url_helpers
attr_accessor :url
def initialize
end
def submit(content)
mail = Mail.read_from_string(content)
body = mail.body.decoded
from = mail.from.first
to = mail.to.first
subject = mail.subject
if mail.multipart?
part = mail.parts.select { |p| p.content_type =~ /text\/plain/ }.first rescue nil
unless part.nil?
message = part.body.decoded
end
else
message = mail.decoded
end
unless message.nil?
uri = incoming_mail_url
#uri = 'http://localhost:3000/incoming_mail'
body = {'from'=> from, 'to' => to, 'subject' => subject, 'message' => message}
response = Net::HTTP::post_form(URI.parse(uri), body)
end
end
end
handler = EmailReceiver.new
handler.submit(STDIN.read)
答案 0 :(得分:2)
阅读完你的评论后,我发现你将它作为一个甚至不能识别Rails的ruby脚本运行。
在确定如何将所有要求包含在文件中之前。我试图通过rails环境运行该文件(当服务器已经运行时):
cat sample.email | bundle exec rails runner "eval(File.read 'lib/email_receiver.rb')"
我收到incoming_mail_url
的错误:
Missing host to link to! Please provide the :host parameter,
set default_url_options[:host], or set :only_path to true (ArgumentError)
incoming_mail_path
成功执行/incoming_mail
(这不是您需要的)。
这意味着无论你做什么,只要你不从服务器运行文件(例如:初始化程序),主机就永远不会存在。
当您从服务器运行此模块时,它会通过您所包含的route
重新识别url_helpers
。
Griddler gem是一个Rails引擎,为将传入的电子邮件转换为HTTP POST请求的服务提供端点。它解析这些POST并将构建的电子邮件对象移交给您实现的类。
答案 1 :(得分:0)
要解决您的直接问题,您可能需要尝试取消包含您的include语句。现在似乎解释器认为“Rails”是EmailReceiver命名空间中的一个类。如果你将include ::添加到include语句,它应该引用顶层的“Rails”,这就是你想要的。
它应该可以工作,但是你的设置中可能还有其他错误导致你使用这个不必要的解决方法
修改强> 我的意思是添加“::”只是为了澄清
include ::Rails.application.routes.url_helpers