如何仅从Mailman电子邮件中获取文本部分?

时间:2012-05-16 04:44:00

标签: ruby-on-rails ruby gem mailman-gem

我正在使用Mailman gem处理我的Rails应用程序的传入电子邮件。我的应用程序在纯文本电子邮件中查找YAML文档,然后将其加载到Ruby对象中以供应用程序进一步操作。

但是,我希望能够提前计划可能使用多部分电子邮件回复的电子邮件客户端。我需要获取电子邮件的纯文本部分并将其传递给YAML解析器。

出于某种原因,它仍然在解析YAML时遇到问题。我猜是因为它并没有真正获得纯文本部分。

有没有更好的方法来获取Mailman的电子邮件的文本/简单部分?我应该废弃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

1 个答案:

答案 0 :(得分: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文档。