1

Rails アプリの受信メールを処理するためにMailman gem を使用しています。私のアプリケーションは、平文の電子メールで YAML ドキュメントを探し、それを Ruby オブジェクトにロードして、アプリでさらに操作できるようにします。

ただし、マルチパート メールで応答する可能性のあるメール クライアントについては、前もって計画できるようにしたいと考えています。メールのプレーンテキスト部分を取得して、YAML パーサーに渡す必要があります。

何らかの理由で、YAML の解析にまだ問題があります。ここではプレーンテキスト部分を実際に取得していないためだと思います。

Mailman でメールの text/plain 部分を取得するより良い方法はありますか? Mailman を破棄して、代わりに ActionMailer を使用する必要がありますか?

Mailman::Application.run do
    default do
        begin
            message.parts.each do |part|
                Mailman.logger.info part.content_type
                if part.content_type == 'text/plain; charset=ISO-8859-1' # My poor way of getting the text part
                    the_yaml = part.body.decoded.scan(/(\-\-\-.*\.\.\.)/m).first.last # Find the YAML doc in the email and assign it to the_yaml
                    ruby_obj = YAML::load(the_yaml.sub(">", "")) # Remove any >'s automatically added by email clients

                    if ruby_obj['Jackpots']
                        ruby_obj['Jackpots'].each do |jackpot|
                            jp = Jackpot.find(jackpot['jackpot']['id'])
                            jp.prize = jackpot['jackpot']['prize']
                            jp.save
                        end
                    end
                end
            end
        rescue Exception => e
                Mailman.logger.error "Exception occurred while receiving message:\n#{message}"
                Mailman.logger.error [e, *e.backtrace].join("\n")
        end
    end
end
4

1 に答える 1

2

メールのテキスト部分の取得を処理するためのもう少し良い方法を見つけることができました。

Mailman::Application.run do
    default do
        begin           
            if message.multipart?
                the_message = message.text_part.body.decoded
            else
                the_message = message.body.decoded
            end

            the_yaml = the_message.sub(">", "").scan(/(\-\-\-.*\.\.\.)/m).first.last
            ruby_obj = YAML::load(the_yaml)

            if ruby_obj['Jackpots']
                ruby_obj['Jackpots'].each do |jackpot|
                    jp = Jackpot.find(jackpot['jackpot']['id'])
                    jp.prize = jackpot['jackpot']['prize']
                    jp.save
                end
            end

        rescue Exception => e
                Mailman.logger.error "Exception occurred while receiving message:\n#{message}"
                Mailman.logger.error [e, *e.backtrace].join("\n")
        end
    end
end

そして、デバッガーを介して実行し、テキスト部分が正常に解析された後に検査した後。YAML の読み込みでハングアップします。いくつかの行が長すぎて、電子メール クライアントが改行を挿入し、YAML のコメントが壊れて、YAML ドキュメント全体が壊れてしまったことが判明しました。

于 2012-05-16T13:58:02.673 に答える