rails - Разбор сообщения электронной почты только для ответа, а не для старой темы? - PullRequest
5 голосов
/ 18 ноября 2010

Я настроил свое приложение на получение входящих писем по почте от службы. Контроллер, который получает сообщения, выглядит примерно так:

    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 получают только ответ:

That's not a bad idea. Lets try that out.

Идеи? Спасибо

Ответы [ 3 ]

3 голосов
/ 04 января 2011

Гарантированного способа получения всего сообщения не существует, однако обычной практикой является использование разделителя, а затем использование некоторого кода для анализа строки ответа.Например, с открытым исходным кодом 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
0 голосов
/ 22 июля 2016

Посмотрите на extended_email_reply_parser , который также включает email_reply_parser github .

Установить

Добавьте это к 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 против extended_email_reply_parser

email_reply_parser используется и разрабатывается github. Он небольшой и эффективный, но не может справиться с некоторыми крайними случаями, когда почтовый клиент отправителя неправильно форматирует предыдущий разговор как цитату.

extended_email_reply_parser - это расширяемая оболочка для синтаксического анализатора github. Это не так эффективно, как оригинал. Но его легче расширять, если типичные письма, которые вы анализируете, не обрабатываются прямо из коробки.

Ресурсы

0 голосов
/ 19 февраля 2013

Не идеальный драгоценный камень, но вы можете попробовать этот драгоценный камень из Github: Парсер ответа по электронной почте

...