Как получить текстовую часть только из электронной почты Mailman?
Я использую гем Mailman для обработки входящей электронной почты для моего приложения 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 ответ
Я смог найти немного лучший способ справиться с получением текстовой части письма.
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.