Journal Reader for Mac OS X

| | Comments (0)
This script -- using as-yet unreleased versions of Mac::Glue and Mac::Carbon -- works under perl on Mac OS X (as well as MacPerl under Mac OS) to loop through my use.perl.org mailbox for new journal messages, groups them by user, opens them in the browser one user at a time, and then moves the messages to the trash.

Note, to those of you new to Mac:: modules, that GetURL() automatically opens the URL in whichever browser you have chosen as your default.

The Mac::Glue stuff is pretty straightforward.

#!/usr/bin/perl
use strict;
use warnings;
 
use Mac::Glue ':all';
use Mac::InternetConfig 'GetURL';
 
my $eudora  = new Mac::Glue 'Eudora';
my $box     = $eudora->obj(mailbox => ' use perl');
my $count   = $eudora->count($box, 'each' => 'messages');
my $trash   = location(end => $eudora->obj(mailbox => "Trash"));
 
my %users;
# loop over messages in mailbox
for my $i (1 .. $count) {
    my $msg = $eudora->obj(message => $i, $box);
 
    # check status
    my $status  = $eudora->get( $eudora->prop(status  => $msg) );
    next unless $status eq 'unread';
 
    # check subject
    my $subject = $eudora->get( $eudora->prop(subject => $msg) );
    next unless $subject =~ /^\[use Perl\] New Journal Entry by (.+?), "/;
    my $user = $1;
 
    # many Mac apps still use \015 as newline internally, as does AppleScript
    (my $body = $eudora->get( $eudora->prop(body => $msg) )) =~ s/\015/\n/g;
 
    # get URL for journal entry out of the body
    my($url) = $body =~ m|^    (http://use.perl.org/~.+?/journal/\d+)$|m;
 
    # save id and url for later
    my $id = $eudora->get( $eudora->prop(id => $msg) );
    push @{$users{$user}}, [ $id, $url ];
}
 
for my $user (sort { lc $a cmp lc $b } keys %users) {
    # print journal entries to STDOUT
    my @urls = sort map { $_->[1] } @{$users{$user}};
    printf "%s:\n    %s\n", $user, join "\n    ", @urls;
 
    # open each journal entry in the browser
    for my $url (reverse @urls) {
        GetURL($url);
    }
 
    # move messages to the trash
    for my $id (map { $_->[0] } @{$users{$user}}) {
        my $nid = $eudora->obj(message => obj_form(formUniqueID, typeInteger, $id), $box);
        $eudora->move($nid, to => $trash);
    }
 
    <>;  # wait for NL
}
 
__END__

Also worthy of note for those of you into Mac::Glue is that the normal form of object is CLASS => VALUE, such as message => $n to specify the nth message; but when we move the message to the trash, we no longer can go by the index, since it changes; so instead we use the message's unique ID, which is what the formUniqueID is all about (currently, Mac::Glue can't easily distinguish between an index and a unique ID that is an integer, so we have to help it out). use.perl.org

Leave a comment

<pudge/*> (pronounced "PudgeGlob") is thousands of posts over many years by Pudge.

"It is the common fate of the indolent to see their rights become a prey to the active. The condition upon which God hath given liberty to man is eternal vigilance; which condition if he break, servitude is at once the consequence of his crime and the punishment of his guilt."

About this Entry

This page contains a single entry by pudge published on April 2, 2003 2:24 PM.

Major Mac::Carbon Update Coming was the previous entry in this site.

Mac-Carbon-0.50 Released is the next entry in this site.

Find recent content on the main index or look in the archives to find all content.