4

我需要通过来自 Cloudmailin 的 POST 请求以 multipart-formdata 形式接收传入的电子邮件。POST 类似于以下内容:

Parameters: {"to"=>"<email@exmaple.comt>", "from"=>"whomever@example", "subject"=>"my awesome subject line....

实际上,接收和解析电子邮件非常容易,因为电子邮件只是作为参数发布:params[:to]、params[:from] 等。但是,我如何在 rails 中模拟这个 POST 请求?

我构建了一个虚拟 Rails 应用程序来测试 Cloudmailin,所以我有一个实际的请求。但是,它是一个 6k 字符的文件,所以我想将此文件加载为 POST 请求的参数。我试过使用内置的 rails post 和 post_via_redirect 方法来加载文件,但它转义了所有参数(\“to\”),这不好。有任何想法吗?

4

3 回答 3

12

所以,我最终做了:

@parameters = { "x_to_header"=>"<#{ @detail.info }>",
                "to"=>"<#{ @account.slug }@cloudmailin.net>",
                "from"=>"#{ @member.email }",
                "subject"=>"meeting on Monday",
                "plain"=>"here is my message\nand this is a new line\n\n\nand two new lines\n\n\n\nand a third new line"
              }

然后只是:

post "/where_ever", @parameters

现在似乎完成了工作

于 2011-09-01T15:45:48.363 回答
0

一种简单的方法可能是在水豚中执行脚本。只需确保使用@javascript标签,然后在您的应用程序中加载安装了 jQuery 的任何页面(从技术上讲,您不需要这个,但它更容易。然后:

When /^I get a post request from Cloudmailin$/ do
  visit '/some/page/with/jquery'
  page.execute_script(%{$.post("/some/path?to=some_email&etc=etc");})
end

也有简单的post水豚方法,但我不太确定它是如何工作的。可能值得研究。

于 2011-08-23T12:30:13.030 回答
0

昨晚我在更新我自己的 Rails 3.2.8 测试代码时看到了这个答案,它使用了 Mail gem,我想我会分享我的发现。测试代码适用于需要从 Cloudmailin 获取 POST 的应用程序,然后对其进行处理以使用 Devise 创建新用户,然后向该用户发送确认信息,然后用户可以按照该确认信息选择密码。这是我的控制器规格:

require 'spec_helper'

describe ThankyouByEmailController do

  message1 = Mail.new do 

    from "Frommy McFromerton <frommy.mcfrommerton@gmail.com>"
    to "toey.receivesalot@gmail.com"
    subject "cloudmailin test"
    body 'something'

    text_part do
      body 'Here is the attachment you wanted'
    end

    html_part do
      content_type 'text/html; charset=UTF-8'
      body '<h1>Funky Title</h1><p>Here is the attachment you wanted</p>'
    end
  end

  describe "creating new users" do

    describe "unregistered FROM sender and Unregistered TO receiver" do

      it "should create 2 new users" do
        lambda do
          post :create, :message => "#{@message1}"
        end.should change(User, :count).by(2)
      end
    end
  end
end

希望这可以清理您自己的测试。对于其他对测试邮件 gem 感兴趣的人,mikel 的文档已经取得了同样的进展:

https://github.com/mikel/mail

于 2012-09-27T22:40:31.230 回答