登录 shell 时如何打印 Maildir 内容的摘要?

登录 shell 时如何打印 Maildir 内容的摘要?

我知道这在理论上是可能的,但我试图避免重新发明轮子。

我使用的是 Ubuntu Linux,采用 Maildir 邮箱格式。我想在 .login 中添加一些内容来解析 ~/Maildir 内容并显示我未读电子邮件的摘要。

我运行的是 Ubuntu 13.04 (Raring Ringtail),我使用 mutt 作为我的电子邮件客户端,我使用 Postfix 和 dovecot 来处理 SMTP 和 MDA/IMAP。

是否已经写了一些可以做到这一点的东西?或者我需要使用 Perl 和 Mail::Box::Maildir 自己写一些东西吗?这似乎是一件很常见的事情,但在我的一生中,我找不到一个包或实用程序可以完成我正在寻找的事情。

答案1

我找到了一种用 Python 实现的更短、更简单的方法。

下面的示例代码。

#!/usr/bin/python

import mailbox
import email.utils
import os

mbox = mailbox.Maildir(os.environ['HOME'] + "/Maildir" )
mbox.lock()
spam = mbox.get_folder('INBOX.junk')
print "INBOX:"
for message in mbox:
    print "- [%s] %s:  \"%s\"" % ( message['date'], message['from'], message['subject'] )
print
print "SPAM messages:"
for message in spam:
    print "- [%s] %s:  \"%s\"" % ( message['date'], message['from'], message['subject'] )

mbox.close()

答案2

这是我想出的...一个使用 Mail::Box::Maildir CPAN 模块的自制 Perl 脚本。

#!/usr/bin/perl
use strict;
use Mail::Box::Maildir;

my $folder = new Mail::Box::Maildir folder=>"$ENV{HOME}/Maildir";

my $message;
my $messsages;
my $to;
my $from;
my $date;
my $subject;

print "********************************************************************************\n";
foreach $message( $folder->messages('ALL') ) {
    #print $message->{'MM_head'}, "\n";
    parse_header( $message->{'MM_head'} );
    print "   Date:  $date\n";
    print "   From:  $from\n";
    print "     To:  $to\n";
    print "Subject:  $subject\n";
    print "********************************************************************************\n";
}

exit 0;

sub parse_header {
    my @lines = split( /\n/, shift(@_) );
    undef $to;
    undef $from;
    undef $date;
    undef $subject;

    foreach ( @lines ) {
        if ( /^To:\s+?(.*)$/ ) {
            $to = $1;
        }
        elsif ( /^From:\s+?(.*)$/ ) {
            $from = $1;
        }
        elsif ( /^Date:\s+?(.*)$/ ) {
            $date = $1;
        }
        elsif ( /^Subject:\s+?(.*)$/ ) {
            $subject = $1;
        }
    }
}

相关内容