ruby / rails получает текстовое электронное письмо с поп - PullRequest
0 голосов
/ 03 ноября 2010

Я использовал pop mailer для ruby ​​(net / pop)

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые электронные письма имеют формат HTML. Можно ли указать, что я хочу простой текст?

Спасибо, Алекс

1 Ответ

2 голосов
/ 03 ноября 2010

Письма могут приходить в разных форматах.Наиболее распространенным является MIME, который позволяет электронной почте содержать несколько «частей».Обычно это HTML и текстовая часть.Однако вы не можете контролировать, какие части на самом деле содержит электронное письмо.Это может сделать только отправитель по понятным причинам.

Однако вы можете использовать ruby ​​для получения части с открытым текстом, если она есть, или попытаться сгенерировать некоторое представление этого из части HTML.

следующий сжатый пример для получения текстовой части письма от модели MailHandler и POP3 модуля от Redmine (лицензируется по 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
...