Switching mail reader from VM to Gnus

I've been meaning to write this up from my notes for a while, on the off-chance that someone else in the world will find it useful. If you have some comments or suggestions (particularly with regard to the things that are still broken, please let me know.

This page describes the steps involved in switching from using VM as a mail reader to Gnus. I've set this up with:

... but I suspect it will work with later versions of them as well. I haven't tried to get the setup to work with XEmacs, since it doesn't seem to handle UTF-8 nearly so well as GNU Emacs.

For various reasons, I found this made my life much better, but this may well be far from the case for you. In particular, the following things might not suit you:

On the other hand:

The comprehensive Gnus manual is very useful, obviously. I've barely mentioned anything about actually using Gnus here, since it would just duplicate the manual. However, it is taking me a long time to get used to different keyboard shortcuts, and the very different style of working with mail.

You need a pretty recent version of Gnus for IMAP over SSL to work properly; I found Gnus 5.10.6 worked fine in this regard. If you need, to download that, compile it, and add it to your load path:

(setq load-path (cons (expand-file-name "~/elisp/gnus/lisp") load-path))

Then make sure that you're requiring 'gnus-load as well (require 'gnus-load) (both those line should be added to your .emacs

Next, you need to create a simple ~/.gnus file. That's set up to work for me on DICE computers in inf.ed.ac.uk - you should go through that line by line to make sure it makes sense for you. For example, change the email addresses, think about whether you want all your incoming and outgoing mail in one big "inbox" folder, etc. At home, where I get more mail, I've split them into folders called mail-1994, ..., mail-2005 and have an "other" catch-all folder for mail from people who use stupid Date: lines in their email.]

(If you try to use that file without having bbdb (the Insidious Big Brother database) installed then you'll get an error complaining about bbdb-insinuate-gnus. This may be in a separate package on your distribution, or you can download it from the site linked to earlier in this paragraph.)

By default Gnus wants to put mail in ~/Mail, so make sure that's on a partition with lots of space, symlinking to another directory if you need to.

You won't be subscribed to the "inbox" group the first time you start up, so once you've logged into the imap server, and it's fetched all your mail, you'll just get a blank Gnus Group page. To find the inbox group, do j inbox then u over the group to subscribe. Hitting RET will let you browse it.

First, import your old mail. This is described in the Gnus manual under Incorporating old mail, and I suggest you follow the instructions there.

So, following those suggestions, I respooled my old VM INBOX, sent-mail and older folders using that method. (Strangely, one of them had problems, and I had to strip out the first couple of messages with VM folder information in them before it worked.) Then you should unsubscribe from the nndoc folder groups you've just browsed.

Now if you view all the messages in inbox with C-u RET, they should all appear threaded and in the right order. However, if you only view 200, they'll be the last 200 that you spooled into there, rather than the last 200 chronologically, since that goes by the order in the mail folder. If that bothers you, you can enter the group viewing all the messages and then do M P b (to process-mark all messages) and B m inbox RET (to move all those messages back into the same group) which (rather hackily) has the effect of reordering the folder.

nnir and swish++

It's been a while since I set up my initial index, but I think it was done as described in /usr/share/doc/swish++/examples/email_indexing/Email-Indexing-Mini-Howto.txt.gz. One strange thing is that nnir.el calls search++ with a ~/Mail/swish++.conf configuration file parameter and complains if it's not there, or if it's empty. If you put a # on the first line, it's happy. Anyway, I built the index initially with:

index++ -v3 --index-file=/home/mark/Mail/swish++.index -e 'mail:*' -E 'Incomin*' -E '*~' -E '.overview' -E '.marks' /home/mark/Mail/

And added the following line to my crontab:


40 5 * * *      /usr/bin/index++ -v0 --incremental --index-file=/home/mark/Mail/swish++.index -e 'mail:*' -E 'Incomin*' -E '*~' -E '.overview' -E '.marks' /home/mark/Mail/ && mv /home/mark/Mail/swish++.index.new /home/mark/Mail/swish++.index

i.e. update the index every morning at 5:40am.

Now G G in the Group buffer searches all my mail *ever*. :)

Incoming* files?

If you find your Emacs crashes before spooling fetched mail, for some reason, the mail might be left in a file called something like /Mail/IncomingXXXXX. If that happens, you can browse the file an an nndoc folder with C-U G f (select the Incoming file) (select "mbox"); process-mark all messages with M P a; use B r to respool all the messages and delete the Incoming file by hand.

Finally...

If you're happy with all that, add (error "You're forgetting to use Gnus instead.") to the top of your .vm file :-)

Things That Are Still Broken

When respooling mail for one reason or another, I've ended up with many, many duplicate articles in my nnml directories. Ideally I'd like to delete these, but there doesn't seem to be a simple way to do this. The normal suggestion seems to be to process-mark all the messages in a folder and the respool them all with B r.

Some other suggestions, such as writing a script that finds duplicate messages and deletes both the file and the corresponding entry in the .overview file, didn't work for me - I wrote a similar script but ended up with the duplicate articles still in the group, and lots of "article is missing" error when I look at them. gnus-regenerate-nov-databases doesn't seem to fix that at all, either.

I suppose I need to write a function like this one. However, gnus-suppress-duplicates doesn't seem to work for me at all. For instance, I would have hoped that this would work:

C-u RET RET
M P b (mark all duplicates)
M-& (next command applies to marked messages)
M-u (mark as unread)
q (to go back to the group buffer)
M-x set-variable RET gnus-suppress-duplicates RET t RET
C-u RET RET (to enter the group)

As far as I understand it, duplicates *should* be marked, but aren't after entering a group of unread articles with gnus-suppress-duplicates set to t (The plan would have then been to mark all read messages, and delete them with M-& B backspace.)