ruby / rails用pop接收纯文本邮件

时间:2010-11-02 21:19:36

标签: ruby-on-rails ruby email pop3

我已经将pop邮件用于ruby(net / pop)

我遇到的问题是某些电子邮件是HTML格式的,有没有办法指明我想要纯文本?

谢谢,Alex

1 个答案:

答案 0 :(得分:2)

电子邮件可以采用不同的格式。最常见的是MIME,它允许电子邮件包含多个“部分”。通常是HTML和纯文本部分。但是,您无法控制电子邮件实际包含的部分。由于显而易见的原因,这只能是发件人。

但是,如果存在纯文本部分,则可以使用ruby来获取纯文本部分,或者尝试从HTML部分生成一些纯文本部分。

以下简要示例来获取电子邮件的纯文本部分来自Redmine的MailHandler modelPOP3 module(根据GPLv2许可)。

def plain_text_body(email)
  parts = email.parts.collect {|c| (c.respond_to?(:parts) && !c.parts.empty?) ? c.parts : c}.flatten
  if parts.empty?
    parts << email
  end
  plain_text_part = parts.detect {|p| p.content_type == 'text/plain'}
  if plain_text_part.nil?
    # no text/plain part found, assuming html-only email
    # strip html tags and remove doctype directive
    plain_text_body = strip_tags(email.body.to_s)
    plain_text_body.gsub! %r{^<!DOCTYPE .*$}, ''
  else
    plain_text_body = plain_text_part.body.to_s
  end
  plain_text_body.strip
end

pop = Net::POP3.APOP(true).new(host,port)
pop.start(username, password) do |pop_session|
  if pop_session.mails.empty?
    puts "No email to process"
  else
    puts "#{pop_session.mails.size} email(s) to process..."
    pop_session.each_mail do |msg|
      message = msg.pop
      plain_text = plain_text_body(message)
      #
      # Now do something with the plain text body
      #
    end
  end
end