我将我的应用设置为通过服务中的帖子接收传入的电子邮件。接收帖子的控制器看起来有点像这样:
class IncomingMailsController < ApplicationController
require 'mail'
skip_before_filter :verify_authenticity_token
def create
message = Mail.new(params[:message])
message_plain = (params[:plain])
Rails.logger.info 'message2.plain:'
Rails.logger.info message2
render :text => 'success', :status => 200 # a status of 404 would reject the mail
end
end
成功传递完整的电子邮件,回复,转发历史等。问题是我希望能够只提取实际的回复文本。
目前我得到:
That's not a bad idea. Lets try that out.
On Nov 17, 2010, at 4:18 PM, XXXXX @ XXXXXXXX wrote:
> There's a new reply:
我想知道rails devs如何获得回复:
That's not a bad idea. Lets try that out.
想法?感谢
答案 0 :(得分:3)
没有保证获取整个消息的方法,但通常的做法是使用分隔符,然后使用一些代码来解析响应行。
例如,如果您查看开源项目teambox中的代码,您会看到与以下内容非常相似的内容:
def strip_responses(body)
# For GMail. Matches "On 19 August 2010 13:48, User <proj+conversation+22245@app.teambox.com<proj%2Bconversation%2B22245@app.teambox.com>> wrote:"
body.strip.
gsub(/\n[^\r\n]*\d{2,4}.*\+.*\d@app.teambox.com.*:.*\z/m, '').
split("---------separator---------").first.
split("<div class='email'").first.
strip
end
答案 1 :(得分:0)
不是一个完美的宝石,但你可以从Github尝试这个宝石:Email Reply Parser
答案 2 :(得分:0)
查看extended_email_reply_parser,其中还包括github's email_reply_parser。
将其添加到Gemfile
:
# Gemfile
gem 'extended_email_reply_parser'
然后,您可以像这样解析电子邮件回复:
message_plain = ExtendedEmailReplyParser.parse message
应用于您的代码:
class IncomingMailsController < ApplicationController
skip_before_filter :verify_authenticity_token
def create
message = Mail.new(params[:message])
message_plain = ExtendedEmailReplyParser.parse(message)
render :text => 'success', :status => 200 # a status of 404 would reject the mail
end
end
email_reply_parser 由github使用和开发。它虽然小巧又高效,但却无法处理一些边缘情况,而发件人的电子邮件客户端并没有将之前的会话格式化为报价。
extended_email_reply_parser 是github解析器的可扩展包装器。它没有原始效率那么高效。但是,如果您正在解析的典型电子邮件处理得不是很好,那么扩展起来会更容易。