2013-05-03 4 views
3

У Ruby gem rmail есть методы для анализа файла почтового ящика на локальном диске. К сожалению, этот камень сломался (в Ruby 2.0.0). Это может не быть исправлено, потому что люди мигрируют к камню mail.Как разобрать файл почтового ящика в Ruby?

Gem mail имеет метод Mail.read('filename.txt'), но это обрабатывает только первое сообщение в почтовом ящике.

Этот драгоценный камень и встроенный Net::IMAP, наводнили сеть учебными пособиями по доступу к почтовым ящикам через imap.

Итак, есть ли способ разобрать простой старый файл , без imap? Как одинокий рубист в моей группе, я бы не стал смущать себя, обратившись к http://docs.python.org/2/library/mailbox.html.

Или, что еще хуже, PHP imap_open('/var/mail/www-data', ...) - если только Net::IMAP.new принято таких имен файлов.

+0

Литературный файл почтового ящика? Не все ли перешли на [Maildir] (https://en.wikipedia.org/wiki/Maildir), прежде чем дискотека вымерла? – tadman

+0

Yup, именно это. <удары бедра, указательный палец указателя вверх> –

ответ

7

Хорошая новость: Mbox format действительно мертв, но простота в том, что это было в конечном итоге заменено. Разбор большого файла почтового ящика для извлечения одного сообщения не является особенно эффективным.

Если вы можете разделить файл почтового ящика на отдельные строки, вы можете передать эти строки в библиотеку Mail для разбора.

Пример отправной точкой:

def parse_message(message) 
    Mail.new(message) 

    do_other_stuff! 
end 

message = nil 

while (line = STDIN.gets) 
    if (line.match(/\AFrom /)) 
    parse_message(message) if (message) 
    message = '' 
    else 
    message << line.sub(/^\>From/, 'From') 
    end 
end 

Ключ в том, что каждое сообщение начинается с "From " где пространство после того, как он является ключевым.Заголовки будут определены как From:, и любая строка, начинающаяся с ">From", должна рассматриваться как , фактически являющейся "From". Это похоже на то, что этот метод кодирования действительно неадекватен, но если Maildir не вариант, это то, что вам нужно сделать.

+0

Быстрый просмотр просматриваемых почтовых ящиков подтверждает, что '/^From /', а не '/ From: /' действительно ограничивает сообщения. –

1

Вы можете использовать tmail parsing email boxes, но он был заменен на mail, но я действительно не могу find a class that substitutes it. Таким образом, вам может понадобиться поддерживать tmail.

EDIT: как отметил @tadman, он не должен работать с ruby ​​1.9. Однако вы можете портировать этот класс (и поместить его на github для всех остальных, используя :-))

+0

По моему опыту, 'tmail' действительно сломан в 1.9.x. Он устарел в пользу «почты». – tadman

+0

@tadman вы всегда можете переносить только класс UNIXMbox. – fotanus

0

Формат mbox примерно так же прост, как вы можете получить. Это просто конкатенация всех сообщений, разделенных пустой строкой. Первая строка каждого сообщения начинается с пяти символов «От»; когда сообщения добавляются в файл, любая строка, начинающаяся с «From», имеет префикс >, поэтому вы можете надежно использовать тот факт, что строка начинается с «From» в качестве индикатора, что это начало сообщения.

Конечно, поскольку это старый формат и он никогда не был стандартизирован, существует несколько вариантов. Один вариант использует заголовок Content-Length для определения длины сообщения, а некоторые реализации этого варианта не могут вставить '>'. Однако, на мой взгляд, это редко бывает на практике.

Большая проблема с форматом mbox заключается в том, что файл необходимо модифицировать почтовыми агентами; следовательно, каждая реализация имеет некоторую процедуру блокировки. Конечно, там нет стандартизации, поэтому вам нужно следить за другими процессами, изменяющими почтовый ящик во время чтения. На практике многие почтовые системы решили эту проблему, используя вместо этого формат maildir, в котором почтовый ящик фактически является каталогом, и каждое сообщение представляет собой один файл.

Другие вещи, которые вы, возможно, захотите сделать, включают MIME-декодирование, но вы должны уметь находить утилиты, которые это делают.

Смежные вопросы