From fschmitt Sat Mar 22 18:13:00 2003
From: faq@my.gnus.org (Gnus FAQ team)
Date: Sat Mar 22 18:13:00 2003
-Subject: Gnus FAQ
-Message-ID: <lars-doc8@eyesore.no>
-
-This is the text version of the Gnus FAQ, see http://my.gnus.org for
-the up to date version of this document, there you can also find a
-html version and various other formats. There's also a texinfo version
-of the FAQ distributed with Gnus.
-
-Table of Contents
-
-Introduction
-Frequently Asked Questions with Answers
-Glossary
-
-Abstract
-
-This is the new Gnus Frequently Asked Questions list. If you have a
-Web browser, the official hypertext version is at http://
-my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/], the Docbook source is
-available from http://sourceforge.net [http://sourceforge.net/
-projects/gnus/].
-
-Please submit features and suggestions to the FAQ discussion list
-[mailto:faq-discuss@my.gnus.org]. The list is protected against
-junk mail with qconfirm [http://smarden.org/qconfirm/index.html].
-As a subscriber, your submissions will automatically pass. You can
-also subscribe to the list by sending a blank email to
-faq-discuss-subscribe@my.gnus.org
-[mailto:faq-discuss-subscribe@my.gnus.org] and browse the archive.
-
-Introduction
-
-This is the Gnus Frequently Asked Questions list.
-
-Gnus is a Usenet Newsreader and Electronic Mail User Agent
-implemented as a part of Emacs. It's been around in some form for
-almost a decade now, and has been distributed as a standard part of
-Emacs for much of that time. Gnus 5 is the latest (and greatest)
-incarnation. The original version was called GNUS, and was written
-by Masanobu UMEDA. When autumn crept up in '94, Lars Magne
-Ingebrigtsen grew bored and decided to rewrite Gnus.
-
-Its biggest strength is the fact that it is extremely customizable.
-It is somewhat intimidating at first glance, but most of the
-complexity can be ignored until you're ready to take advantage of
-it. If you receive a reasonable volume of e-mail (you're on various
-mailing lists), or you would like to read high-volume mailing lists
-but cannot keep up with them, or read high volume newsgroups or are
-just bored, then Gnus is what you want.
-
-This FAQ was maintained by Justin Sheehy until March 2002. He would
-like to thank Steve Baur and Per Abrahamsen for doing a wonderful
-job with this FAQ before him. We would like to do the same -
-thanks, Justin!
-
-If you have a Web browser, the official hypertext version is at:
-http://my.gnus.org/FAQ/ [http://my.gnus.org/FAQ/]. This version is
-much nicer than the unofficial hypertext versions that are archived
-at Utrecht, Oxford, Smart Pages, Ohio State, and other FAQ
-archives. See the resources question below if you want information
-on obtaining it in another format.
-
-The information contained here was compiled with the assistance of
-the Gnus development mailing list, and any errors or misprints are
-the my.gnus.org team's fault, sorry.
-
-Frequently Asked Questions with Answers
-
-1. Installation FAQ
-
- 1.1. What is the latest version of Gnus?
- 1.2. What's new in 5.10.0?
- 1.3. Where and how to get Gnus?
- 1.4. What to do with the tarball now?
- 1.5. Which version of Emacs do I need?
- 1.6. How do I run Gnus on both Emacs and XEmacs?
-
-2. Startup / Group buffer
-
- 2.1. Every time I start Gnus I get a message "Gnus auto-save
- file exists. Do you want to read it?", what does this mean
- and how to prevent it?
- 2.2. Gnus doesn't remember which groups I'm subscribed to,
- what's this?
- 2.3. How to change the format of the lines in Group buffer?
- 2.4. My group buffer becomes a bit crowded, is there a way to
- sort my groups into categories so I can easier browse
- through them?
- 2.5. How to manually sort the groups in Group buffer? How to
- sort the groups in a topic?
-
-3. Getting Messages
-
- 3.1. I just installed Gnus, started it via M-x gnus but it only
- says "nntp (news) open error", what to do?
- 3.2. I'm working under Windows and have no idea what ~/.gnus
- means.
- 3.3. My news server requires authentication, how to store user
- name and password on disk?
- 3.4. Gnus seems to start up OK, but I can't find out how to
- subscribe to a group.
- 3.5. Gnus doesn't show all groups / Gnus says I'm not allowed
- to post on this server as well as I am, what's that?
- 3.6. I want Gnus to fetch news from several servers, is this
- possible?
- 3.7. And how about local spool files?
- 3.8. OK, reading news works now, but I want to be able to read
- my mail with Gnus, too. How to do it?
- 3.9. And what about IMAP?
- 3.10. At the office we use one of those MS Exchange servers,
- can I use Gnus to read my mail from it?
- 3.11. Can I tell Gnus not to delete the mails on the server it
- retrieves via POP3?
-
-4. Reading messages
-
- 4.1. When I enter a group, all read messages are gone. How to
- view them again?
- 4.2. How to tell Gnus to show an important message every time I
- enter a group, even when it's read?
- 4.3. How to view the headers of a message?
- 4.4. How to view the raw unformatted message?
- 4.5. How can I change the headers Gnus displays by default at
- the top of the article buffer?
- 4.6. I'd like Gnus NOT to render HTML-mails but show me the
- text part if it's available. How to do it?
- 4.7. Can I use some other browser than w3 to render my
- HTML-mails?
- 4.8. Is there anything I can do to make poorly formatted mails
- more readable?
- 4.9. Is there a way to automatically ignore posts by specific
- authors or with specific words in the subject? And can I
- highlight more interesting ones in some way?
- 4.10. How can I disable threading in some (e.g. mail-) groups,
- or set other variables specific for some groups?
- 4.11. Can I highlight messages written by me and follow-ups to
- those?
- 4.12. The number of total messages in a group which Gnus
- displays in group buffer is by far to high, especially in
- mail groups. Is this a bug?
- 4.13. I don't like the layout of summary and article buffer,
- how to change it? Perhaps even a three pane display?
- 4.14. I don't like the way the Summary buffer looks, how to
- tweak it?
- 4.15. How to split incoming mails in several groups?
-
-5. Composing messages
-
- 5.1. What are the basic commands I need to know for sending
- mail and postings?
- 5.2. How to enable automatic word-wrap when composing messages?
- 5.3. How to set stuff like From, Organization, Reply-To,
- signature...?
- 5.4. Can I set things like From, Signature etc group based on
- the group I post too?
- 5.5. Is there a spell-checker? Perhaps even on-the-fly
- spell-checking?
- 5.6. Can I set the dictionary based on the group I'm posting
- to?
- 5.7. Is there some kind of address-book, so I needn't remember
- all those email addresses?
- 5.8. Sometimes I see little images at the top of article
- buffer. What's that and how can I send one with my
- postings, too?
- 5.9. Sometimes I accidentally hit r instead of f in newsgroups.
- Can Gnus warn me, when I'm replying by mail in newsgroups?
- 5.10. How to tell Gnus not to generate a sender header?
- 5.11. I want gnus to locally store copies of my send mail and
- news, how to do it?
- 5.12. People tell me my Message-IDs are not correct, why aren't
- they and how to fix it?
-
-6. Old messages
-
- 6.1. How to import my old mail into Gnus?
- 6.2. How to archive interesting messages?
- 6.3. How to search for a specific message?
- 6.4. How to get rid of old unwanted mail?
- 6.5. I want that all read messages are expired (at least in
- some groups). How to do it?
- 6.6. I don't want expiration to delete my mails but to move
- them to another group.
-
-7. Gnus in a dial-up environment
-
- 7.1. I don't have a permanent connection to the net, how can I
- minimize the time I've got to be connected?
- 7.2. So what was this thing about the Agent?
- 7.3. I want to store article bodies on disk, too. How to do it?
- 7.4. How to tell Gnus not to try to send mails / postings while
- I'm offline?
-
-8. Getting help
-
- 8.1. How to find information and help inside Emacs?
- 8.2. I can't find anything in the Gnus manual about X (e.g.
- attachments, PGP, MIME...), is it not documented?
- 8.3. Which websites should I know?
- 8.4. Which mailing lists and newsgroups are there?
- 8.5. Where to report bugs?
- 8.6. I need real-time help, where to find it?
-
-9. Tuning Gnus
-
- 9.1. Starting Gnus is really slow, how to speed it up?
- 9.2. How to speed up the process of entering a group?
- 9.3. Sending mail becomes slower and slower, what's up?
-
-1. Installation FAQ
-
-1.1. What is the latest version of Gnus?
-
- Jingle please: Gnus 5.10.0 is released, get it while it's hot! As
- well as the step in version number is rather small, Gnus 5.10 has
- tons of new features which you shouldn't miss, however if you are
- cautious, you might prefer to stay with 5.8.8 respectively 5.9
- (they are basically the same) until some bugfix releases are out.
-
-1.2. What's new in 5.10.0?
-
- First of all, you should have a look into the file GNUS-NEWS in the
- toplevel directory of the Gnus tarball, there the most important
- changes are listed. Here's a short list of the changes I find
- especially important/interesting:
-
- * Major rewrite of the Gnus agent, Gnus agent is now active by
- default.
-
- Many new article washing functions for dealing with ugly
- formatted articles.
-
- Anti Spam features.
-
- message-utils now included in Gnus.
-
- New format specifiers for summary lines, e.g. %B for a complex
- trn-style thread tree.
-
-1.3. Where and how to get Gnus?
-
- The latest released version of Gnus isn't included in Emacs 21 and
- until now it also isn't available through the package system of
- XEmacs 21.4, therefor you should get the Gnus tarball from http://
- www.gnus.org/dist/gnus.tar.gz [http://www.gnus.org/dist/
- gnus.tar.gz] or via anonymous FTP from ftp://ftp.gnus.org/pub/gnus/
- gnus.tar.gz [ftp://ftp.gnus.org/pub/gnus/gnus.tar.gz].
-
-1.4. What to do with the tarball now?
-
- Untar it via tar xvzf gnus.tar.gz and do the common ./configure;
- make; make install circle. (under MS-Windows either get the Cygwin
- environment from http://www.cygwin.com [http://www.cygwin.com]
- which allows you to do what's described above or unpack the tarball
- with some packer (e.g. Winace from http://www.winace.com [http://
- www.winace.com]) and use the batch-file make.bat included in the
- tarball to install Gnus. If you don't want to (or aren't allowed
- to) install Gnus system-wide, you can install it in your home
- directory and add the following lines to your ~/.xemacs/init.el or
- ~/.emacs:
-
- (add-to-list 'load-path "/path/to/gnus/lisp")
- (if (featurep 'xemacs)
- (add-to-list 'Info-directory-list "/path/to/gnus/texi/")
- (add-to-list 'Info-default-directory-list "/path/to/gnus/texi/"))
-
-
- Make sure that you don't have any gnus related stuff before this
- line, on MS Windows use something like "C:/path/to/lisp" (yes, "/
- ").
-
-1.5. Which version of Emacs do I need?
-
- Gnus 5.10.0 requires an Emacs version that is greater than or equal
- to Emacs 20.7 or XEmacs 21.1.
-
-1.6. How do I run Gnus on both Emacs and XEmacs?
-
- You can't use the same copy of Gnus in both as the Lisp files are
- byte-compiled to a format which is different depending on which
- Emacs did the compilation. Get one copy of Gnus for Emacs and one
- for XEmacs.
-
-2. Startup / Group buffer
-
-2.1. Every time I start Gnus I get a message "Gnus auto-save file
- exists. Do you want to read it?", what does this mean and how to
- prevent it?
-
- This message means that the last time you used Gnus, it wasn't
- properly exited and therefor couldn't write its informations to
- disk (e.g. which messages you read), you are now asked if you want
- to restore those informations from the auto-save file.
-
- To prevent this message make sure you exit Gnus via q in group
- buffer instead of just killing Emacs.
-
-2.2. Gnus doesn't remember which groups I'm subscribed to, what's this?
-
- You get the message described in the q/a pair above while starting
- Gnus, right? It's an other symptom for the same problem, so read
- the answer above.
-
-2.3. How to change the format of the lines in Group buffer?
-
- You've got to tweak the value of the variable
- gnus-group-line-format. See the manual node "Group Line
- Specification" for information on how to do this. An example for
- this (guess from whose .gnus :-)):
-
- (setq gnus-group-line-format "%P%M%S[%5t]%5y : %(%g%)\n")
-
-
-2.4. My group buffer becomes a bit crowded, is there a way to sort my
- groups into categories so I can easier browse through them?
-
- Gnus offers the topic mode, it allows you to sort your groups in,
- well, topics, e.g. all groups dealing with Linux under the topic
- linux, all dealing with music under the topic music and all dealing
- with scottish music under the topic scottish which is a subtopic of
- music.
-
- To enter topic mode, just hit t while in Group buffer. Now you can
- use T n to create a topic at point and T m to move a group to a
- specific topic. For more commands see the manual or the menu. You
- might want to include the %P specifier at the beginning of your
- gnus-group-line-format variable to have the groups nicely indented.
-
-2.5. How to manually sort the groups in Group buffer? How to sort the
- groups in a topic?
-
- Move point over the group you want to move and hit C-k, now move
- point to the place where you want the group to be and hit C-y.
-
-3. Getting Messages
-
-3.1. I just installed Gnus, started it via M-x gnus but it only says
- "nntp (news) open error", what to do?
-
- You've got to tell Gnus where to fetch the news from. Read the
- documentation for information on how to do this. As a first start,
- put those lines in ~/.gnus:
-
- (setq gnus-select-method '(nntp "news.yourprovider.net"))
- (setq user-mail-address "you@yourprovider.net")
- (setq user-full-name "Your Name")
-
-
-3.2. I'm working under Windows and have no idea what ~/.gnus means.
-
- The ~/ means the home directory where Gnus and Emacs look for the
- configuration files. However, you don't really need to know what
- this means, it suffices that Emacs knows what it means :-) You can
- type C-x C-f ~/.gnus RET (yes, with the forward slash, even on
- Windows), and Emacs will open the right file for you. (It will most
- likely be new, and thus empty.) However, I'd discourage you from
- doing so, since the directory Emacs chooses will most certainly not
- be what you want, so let's do it the correct way. The first thing
- you've got to do is to create a suitable directory (no blanks in
- directory name please) e.g. c:\myhome. Then you must set the
- environment variable HOME to this directory. To do this under Win9x
- or Me include the line
-
- SET HOME=C:\myhome
-
-
- in your autoexec.bat and reboot. Under NT, 2000 and XP, hit
- Winkey+Pause/Break to enter system options (if it doesn't work, go
- to Control Panel -> System). There you'll find the possibility to
- set environment variables, create a new one with name HOME and
- value C:\myhome, a reboot is not necessary.
-
- Now to create ~/.gnus, say C-x C-f ~/.gnus RET C-x C-s. in Emacs.
-
-3.3. My news server requires authentication, how to store user name and
- password on disk?
-
- Create a file ~/.authinfo which includes for each server a line
- like this
-
- machine news.yourprovider.net login YourUserName password YourPassword
-
- . Make sure that the file isn't readable to others if you work on a
- OS which is capable of doing so. (Under Unix say
-
- chmod 600 ~/.authinfo
-
- in a shell.)
-
-3.4. Gnus seems to start up OK, but I can't find out how to subscribe to
- a group.
-
- If you know the name of the group say U name.of.group RET in group
- buffer (use the tab-completion Luke). Otherwise hit ^ in group
- buffer, this brings you to the server buffer. Now place point (the
- cursor) over the server which carries the group you want, hit RET,
- move point to the group you want to subscribe to and say u to
- subscribe to it.
-
-3.5. Gnus doesn't show all groups / Gnus says I'm not allowed to post on
- this server as well as I am, what's that?
-
- Some providers allow restricted anonymous access and full access
- only after authorization. To make Gnus send authinfo to those
- servers append
-
- force yes
-
- to the line for those servers in ~/.authinfo.
-
-3.6. I want Gnus to fetch news from several servers, is this possible?
-
- Of course. You can specify more sources for articles in the
- variable gnus-secondary-select-methods. Add something like this in
- ~/.gnus:
-
- (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourSecondProvider.net"))
- (add-to-list 'gnus-secondary-select-methods '(nntp "news.yourThirdProvider.net"))
-
-
-3.7. And how about local spool files?
-
- No problem, this is just one more select method called nnspool, so
- you want this:
-
- (add-to-list 'gnus-secondary-select-methods '(nnspool ""))
-
-
- Or this if you don't want an NNTP Server as primary news source:
-
- (setq gnus-select-method '(nnspool ""))
-
-
- Gnus will look for the spool file in /usr/spool/news, if you want
- something different, change the line above to something like this:
-
- (add-to-list 'gnus-secondary-select-methods
- '(nnspool "" (nnspool-directory "/usr/local/myspoolddir")))
-
-
- This sets the spool directory for this server only. You might have
- to specify more stuff like the program used to post articles, see
- the Gnus manual on how to do this.
-
-3.8. OK, reading news works now, but I want to be able to read my mail
- with Gnus, too. How to do it?
-
- That's a bit harder since there are many possible sources for mail,
- many possible ways for storing mail and many different ways for
- sending mail. The most common cases are these: 1: You want to read
- your mail from a pop3 server and send them directly to a SMTP
- Server 2: Some program like fetchmail retrieves your mail and
- stores it on disk from where Gnus shall read it. Outgoing mail is
- sent by Sendmail, Postfix or some other MTA. Sometimes, you even
- need a combination of the above cases.
-
- However, the first thing to do is to tell Gnus in which way it
- should store the mail, in Gnus terminology which back end to use.
- Gnus supports many different back ends, the most commonly used one
- is nnml. It stores every mail in one file and is therefor quite
- fast. However you might prefer a one file per group approach if
- your file system has problems with many small files, the nnfolder
- back end is then probably the choice for you. To use nnml add the
- following to ~/.gnus:
-
- (add-to-list 'gnus-secondary-select-methods '(nnml ""))
-
-
- As you might have guessed, if you want nnfolder, it's
-
- (add-to-list 'gnus-secondary-select-methods '(nnfolder ""))
-
-
- Now we need to tell Gnus, where to get it's mail from. If it's a
- POP3 server, then you need something like this:
-
- (eval-after-load "mail-source"
- '(add-to-list 'mail-sources '(pop :server "pop.YourProvider.net"
- :user "yourUserName"
- :password "yourPassword"))
-
-
- Make sure ~/.gnus isn't readable to others if you store your
- password there. If you want to read your mail from a traditional
- spool file on your local machine, it's
-
- (eval-after-load "mail-source"
- '(add-to-list 'mail-sources '(file :path "/path/to/spool/file"))
-
-
- If it's a Maildir, with one file per message as used by postfix,
- Qmail and (optionally) fetchmail it's
-
- (eval-after-load "mail-source"
- '(add-to-list 'mail-sources '(maildir :path "/path/to/Maildir/"
- :subdirs ("cur" "new")))
-
-
- And finally if you want to read your mail from several files in one
- directory, for example because procmail already split your mail,
- it's
-
- (eval-after-load "mail-source"
- '(add-to-list 'mail-sources '(directory :path "/path/to/procmail-dir/"
- :suffix ".prcml"))
-
-
- Where :suffix ".prcml" tells Gnus only to use files with the suffix
- .prcml.
-
- OK, now you only need to tell Gnus how to send mail. If you want to
- send mail via sendmail (or whichever MTA is playing the role of
- sendmail on your system), you don't need to do anything. However,
- if you want to send your mail to an SMTP Server you need the
- following in your ~/.gnus
-
- (setq send-mail-function 'smtpmail-send-it)
- (setq message-send-mail-function 'smtpmail-send-it)
- (setq smtpmail-default-smtp-server "smtp.yourProvider.net")
-
-
-3.9. And what about IMAP?
-
- There are two ways of using IMAP with Gnus. The first one is to use
- IMAP like POP3, that means Gnus fetches the mail from the IMAP
- server and stores it on disk. If you want to do this (you don't
- really want to do this) add the following to ~/.gnus
-
- (add-to-list 'mail-sources '(imap :server "mail.mycorp.com"
- :user "username"
- :pass "password"
- :stream network
- :authentication login
- :mailbox "INBOX"
- :fetchflag "\\Seen"))
-
-
- You might have to tweak the values for stream and/or
- authentification, see the Gnus manual node "Mail Source Specifiers"
- for possible values.
-
- If you want to use IMAP the way it's intended, you've got to follow
- a different approach. You've got to add the nnimap back end to your
- select method and give the information about the server there.
-
- (add-to-list 'gnus-secondary-select-methods
- '(nnimap "Give the baby a name"
- (nnimap-address "imap.yourProvider.net")
- (nnimap-port 143)
- (nnimap-list-pattern "archive.*")))
-
-
- Again, you might have to specify how to authenticate to the server
- if Gnus can't guess the correct way, see the Manual Node "IMAP" for
- detailed information.
-
-3.10. At the office we use one of those MS Exchange servers, can I use
- Gnus to read my mail from it?
-
- Offer your administrator a pair of new running shoes for activating
- IMAP on the server and follow the instructions above.
-
-3.11. Can I tell Gnus not to delete the mails on the server it retrieves
- via POP3?
-
- First of all, that's not the way POP3 is intended to work, if you
- have the possibility, you should use the IMAP Protocol if you want
- your messages to stay on the server. Nevertheless there might be
- situations where you need the feature, but sadly Gnus itself has no
- predefined functionality to do so.
-
- However this is Gnus county so there are possibilities to achieve
- what you want. The easiest way is to get an external program which
- retrieves copies of the mail and stores them on disk, so Gnus can
- read it from there. On Unix systems you could use e.g. fetchmail
- for this, on MS Windows you can use Hamster, an excellent local
- news and mail server.
-
- The other solution would be, to replace the method Gnus uses to get
- mail from POP3 servers by one which is capable of leaving the mail
- on the server. If you use XEmacs, get the package mail-lib, it
- includes an enhanced pop3.el, look in the file, there's
- documentation on how to tell Gnus to use it and not to delete the
- retrieved mail. For GNU Emacs look for the file epop3.el which can
- do the same (If you know the home of this file, please send me an
- e-mail). You can also tell Gnus to use an external program (e.g.
- fetchmail) to fetch your mail, see the info node "Mail Source
- Specifiers" in the Gnus manual on how to do it.
-
-4. Reading messages
-
-4.1. When I enter a group, all read messages are gone. How to view them
- again?
-
- If you enter the group by saying RET in summary buffer with point
- over the group, only unread and ticked messages are loaded. Say C-u
- RET instead to load all available messages. If you want only the
- e.g. 300 newest say C-u 300 RET
-
- Loading only unread messages can be annoying if you have threaded
- view enabled, say
-
- (setq gnus-fetch-old-headers 'some)
-
-
- in ~/.gnus to load enough old articles to prevent teared threads,
- replace 'some with t to load all articles (Warning: Both settings
- enlarge the amount of data which is fetched when you enter a group
- and slow down the process of entering a group).
-
- If you already use Gnus 5.10.0, you can say /o N In summary buffer
- to load the last N messages, this feature is not available in 5.8.8
-
- If you don't want all old messages, but the parent of the message
- you're just reading, you can say ^, if you want to retrieve the
- whole thread the message you're just reading belongs to, A T is
- your friend.
-
-4.2. How to tell Gnus to show an important message every time I enter a
- group, even when it's read?
-
- You can tick important messages. To do this hit u while point is in
- summary buffer over the message. When you want to remove the mark,
- hit either d (this deletes the tick mark and set's unread mark) or
- M c (which deletes all marks for the message).
-
-4.3. How to view the headers of a message?
-
- Say t to show all headers, one more t hides them again.
-
-4.4. How to view the raw unformatted message?
-
- Say C-u g to show the raw message g returns to normal view.
-
-4.5. How can I change the headers Gnus displays by default at the top of
- the article buffer?
-
- The variable gnus-visible-headers controls which headers are shown,
- its value is a regular expression, header lines which match it are
- shown. So if you want author, subject, date, and if the header
- exists, Followup-To and MUA / NUA say this in ~/.gnus:
-
- (setq gnus-visible-headers
- "^\\(From:\\|Subject:\\|Date:\\|Followup-To:\\|X-Newsreader:\\|User-Agent:\\|X-Mailer:\\)")
-
-
-4.6. I'd like Gnus NOT to render HTML-mails but show me the text part if
- it's available. How to do it?
-
- Say
-
- (eval-after-load "mm-decode"
- '(progn
- (add-to-list 'mm-discouraged-alternatives "text/html")
- (add-to-list 'mm-discouraged-alternatives "text/richtext")))
-
-
- in ~/.gnus. If you don't want HTML rendered, even if there's no
- text alternative add
-
- (setq mm-automatic-display (remove "text/html" mm-automatic-display))
-
-
- too.
-
-4.7. Can I use some other browser than w3 to render my HTML-mails?
-
- Only if you use Gnus 5.10.0 or younger. In this case you've got the
- choice between w3, w3m, links, lynx and html2text, which one is
- used can be specified in the variable mm-text-html-renderer, so if
- you want links to render your mail say
-
- (setq mm-text-html-renderer 'links)
-
-
-4.8. Is there anything I can do to make poorly formatted mails more
- readable?
-
- Gnus offers you several functions to "wash" incoming mail, you can
- find them if you browse through the menu, item Article->Washing.
- The most interesting ones are probably "Wrap long lines" ( W w ),
- "Decode ROT13" ( W r ) and "Outlook Deuglify" which repairs the
- dumb quoting used by many users of Microsoft products ( W Y f gives
- you full deuglify. See W Y C-h or have a look at the menus for
- other deuglifications). Outlook deuglify is only available since
- Gnus 5.10.0.
-
-4.9. Is there a way to automatically ignore posts by specific authors or
- with specific words in the subject? And can I highlight more
- interesting ones in some way?
-
- You want Scoring. Scoring means, that you define rules which assign
- each message an integer value. Depending on the value the message
- is highlighted in summary buffer (if it's high, say +2000) or
- automatically marked read (if the value is low, say -800) or some
- other action happens.
-
- There are basically three ways of setting up rules which assign the
- scoring-value to messages. The first and easiest way is to set up
- rules based on the article you are just reading. Say you're reading
- a message by a guy who always writes nonsense and you want to
- ignore his messages in the future. Hit L, to set up a rule which
- lowers the score. Now Gnus asks you which the criteria for lowering
- the Score shall be. Hit ? twice to see all possibilities, we want a
- which means the author (the from header). Now Gnus wants to know
- which kind of matching we want. Hit either e for an exact match or
- s for substring-match and delete afterwards everything but the name
- to score down all authors with the given name no matter which email
- address is used. Now you need to tell Gnus when to apply the rule
- and how long it should last, hit e.g. p to apply the rule now and
- let it last forever. If you want to raise the score instead of
- lowering it say I instead of L.
-
- You can also set up rules by hand. To do this say V f in summary
- buffer. Then you are asked for the name of the score file, it's
- name.of.group.SCORE for rules valid in only one group or all.Score
- for rules valid in all groups. See the Gnus manual for the exact
- syntax, basically it's one big list whose elements are lists again.
- the first element of those lists is the header to score on, then
- one more list with what to match, which score to assign, when to
- expire the rule and how to do the matching. If you find me very
- interesting, you could e.g. add the following to your all.Score:
-
- (("references" ("hschmi22.userfqdn.rz-online.de" 500 nil s))
- ("message-id" ("hschmi22.userfqdn.rz-online.de" 999 nil s)))
-
-
- This would add 999 to the score of messages written by me and 500
- to the score of messages which are a (possibly indirect) answer to
- a message written by me. Of course nobody with a sane mind would do
- this :-)
-
- The third alternative is adaptive scoring. This means Gnus watches
- you and tries to find out what you find interesting and what
- annoying and sets up rules which reflect this. Adaptive scoring can
- be a huge help when reading high traffic groups. If you want to
- activate adaptive scoring say
-
- (setq gnus-use-adaptive-scoring t)
-
-
- in ~/.gnus.
-
-4.10. How can I disable threading in some (e.g. mail-) groups, or set
- other variables specific for some groups?
-
- While in group buffer move point over the group and hit G c, this
- opens a buffer where you can set options for the group. At the
- bottom of the buffer you'll find an item that allows you to set
- variables locally for the group. To disable threading enter
- gnus-show-threads as name of variable and nil as value. Hit button
- done at the top of the buffer when you're ready.
-
-4.11. Can I highlight messages written by me and follow-ups to those?
-
- Stop those "Can I ..." questions, the answer is always yes in Gnus
- Country :-). It's a three step process: First we make faces
- (specifications of how summary-line shall look like) for those
- postings, then we'll give them some special score and finally we'll
- tell Gnus to use the new faces. You can find detailed instructions
- on how to do it on my.gnus.org [http://my.gnus.org/Members/dzimmerm
- /HowTo%2C2002-07-25%2C1027619165012198456/view]
-
-4.12. The number of total messages in a group which Gnus displays in
- group buffer is by far to high, especially in mail groups. Is this
- a bug?
-
- No, that's a matter of design of Gnus, fixing this would mean
- reimplementation of major parts of Gnus' back ends. Gnus thinks
- "highest-article-number - lowest-article-number =
- total-number-of-articles". This works OK for Usenet groups, but if
- you delete and move many messages in mail groups, this fails. To
- cure the symptom, enter the group via C-u RET (this makes Gnus get
- all messages), then hit M P b to mark all messages and then say B m
- name.of.group to move all messages to the group they have been in
- before, they get new message numbers in this process and the count
- is right again (until you delete and move your mail to other groups
- again).
-
-4.13. I don't like the layout of summary and article buffer, how to
- change it? Perhaps even a three pane display?
-
- You can control the windows configuration by calling the function
- gnus-add-configuration. The syntax is a bit complicated but
- explained very well in the manual node "Window Layout". Some
- popular examples:
-
- Instead 25% summary 75% article buffer 35% summary and 65% article
- (the 1.0 for article means "take the remaining space"):
-
- (gnus-add-configuration '(article (vertical 1.0 (summary .35 point) (article 1.0))))
-
-
- A three pane layout, Group buffer on the left, summary buffer
- top-right, article buffer bottom-right:
-
- (gnus-add-configuration
- '(article
- (horizontal 1.0
- (vertical 25
- (group 1.0))
- (vertical 1.0
- (summary 0.25 point)
- (article 1.0)))))
- (gnus-add-configuration
- '(summary
- (horizontal 1.0
- (vertical 25
- (group 1.0))
- (vertical 1.0
- (summary 1.0 point)))))
-
-
-4.14. I don't like the way the Summary buffer looks, how to tweak it?
-
- You've got to play around with the variable
- gnus-summary-line-format. It's value is a string of symbols which
- stand for things like author, date, subject etc. A list of the
- available specifiers can be found in the manual node "Summary
- Buffer Lines" and the often forgotten node "Formatting Variables"
- and it's sub-nodes. There you'll find useful things like
- positioning the cursor and tabulators which allow you a summary in
- table form, but sadly hard tabulators are broken in 5.8.8.
-
- Since 5.10.0, Gnus offers you some very nice new specifiers, e.g.
- %B which draws a thread-tree and %&user-date which gives you a date
- where the details are dependent of the articles age. Here's an
- example which uses both:
-
- (setq gnus-summary-line-format ":%U%R %B %s %-60=|%4L |%-20,20f |%&user-date; \n")
-
-
- resulting in:
-
- :O Re: [Richard Stallman] rfc2047.el | 13 |Lars Magne Ingebrigt |Sat 23:06
- :O Re: Revival of the ding-patches list | 13 |Lars Magne Ingebrigt |Sat 23:12
- :R > Re: Find correct list of articles for a gro| 25 |Lars Magne Ingebrigt |Sat 23:16
- :O \-> ... | 21 |Kai Grossjohann | 0:01
- :R > Re: Cry for help: deuglify.el - moving stuf| 28 |Lars Magne Ingebrigt |Sat 23:34
- :O \-> ... | 115 |Raymond Scholz | 1:24
- :O \-> ... | 19 |Lars Magne Ingebrigt |15:33
- :O Slow mailing list | 13 |Lars Magne Ingebrigt |Sat 23:49
- :O Re: `@' mark not documented | 13 |Lars Magne Ingebrigt |Sat 23:50
- :R > Re: Gnus still doesn't count messages prope| 23 |Lars Magne Ingebrigt |Sat 23:57
- :O \-> ... | 18 |Kai Grossjohann | 0:35
- :O \-> ... | 13 |Lars Magne Ingebrigt | 0:56
-
-
-4.15. How to split incoming mails in several groups?
-
- Gnus offers two possibilities for splitting mail, the easy
- nnmail-split-methods and the more powerful Fancy Mail Splitting.
- I'll only talk about the first one, refer to the manual, node
- "Fancy Mail Splitting" for the latter.
-
- The value of nnmail-split-methods is a list, each element is a list
- which stands for a splitting rule. Each rule has the form "group
- where matching articles should go to", "regular expression which
- has to be matched", the first rule which matches wins. The last
- rule must always be a general rule (regular expression .*) which
- denotes where articles should go which don't match any other rule.
- If the folder doesn't exist yet, it will be created as soon as an
- article lands there. By default the mail will be send to all groups
- whose rules match. If you don't want that (you probably don't
- want), say
-
- (setq nnmail-crosspost nil)
-
-
- in ~/.gnus.
-
- An example might be better than thousand words, so here's my
- nnmail-split-methods. Note that I send duplicates in a special
- group and that the default group is spam, since I filter all mails
- out which are from some list I'm subscribed to or which are
- addressed directly to me before. Those rules kill about 80% of the
- Spam which reaches me (Email addresses are changed to prevent
- spammers from using them):
-
- (setq nnmail-split-methods
- '(("duplicates" "^Gnus-Warning:.*duplicate")
- ("XEmacs-NT" "^\\(To:\\|CC:\\).*localpart@xemacs.bla.*")
- ("Gnus-Tut" "^\\(To:\\|CC:\\).*localpart@socha.bla.*")
- ("tcsh" "^\\(To:\\|CC:\\).*localpart@mx.gw.bla.*")
- ("BAfH" "^\\(To:\\|CC:\\).*localpart@.*uni-muenchen.bla.*")
- ("Hamster-src" "^\\(CC:\\|To:\\).*hamster-sourcen@yahoogroups.\\(de\\|com\\).*")
- ("Tagesschau" "^From: tagesschau <localpart@www.tagesschau.bla>$")
- ("Replies" "^\\(CC:\\|To:\\).*localpart@Frank-Schmitt.bla.*")
- ("EK" "^From:.*\\(localpart@privateprovider.bla\\|localpart@workplace.bla\\).*")
- ("Spam" "^Content-Type:.*\\(ks_c_5601-1987\\|EUC-KR\\|big5\\|iso-2022-jp\\).*")
- ("Spam" "^Subject:.*\\(This really work\\|XINGA\\|ADV:\\|XXX\\|adult\\|sex\\).*")
- ("Spam" "^Subject:.*\\(\=\?ks_c_5601-1987\?\\|\=\?euc-kr\?\\|\=\?big5\?\\).*")
- ("Spam" "^X-Mailer:\\(.*BulkMailer.*\\|.*MIME::Lite.*\\|\\)")
- ("Spam" "^X-Mailer:\\(.*CyberCreek Avalanche\\|.*http\:\/\/GetResponse\.com\\)")
- ("Spam" "^From:.*\\(verizon\.net\\|prontomail\.com\\|money\\|ConsumerDirect\\).*")
- ("Spam" "^Delivered-To: GMX delivery to spamtrap@gmx.bla$")
- ("Spam" "^Received: from link2buy.com")
- ("Spam" "^CC: .*azzrael@t-online.bla")
- ("Spam" "^X-Mailer-Version: 1.50 BETA")
- ("Uni" "^\\(CC:\\|To:\\).*localpart@uni-koblenz.bla.*")
- ("Inbox" "^\\(CC:\\|To:\\).*\\(my\ name\\|address@one.bla\\|adress@two.bla\\)")
- ("Spam" "")))
-
-
-5. Composing messages
-
-5.1. What are the basic commands I need to know for sending mail and
- postings?
-
- To start composing a new mail hit m either in Group or Summary
- buffer, for a posting, it's either a in Group buffer and filling
- the Newsgroups header manually or a in the Summary buffer of the
- group where the posting shall be send to. Replying by mail is r if
- you don't want to cite the author, or import the cited text
- manually and R to cite the text of the original message. For a
- follow up to a newsgroup, it's f and F (analog to r and R.
-
- Enter new headers above the line saying "--text follows this
- line--", enter the text below the line. When ready hit C-c C-c, to
- send the message, if you want to finish it later hit C-c C-d to
- save it in the drafts group, where you can start editing it again
- by saying D e.
-
-5.2. How to enable automatic word-wrap when composing messages?
-
- Say
-
- (add-hook 'message-mode-hook
- (lambda ()
- (setq fill-column 72)
- (turn-on-auto-fill)))
-
-
- in ~/.gnus. You can reformat a paragraph by hitting M-q (as usual)
-
-5.3. How to set stuff like From, Organization, Reply-To, signature...?
-
- There are other ways, but you should use posting styles for this.
- (See below why). This example should make the syntax clear:
-
- (setq gnus-posting-styles
- '((".*"
- (name "Frank Schmitt")
- (address "me@there.bla")
- (organization "Hamme net, kren mer och nimmi")
- (signature-file "~/.signature")
- ("X-SampleHeader" "foobar")
- (eval (setq some-variable "Foo bar")))))
-
-
- The ".*" means that this settings are the default ones (see below),
- valid values for the first element of the following lists are
- signature, signature-file, organization, address, name or body. The
- attribute name can also be a string. In that case, this will be
- used as a header name, and the value will be inserted in the
- headers of the article; if the value is `nil', the header name will
- be removed. You can also say (eval (foo bar)), then the function
- foo will be evaluated with argument bar and the result will be
- thrown away.
-
-5.4. Can I set things like From, Signature etc group based on the group
- I post too?
-
- That's the strength of posting styles. Before, we used ".*" to set
- the default for all groups. You can use a regexp like "^gmane" and
- the following settings are only applied to postings you send to the
- gmane hierarchy, use ".*binaries" instead and they will be applied
- to postings send to groups containing the string binaries in their
- name etc.
-
- You can instead of specifying a regexp specify a function which is
- evaluated, only if it returns true, the corresponding settings take
- effect. Two interesting candidates for this are message-news-p
- which returns t if the current Group is a newsgroup and the
- corresponding message-mail-p.
-
- Note that all forms that match are applied, that means in the
- example below, when I post to gmane.mail.spam.spamassassin.general,
- the settings under ".*" are applied and the settings under
- message-news-p and those under "^gmane" and those under "^gmane\
- \.mail\\.spam\\.spamassassin\\.general$". Because of this put
- general settings at the top and specific ones at the bottom.
-
- (setq gnus-posting-styles
- '((".*" ;;default
- (name "Frank Schmitt")
- (organization "Hamme net, kren mer och nimmi")
- (signature-file "~/.signature") )
- ((message-news-p) ;;Usenet news?
- (address "mySpamTrap@Frank-Schmitt.bla")
- ("Reply-To" "hereRealRepliesOnlyPlease@Frank-Schmitt.bla") )
- ((message-mail-p) ;;mail?
- (address "usedForMails@Frank-Schmitt.bla") )
- ("^gmane" ;;this is mail, too in fact
- (address "usedForMails@Frank-Schmitt.net")
- ("Reply-To" nil) )
- ("^gmane.mail.spam.spamassassin.general$"
- (eval (setq mail-envelope-from "Azzrael@rz-online.de"))
- (address "Azzrael@rz-online.de")) ))
-
-
-5.5. Is there a spell-checker? Perhaps even on-the-fly spell-checking?
-
- You can use ispell.el to spell-check stuff in Emacs. So the first
- thing to do is to make sure that you've got either ispell [http://
- fmg-www.cs.ucla.edu/fmg-members/geoff/ispell.html] or aspell [http:
- //aspell.sourceforge.net/] installed and in your Path. Then you
- need ispell.el [http://www.kdstevens.com/~stevens/ispell-page.html]
- and for on-the-fly spell-checking flyspell.el [http://
- www-sop.inria.fr/mimosa/personnel/Manuel.Serrano/flyspell/
- flyspell.html]. Ispell.el is shipped with Gnus Emacs and available
- through the Emacs package system, flyspell.el is shipped with Emacs
- and part of XEmacs text-modes package which is available through
- the package system, so there should be no need to install them
- manually.
-
- Ispell.el assumes you use ispell, if you choose aspell say
-
- (setq ispell-program-name "aspell")
-
- in your Emacs configuration file.
-
- If you want your outgoing messages to be spell-checked, say
-
- (add-hook 'message-send-hook 'ispell-message)
-
- In your ~/.gnus, if you prefer on-the-fly spell-checking say
-
- (add-hook 'message-mode-hook (lambda () (flyspell-mode 1)))
-
-5.6. Can I set the dictionary based on the group I'm posting to?
-
- Yes, say something like
-
- (add-hook 'gnus-select-group-hook
- (lambda ()
- (cond
- ((string-match
- "^de\\." (gnus-group-real-name gnus-newsgroup-name))
- (ispell-change-dictionary "deutsch8"))
- (t
- (ispell-change-dictionary "english")))))
-
-
- in ~/.gnus. Change "^de\\." and "deutsch8" to something that suits
- your needs.
-
-5.7. Is there some kind of address-book, so I needn't remember all those
- email addresses?
-
- There's an very basic solution for this, mail aliases. You can
- store your mail addresses in a ~/.mailrc file using a simple alias
- syntax:
-
- alias al "Al <al@english-heritage.bla>"
-
-
- Then typing your alias (followed by a space or punctuation
- character) on a To: or Cc: line in the message buffer will cause
- gnus to insert the full address for you. See the node "Mail
- Aliases" in Message (not Gnus) manual for details.
-
- However, what you really want is the Insidious Big Brother Database
- bbdb. Get it through the XEmacs package system or from bbdb's
- homepage [http://bbdb.sourceforge.net/]. Now place the following in
- ~/.gnus, to activate bbdb for Gnus:
-
- (require 'bbdb)
- (bbdb-initialize 'gnus 'message)
-
-
- Now you probably want some general bbdb configuration, place them
- in ~/.emacs:
-
- (require 'bbdb)
- ;;If you don't live in Northern America, you should disable the
- ;;syntax check for telephone numbers by saying
- (setq bbdb-north-american-phone-numbers-p nil)
- ;;Tell bbdb about your email address:
- (setq bbdb-user-mail-names
- (regexp-opt '("Your.Email@here.bla"
- "Your.other@mail.there.bla")))
- ;;cycling while completing email addresses
- (setq bbdb-complete-name-allow-cycling t)
- ;;No popup-buffers
- (setq bbdb-use-pop-up nil)
-
-
- Now you should be ready to go. Say M-x bbdb RET RET to open a bbdb
- buffer showing all entries. Say c to create a new entry, b to
- search your BBDB and C-o to add a new field to an entry. If you
- want to add a sender to the BBDB you can also just hit `:' on the
- posting in the summary buffer and you are done. When you now
- compose a new mail, hit TAB to cycle through know recipients.
-
-5.8. Sometimes I see little images at the top of article buffer. What's
- that and how can I send one with my postings, too?
-
- Those images are called X-Faces. They are 48*48 pixel b/w pictures,
- encoded in a header line. If you want to include one in your posts,
- you've got to convert some image to a X-Face. So fire up some image
- manipulation program (say Gimp), open the image you want to
- include, cut out the relevant part, reduce color depth to 1 bit,
- resize to 48*48 and save as bitmap. Now you should get the compface
- package from this site [ftp://ftp.cs.indiana.edu:/pub/faces/]. and
- create the actual X-face by saying
-
- cat file.xbm | xbm2ikon |compface > file.face
- cat ./file.face | sed 's/\\/\\\\/g' | sed 's/\"/\\\"/g' > ./file.face.quoted
-
-
- if you can't use compface, there's an online X-face converter at
- http://www.dairiki.org/xface/ [http://www.dairiki.org/xface/]. If
- you use MS Windows, you could also use the WinFace program from
- http://www.xs4all.nl/~walterln/winface/ [http://www.xs4all.nl/
- ~walterln/winface/]. Now you only have to tell Gnus to include the
- X-face in your postings by saying
-
- (setq message-default-headers
- (with-temp-buffer
- (insert "X-Face: ")
- (insert-file-contents "~/.xemacs/xface")
- (buffer-string)))
-
-
- in ~/.gnus.
-
-5.9. Sometimes I accidentally hit r instead of f in newsgroups. Can Gnus
- warn me, when I'm replying by mail in newsgroups?
-
- Put this in ~/.gnus:
-
- (setq gnus-confirm-mail-reply-to-news t)
-
-
- if you already use Gnus 5.10.0, if you still use 5.8.8 or 5.9 try
- this instead:
-
- (defadvice gnus-summary-reply (around reply-in-news activate)
- (interactive)
- (when (or (not (gnus-news-group-p gnus-newsgroup-name))
- (y-or-n-p "Really reply? "))
- ad-do-it))
-
-
-5.10. How to tell Gnus not to generate a sender header?
-
- Since 5.10.0 Gnus doesn't generate a sender header by default. For
- older Gnus' try this in ~/.gnus:
-
- (eval-after-load "message"
- '(add-to-list 'message-syntax-checks '(sender . disabled)))
-
-
-5.11. I want gnus to locally store copies of my send mail and news, how
- to do it?
-
- You must set the variable gnus-message-archive-group to do this.
- You can set it to a string giving the name of the group where the
- copies shall go or like in the example below use a function which
- is evaluated and which returns the group to use.
-
- (setq gnus-message-archive-group
- '((if (message-news-p)
- "nnml:Send-News"
- "nnml:Send-Mail")))
-
-
-5.12. People tell me my Message-IDs are not correct, why aren't they and
- how to fix it?
-
- The message-ID is an unique identifier for messages you send. To
- make it unique, Gnus need to know which machine name to put after
- the "@". If the name of the machine where Gnus is running isn't
- suitable (it probably isn't at most private machines) you can tell
- Gnus what to use by saying:
-
- (defun message-make-message-id()
- (concat "<"(message-unique-id)"@yourmachine.yourdomain.tld>"))
-
-
- in ~/.gnus. If you have no idea what to insert for
- "yourmachine.yourdomain.tld", you've got several choices. You can
- either ask your provider if he allows you to use something like
- yourUserName.userfqdn.provider.net, or you can use
- somethingUnique.yourdomain.tld if you own the domain
- yourdomain.tld, or you can register at a service which gives
- private users a FQDN for free, e.g. http://www.stura.tu-freiberg.de
- /~dlx/addfqdn.html [http://www.stura.tu-freiberg.de/~dlx/
- addfqdn.html]. (Sorry but this website is in German, if you know of
- an English one offering the same, drop me a note).
-
- Finally you can tell Gnus not to generate a Message-ID for News at
- all (and letting the server do the job) by saying
-
- (setq message-required-news-headers
- (remove' Message-ID message-required-news-headers))
-
-
- you can also tell Gnus not to generate Message-IDs for mail by
- saying
-
- (setq message-required-mail-headers
- (remove' Message-ID message-required-mail-headers))
-
-
- , however some mail servers don't generate proper Message-IDs, too,
- so test if your Mail Server behaves correctly by sending yourself a
- Mail and looking at the Message-ID.
-
-6. Old messages
-
-6.1. How to import my old mail into Gnus?
-
- The easiest way is to tell your old mail program to export the
- messages in mbox format. Most Unix mailers are able to do this, if
- you come from the MS Windows world, you may find tools at http://
- mbx2mbox.sourceforge.net/ [http://mbx2mbox.sourceforge.net/].
-
- Now you've got to import this mbox file into Gnus. To do this,
- create a nndoc group based on the mbox file by saying G f /path/
- file.mbox RET in Group buffer. You now have read-only access to
- your mail. If you want to import the messages to your normal Gnus
- mail groups hierarchy, enter the nndoc group you've just created by
- saying C-u RET (thus making sure all messages are retrieved), mark
- all messages by saying M P b and either copy them to the desired
- group by saying B c name.of.group RET or send them through
- nnmail-split-methods (respool them) by saying B r.
-
-6.2. How to archive interesting messages?
-
- If you stumble across an interesting message, say in gnu.emacs.gnus
- and want to archive it there are several solutions. The first and
- easiest is to save it to a file by saying O f. However, wouldn't it
- be much more convenient to have more direct access to the archived
- message from Gnus? If you say yes, put this snippet by Frank Haun
- <pille3003@fhaun.de> in ~/.gnus:
-
- (defun my-archive-article (&optional n)
- "Copies one or more article(s) to a corresponding `nnml:' group, e.g.
- `gnus.ding' goes to `nnml:1.gnus.ding'. And `nnml:List-gnus.ding' goes
- to `nnml:1.List-gnus-ding'.
-
- Use process marks or mark a region in the summary buffer to archive
- more then one article."
- (interactive "P")
- (let ((archive-name
- (format
- "nnml:1.%s"
- (if (featurep 'xemacs)
- (replace-in-string gnus-newsgroup-name "^.*:" "")
- (replace-regexp-in-string "^.*:" "" gnus-newsgroup-name)))))
- (gnus-summary-copy-article n archive-name)))
-
-
- You can now say M-x my-archive-article in summary buffer to archive
- the article under the cursor in a nnml group. (Change nnml to your
- preferred back end)
-
- Of course you can also make sure the cache is enabled by saying
-
- (setq gnus-use-cache t)
-
-
- then you only have to set either the tick or the dormant mark for
- articles you want to keep, setting the read mark will remove them
- from cache.
-
-6.3. How to search for a specific message?
-
- There are several ways for this, too. For a posting from a Usenet
- group the easiest solution is probably to ask groups.google.com
- [http://groups.google.com], if you found the posting there, tell
- Google to display the raw message, look for the message-id, and say
- M-^ the@message.id RET in a summary buffer. Since Gnus 5.10.0
- there's also a Gnus interface for groups.google.com which you can
- call with G W) in group buffer.
-
- Another idea which works for both mail and news groups is to enter
- the group where the message you are searching is and use the
- standard Emacs search C-s, it's smart enough to look at articles in
- collapsed threads, too. If you want to search bodies, too try M-s
- instead. Further on there are the gnus-summary-limit-to-foo
- functions, which can help you, too.
-
- Of course you can also use grep to search through your local mail,
- but this is both slow for big archives and inconvenient since you
- are not displaying the found mail in Gnus. Here comes nnir into
- action. Nnir is a front end to search engines like swish-e or
- swish++ and others. You index your mail with one of those search
- engines and with the help of nnir you can search trough the indexed
- mail and generate a temporary group with all messages which met
- your search criteria. If this sound cool to you get nnir.el from
- ftp://ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/ [ftp://
- ls6-ftp.cs.uni-dortmund.de/pub/src/emacs/] or ftp://
- ftp.is.informatik.uni-duisburg.de/pub/src/emacs/ [ftp://
- ftp.is.informatik.uni-duisburg.de/pub/src/emacs/]. Instructions on
- how to use it are at the top of the file.
-
-6.4. How to get rid of old unwanted mail?
-
- You can of course just mark the mail you don't need anymore by
- saying # with point over the mail and then say B DEL to get rid of
- them forever. You could also instead of actually deleting them,
- send them to a junk-group by saying B m nnml:trash-bin which you
- clear from time to time, but both are not the intended way in Gnus.
-
- In Gnus, we let mail expire like news expires on a news server.
- That means you tell Gnus the message is expirable (you tell Gnus "I
- don't need this mail anymore") by saying E with point over the mail
- in summary buffer. Now when you leave the group, Gnus looks at all
- messages which you marked as expirable before and if they are old
- enough (default is older than a week) they are deleted.
-
-6.5. I want that all read messages are expired (at least in some
- groups). How to do it?
-
- If you want all read messages to be expired (e.g. in mailing lists
- where there's an online archive), you've got two choices:
- auto-expire and total-expire. Auto-expire means, that every article
- which has no marks set and is selected for reading is marked as
- expirable, Gnus hits E for you every time you read a message.
- Total-expire follows a slightly different approach, here all
- article where the read mark is set are expirable.
-
- To activate auto-expire, include auto-expire in the Group
- parameters for the group. (Hit G c in summary buffer with point
- over the group to change group parameters). For total-expire add
- total-expire to the group-parameters.
-
- Which method you choose is merely a matter of taste: Auto-expire is
- faster, but it doesn't play together with Adaptive Scoring, so if
- you want to use this feature, you should use total-expire.
-
- If you want a message to be excluded from expiration in a group
- where total or auto expire is active, set either tick (hit u) or
- dormant mark (hit u), when you use auto-expire, you can also set
- the read mark (hit d).
-
-6.6. I don't want expiration to delete my mails but to move them to
- another group.
-
- Say something like this in ~/.gnus:
-
- (setq nnmail-expiry-target "nnml:expired")
-
-
- (If you want to change the value of nnmail-expiry-target on a per
- group basis see the question "How can I disable threading in some
- (e.g. mail-) groups, or set other variables specific for some
- groups?")
-
-7. Gnus in a dial-up environment
-
-7.1. I don't have a permanent connection to the net, how can I minimize
- the time I've got to be connected?
-
- You've got basically two options: Either you use the Gnus Agent
- (see below) for this, or you can install programs which fetch your
- news and mail to your local disk and Gnus reads the stuff from your
- local machine.
-
- If you want to follow the second approach, you need a program which
- fetches news and offers them to Gnus, a program which does the same
- for mail and a program which receives the mail you write from Gnus
- and sends them when you're online.
-
- Let's talk about Unix systems first: For the news part, the easiest
- solution is a small nntp server like Leafnode [http://
- www.leafnode.org/] or sn [http://infa.abo.fi/~patrik/sn/], of
- course you can also install a full featured news server like inn
- [http://www.isc.org/products/INN/]. Then you want to fetch your
- Mail, popular choices are fetchmail [http://www.catb.org/~esr/
- fetchmail/] and getmail [http://www.qcc.ca/~charlesc/software/
- getmail-3.0/]. You should tell those to write the mail to your disk
- and Gnus to read it from there. Last but not least the mail sending
- part: This can be done with every MTA like sendmail [http://
- www.sendmail.org/], postfix [http://www.qmail.org/], exim [http://
- www.exim.org/] or qmail [http://www.qmail.org/].
-
- On windows boxes I'd vote for Hamster [http://www.tglsoft.de/],
- it's a small freeware, open-source program which fetches your mail
- and news from remote servers and offers them to Gnus (or any other
- mail and/or news reader) via nntp respectively POP3 or IMAP. It
- also includes a smtp server for receiving mails from Gnus.
-
-7.2. So what was this thing about the Agent?
-
- The Gnus agent is part of Gnus, it allows you to fetch mail and
- news and store them on disk for reading them later when you're
- offline. It kind of mimics offline newsreaders like e.g. Forte
- Agent. If you want to use the Agent place the following in ~/.gnus
- if you are still using 5.8.8 or 5.9 (it's the default since
- 5.10.0):
-
- (setq gnus-agent t)
-
-
- Now you've got to select the servers whose groups can be stored
- locally. To do this, open the server buffer (that is press ^ while
- in the group buffer). Now select a server by moving point to the
- line naming that server. Finally, agentize the server by typing J a
- . If you make a mistake, or change your mind, you can undo this
- action by typing J r. When you're done, type 'q' to return to the
- group buffer. Now the next time you enter a group on a agentized
- server, the headers will be stored on disk and read from there the
- next time you enter the group.
-
-7.3. I want to store article bodies on disk, too. How to do it?
-
- You can tell the agent to automatically fetch the bodies of
- articles which fulfill certain predicates, this is done in a
- special buffer which can be reached by saying J c in group buffer.
- Please refer to the documentation for information which predicates
- are possible and how exactly to do it.
-
- Further on you can tell the agent manually which articles to store
- on disk. There are two ways to do this: Number one: In the summary
- buffer, process mark a set of articles that shall be stored in the
- agent by saying # with point over the article and then type J s.
- The other possibility is to set, again in the summary buffer,
- downloadable (%) marks for the articles you want by typing @ with
- point over the article and then typing J u. What's the difference?
- Well, process marks are erased as soon as you exit the summary
- buffer while downloadable marks are permanent. You can actually set
- downloadable marks in several groups then use fetch session ('J s'
- in the GROUP buffer) to fetch all of those articles. The only
- downside is that fetch session also fetches all of the headers for
- every selected group on an agentized server. Depending on the
- volume of headers, the initial fetch session could take hours.
-
-7.4. How to tell Gnus not to try to send mails / postings while I'm
- offline?
-
- All you've got to do is to tell Gnus when you are online (plugged)
- and when you are offline (unplugged), the rest works automatically.
- You can toggle plugged/unplugged state by saying J j in group
- buffer. To start Gnus unplugged say M-x gnus-unplugged instead of
- M-x gnus. Note that for this to work, the agent must be active.
-
-8. Getting help
-
-8.1. How to find information and help inside Emacs?
-
- The first stop should be the Gnus manual (Say C-h i d m Gnus RET to
- start the Gnus manual, then walk through the menus or do a
- full-text search with s). Then there are the general Emacs help
- commands starting with C-h, type C-h ? ? to get a list of all
- available help commands and their meaning. Finally M-x
- apropos-command lets you search through all available functions and
- M-x apropos searches the bound variables.
-
-8.2. I can't find anything in the Gnus manual about X (e.g. attachments,
- PGP, MIME...), is it not documented?
-
- There's not only the Gnus manual but also the manuals for message,
- emacs-mime, sieve and pgg. Those packages are distributed with Gnus
- and used by Gnus but aren't really part of core Gnus, so they are
- documented in different info files, you should have a look in those
- manuals, too.
-
-8.3. Which websites should I know?
-
- The two most important ones are the official Gnus website [http://
- www.gnus.org]. and it's sister site my.gnus.org (MGO) [http://
- my.gnus.org], hosting an archive of lisp snippets, howtos, a (not
- really finished) tutorial and this FAQ.
-
- Tell me about other sites which are interesting.
-
-8.4. Which mailing lists and newsgroups are there?
-
- There's the newsgroup gnu.emacs.gnus (pull it from e.g.
- news.gnus.org) which deals with general questions and the ding
- mailing list (ding@gnus.org) dealing with development of Gnus. You
- can read the ding list via NNTP, too under the name gnus.ding from
- news.gnus.org.
-
- If you want to stay in the big8, news.software.newssreaders is also
- read by some Gnus users (but chances for qualified help are much
- better in the above groups) and if you speak German, there's
- de.comm.software.gnus.
-
-8.5. Where to report bugs?
-
- Say M-x gnus-bug, this will start a message to the gnus bug mailing
- list [mailto:bugs@gnus.org] including information about your
- environment which make it easier to help you.
-
-8.6. I need real-time help, where to find it?
-
- Point your IRC client to irc.my.gnus.org channel #mygnus. Don't be
- afraid if people there speak German, they are willing and capable
- of switching to English when people from outside Germany enter.
-
-9. Tuning Gnus
-
-9.1. Starting Gnus is really slow, how to speed it up?
-
- The reason for this could be the way Gnus reads it's active file,
- see the node "The Active File" in the Gnus manual for things you
- might try to speed the process up. An other idea would be to byte
- compile your ~/.gnus (say M-x byte-compile-file RET ~/.gnus RET to
- do it). Finally, if you have require statements in your .gnus, you
- could replace them with eval-after-load, which loads the stuff not
- at startup time, but when it's needed. Say you've got this in your
- ~/.gnus:
-
- (require 'message)
- (add-to-list 'message-syntax-checks '(sender . disabled))
-
-
- then as soon as you start Gnus, message.el is loaded. If you
- replace it with
-
- (eval-after-load "message"
- '(add-to-list 'message-syntax-checks '(sender . disabled)))
-
-
- it's loaded when it's needed.
-
-9.2. How to speed up the process of entering a group?
-
- A speed killer is setting the variable gnus-fetch-old-headers to
- anything different from nil, so don't do this if speed is an issue.
- To speed up building of summary say
-
- (gnus-compile)
-
-
- at the bottom of your ~/.gnus, this will make gnus byte-compile
- things like gnus-summary-line-format. then you could increase the
- value of gc-cons-threshold by saying something like
-
- (setq gc-cons-threshold 3500000)
-
-
- in ~/.emacs. If you don't care about width of CJK characters or use
- Gnus 5.10.0 or younger together with a recent GNU Emacs, you should
- say
-
- (setq gnus-use-correct-string-widths nil)
-
-
- in ~/.gnus (thanks to Jesper harder for the last two suggestions).
- Finally if you are still using 5.8.8 or 5.9 and experience speed
- problems with summary buffer generation, you definitely should
- update to 5.10.0 since there quite some work on improving it has
- been done.
-
-9.3. Sending mail becomes slower and slower, what's up?
-
- The reason could be that you told Gnus to archive the messages you
- wrote by setting gnus-message-archive-group. Try to use a nnml
- group instead of an archive group, this should bring you back to
- normal speed.
-
-Glossary
-
-~/.gnus
-
- When the term ~/.gnus is used it just means your Gnus
- configuration file. You might as well call it ~/.gnus.el or
- specify another name.
-
-Back End
-
- In Gnus terminology a back end is a virtual server, a layer
- between core Gnus and the real NNTP-, POP3-, IMAP- or
- whatever-server which offers Gnus a standardized interface to
- functions like "get message", "get Headers" etc.
-
-Emacs
+Subject: Gnus FAQ (Frequently Asked Questions)
+Message-ID: <lars-doc9@eyesore.no>
- When the term Emacs is used in this FAQ, it means either GNU
- Emacs or XEmacs.
+The Gnus FAQ is distributed within the Gnus manual. The home page of
+the Gnus FAQ is <URL:http://my.gnus.org/FAQ/>, where you can find the
+most recent version in HTML various other formats.
-Message
+To browse the FAQ now, put the cursor at the end of the following line
+and press `C-x C-e':
- In this FAQ message means a either a mail or a posting to a
- Usenet Newsgroup or to some other fancy back end, no matter of
- which kind it is.
+ (info "(gnus)Frequently Asked Questions")
-MUA
+On older XEmacs version, use:
- MUA is an acronym for Mail User Agent, it's the program you use
- to read and write e-mails.
+ (Info-goto-node "(gnus)Frequently Asked Questions")
+
+Or simply use RET or the middle mouse button, if the above is displayed
+as a clickable button.
-NUA
- NUA is an acronym for News User Agent, it's the program you use
- to read and write Usenet news.
-;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting, remote processing, training through files
-
;;; spam.el --- Identifying spam
-;; Copyright (C) 2002, 2003 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
;; Keywords: network
;;; Several TODO items are marked as such
+;; TODO: spam scores, detection of spam in newsgroups, cross-server splitting,
+;; remote processing, training through files
+
;;; Code:
(require 'path-util)
(require 'gnus-uu) ; because of key prefix issues
;;; for the definitions of group content classification and spam processors
-(require 'gnus)
+(require 'gnus)
(require 'message) ;for the message-fetch-field functions
;; for nnimap-split-download-body-default
:group 'spam)
(defcustom spam-split-symbolic-return nil
- "Whether spam-split should work with symbols or group names."
+ "Whether `spam-split' should work with symbols or group names."
:type 'boolean
:group 'spam)
(defcustom spam-split-symbolic-return-positive nil
- "Whether spam-split should ALWAYS work with symbols or group
- names. Do not set this if you use spam-split in a fancy split
+ "Whether `spam-split' should ALWAYS work with symbols or group names.
+Do not set this if you use `spam-split' in a fancy split
method."
:type 'boolean
:group 'spam)
:group 'spam)
(defcustom spam-mark-only-unseen-as-spam t
- "Whether only unseen articles should be marked as spam in spam
-groups. When nil, all unread articles in a spam group are marked as
+ "Whether only unseen articles should be marked as spam in spam groups.
+When nil, all unread articles in a spam group are marked as
spam. Set this if you want to leave an article unread in a spam group
without losing it to the automatic spam-marking process."
:type 'boolean
:group 'spam)
(defcustom spam-mark-ham-unread-before-move-from-spam-group nil
- "Whether ham should be marked unread before it's moved out of a spam
-group according to ham-process-destination. This variable is an
-official entry in the international Longest Variable Name
+ "Whether ham should be marked unread before it's moved.
+The article is moved out of a spam group according to ham-process-destination.
+This variable is an official entry in the international Longest Variable Name
Competition."
:type 'boolean
:group 'spam)
(defcustom spam-disable-spam-split-during-ham-respool nil
- "Whether spam-split should be ignored while resplitting ham in
-a process destination. This is useful to prevent ham from ending
-up in the same spam group after the resplit. Don't set this to t
-if you have spam-split as the last rule in your split
-configuration."
+ "Whether `spam-split' should be ignored while resplitting ham in a process
+destination. This is useful to prevent ham from ending up in the same spam
+group after the resplit. Don't set this to t if you have spam-split as the
+last rule in your split configuration."
:type 'boolean
:group 'spam)
:group 'spam)
(defcustom spam-use-dig t
- "Whether query-dig should be used instead of query-dns."
+ "Whether `query-dig' should be used instead of `query-dns'."
:type 'boolean
:group 'spam)
(defcustom spam-use-blacklist nil
- "Whether the blacklist should be used by spam-split."
+ "Whether the blacklist should be used by `spam-split'."
:type 'boolean
:group 'spam)
:group 'spam)
(defcustom spam-use-whitelist nil
- "Whether the whitelist should be used by spam-split."
+ "Whether the whitelist should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-whitelist-exclusive nil
- "Whether whitelist-exclusive should be used by spam-split.
+ "Whether whitelist-exclusive should be used by `spam-split'.
Exclusive whitelisting means that all messages from senders not in the whitelist
are considered spam."
:type 'boolean
:group 'spam)
(defcustom spam-use-blackholes nil
- "Whether blackholes should be used by spam-split."
+ "Whether blackholes should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-hashcash nil
- "Whether hashcash payments should be detected by spam-split."
+ "Whether hashcash payments should be detected by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-regex-headers nil
- "Whether a header regular expression match should be used by spam-split.
+ "Whether a header regular expression match should be used by `spam-split'.
Also see the variables `spam-regex-headers-spam' and `spam-regex-headers-ham'."
:type 'boolean
:group 'spam)
(defcustom spam-use-regex-body nil
- "Whether a body regular expression match should be used by spam-split.
+ "Whether a body regular expression match should be used by `spam-split'.
Also see the variables `spam-regex-body-spam' and `spam-regex-body-ham'."
:type 'boolean
:group 'spam)
(defcustom spam-use-bogofilter-headers nil
- "Whether bogofilter headers should be used by spam-split.
+ "Whether bogofilter headers should be used by `spam-split'.
Enable this if you pre-process messages with Bogofilter BEFORE Gnus sees them."
:type 'boolean
:group 'spam)
(defcustom spam-use-bogofilter nil
- "Whether bogofilter should be invoked by spam-split.
+ "Whether bogofilter should be invoked by `spam-split'.
Enable this if you want Gnus to invoke Bogofilter on new messages."
:type 'boolean
:group 'spam)
(defcustom spam-use-BBDB nil
- "Whether BBDB should be used by spam-split."
+ "Whether BBDB should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-BBDB-exclusive nil
- "Whether BBDB-exclusive should be used by spam-split.
-Exclusive BBDB means that all messages from senders not in the BBDB are
+ "Whether BBDB-exclusive should be used by `spam-split'.
+Exclusive BBDB means that all messages from senders not in the BBDB are
considered spam."
:type 'boolean
:group 'spam)
(defcustom spam-use-ifile nil
- "Whether ifile should be used by spam-split."
+ "Whether ifile should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-stat nil
- "Whether spam-stat should be used by spam-split."
+ "Whether `spam-stat' should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-use-spamoracle nil
- "Whether spamoracle should be used by spam-split."
+ "Whether spamoracle should be used by `spam-split'."
:type 'boolean
:group 'spam)
(defcustom spam-install-hooks (or
spam-use-dig
spam-use-blacklist
- spam-use-whitelist
- spam-use-whitelist-exclusive
- spam-use-blackholes
- spam-use-hashcash
- spam-use-regex-headers
- spam-use-regex-body
- spam-use-bogofilter-headers
- spam-use-bogofilter
- spam-use-BBDB
- spam-use-BBDB-exclusive
- spam-use-ifile
+ spam-use-whitelist
+ spam-use-whitelist-exclusive
+ spam-use-blackholes
+ spam-use-hashcash
+ spam-use-regex-headers
+ spam-use-regex-body
+ spam-use-bogofilter-headers
+ spam-use-bogofilter
+ spam-use-BBDB
+ spam-use-BBDB-exclusive
+ spam-use-ifile
spam-use-stat
spam-use-spamoracle)
- "Whether the spam hooks should be installed, default to t if one of
-the spam-use-* variables is set."
+ "Whether the spam hooks should be installed.
+Default to t if one of the spam-use-* variables is set."
:group 'spam
:type 'boolean)
(defcustom spam-split-group "spam"
- "Group name where incoming spam should be put by spam-split."
+ "Group name where incoming spam should be put by `spam-split'."
:type 'string
:group 'spam)
;;; TODO: deprecate this variable, it's confusing since it's a list of strings,
;;; not regular expressions
-(defcustom spam-junk-mailgroups (cons
- spam-split-group
+(defcustom spam-junk-mailgroups (cons
+ spam-split-group
'("mail.junk" "poste.pourriel"))
"Mailgroups with spam contents.
All unmarked article in such group receive the spam mark on group entry."
:type '(repeat (string :tag "Group"))
:group 'spam)
-(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org"
+(defcustom spam-blackhole-servers '("bl.spamcop.net" "relays.ordb.org"
"dev.null.dk" "relays.visi.com")
"List of blackhole servers."
:type '(repeat (string :tag "Server"))
:group 'spam)
(defcustom spam-blackhole-good-server-regex nil
- "String matching IP addresses that should not be checked in the blackholes"
+ "String matching IP addresses that should not be checked in the blackholes."
:type '(radio (const nil)
(regexp :format "%t: %v\n" :size 0))
:group 'spam)
(defcustom spam-face 'gnus-splash-face
- "Face for spam-marked articles"
+ "Face for spam-marked articles."
:type 'face
:group 'spam)
(defcustom spam-regex-headers-spam '("^X-Spam-Flag: YES")
- "Regular expression for positive header spam matches"
+ "Regular expression for positive header spam matches."
:type '(repeat (regexp :tag "Regular expression to match spam header"))
:group 'spam)
(defcustom spam-regex-headers-ham '("^X-Spam-Flag: NO")
- "Regular expression for positive header ham matches"
+ "Regular expression for positive header ham matches."
:type '(repeat (regexp :tag "Regular expression to match ham header"))
:group 'spam)
(defcustom spam-regex-body-spam '()
- "Regular expression for positive body spam matches"
+ "Regular expression for positive body spam matches."
:type '(repeat (regexp :tag "Regular expression to match spam body"))
:group 'spam)
(defcustom spam-regex-body-ham '()
- "Regular expression for positive body ham matches"
+ "Regular expression for positive body ham matches."
:type '(repeat (regexp :tag "Regular expression to match ham body"))
:group 'spam)
:group 'spam-ifile)
(defcustom spam-ifile-spam-category "spam"
- "Name of the spam ifile category."
+ "Name of the spam ifile category."
:type 'string
:group 'spam-ifile)
(defcustom spam-ifile-ham-category nil
- "Name of the ham ifile category. If nil, the current group name will
-be used."
+ "Name of the ham ifile category.
+If nil, the current group name will be used."
:type '(choice (string :tag "Use a fixed category")
(const :tag "Use the current group name"))
:group 'spam-ifile)
(defcustom spam-ifile-all-categories nil
"Whether the ifile check will return all categories, or just spam.
-Set this to t if you want to use the spam-split invocation of ifile as
+Set this to t if you want to use the `spam-split' invocation of ifile as
your main source of newsgroup names."
:type 'boolean
:group 'spam-ifile)
(defcustom spam-bogofilter-database-directory nil
"Directory path of the Bogofilter databases."
- :type '(choice (directory
+ :type '(choice (directory
:tag "Location of the Bogofilter database directory")
(const :tag "Use the default"))
:group 'spam-bogofilter)
"Spam spamoracle configuration."
:group 'spam)
-(defcustom spam-spamoracle-database nil
+(defcustom spam-spamoracle-database nil
"Location of spamoracle database file. When nil, use the default
spamoracle database."
:type '(choice (directory :tag "Location of spamoracle database file.")
"List of old spam articles, generated when a group is entered.")
(defvar spam-split-disabled nil
- "If non-nil, spam-split is disabled, and always returns nil.")
+ "If non-nil, `spam-split' is disabled, and always returns nil.")
(defvar spam-split-last-successful-check nil
- "spam-split will set this to nil or a spam-use-XYZ check if it
+ "`spam-split' will set this to nil or a spam-use-XYZ check if it
finds ham or spam.")
;; convenience functions
-(defun spam-xor (a b) ; logical exclusive or
+(defun spam-xor (a b)
+ "Logical exclusive `or'."
(and (or a b) (not (and a b))))
(defun spam-group-ham-mark-p (group mark &optional spam)
(when (stringp group)
(let* ((marks (spam-group-ham-marks group spam))
- (marks (if (symbolp mark)
- marks
+ (marks (if (symbolp mark)
+ marks
(mapcar 'symbol-value marks))))
(memq mark marks))))
(defun spam-group-spam-contents-p (group)
(if (stringp group)
(or (member group spam-junk-mailgroups)
- (memq 'gnus-group-spam-classification-spam
+ (memq 'gnus-group-spam-classification-spam
(gnus-parameter-spam-contents group)))
nil))
-
+
(defun spam-group-ham-contents-p (group)
(if (stringp group)
- (memq 'gnus-group-spam-classification-ham
+ (memq 'gnus-group-spam-classification-ham
(gnus-parameter-spam-contents group))
nil))
(if (and (stringp group)
(symbolp processor))
(or (member processor (nth 0 (gnus-parameter-spam-process group)))
- (spam-group-processor-multiple-p
- group
+ (spam-group-processor-multiple-p
+ group
(cdr-safe (assoc processor spam-list-of-processors))))
nil))
;;; Summary entry and exit processing.
(defun spam-summary-prepare ()
- (setq spam-old-ham-articles
+ (setq spam-old-ham-articles
(spam-list-articles gnus-newsgroup-articles 'ham))
- (setq spam-old-spam-articles
+ (setq spam-old-spam-articles
(spam-list-articles gnus-newsgroup-articles 'spam))
(spam-mark-junk-as-spam-routine))
;; we have to iterate over the processors, or else we'll be too slow
(dolist (classification '(spam ham))
(let* ((old-articles (if (eq classification 'spam)
- spam-old-spam-articles
+ spam-old-spam-articles
spam-old-ham-articles))
- (new-articles (spam-list-articles
- gnus-newsgroup-articles
+ (new-articles (spam-list-articles
+ gnus-newsgroup-articles
classification))
(changed-articles (gnus-set-difference old-articles new-articles)))
;; now that we have the changed articles, we go through the processors
unregister-list)
(dolist (article changed-articles)
(let ((id (spam-fetch-field-message-id-fast article)))
- (when (spam-log-unregistration-needed-p
+ (when (spam-log-unregistration-needed-p
id 'process classification check)
(push article unregister-list))))
;; call spam-register-routine with specific articles to unregister,
;; when there are articles to unregister and the check is enabled
(when (and unregister-list (symbol-value check))
(spam-register-routine classification check t unregister-list))))))
-
+
;; find all the spam processors applicable to this group
(dolist (processor-param spam-list-of-processors)
(let ((processor (nth 0 processor-param))
(spam-group-processor-p gnus-newsgroup-name processor))
(spam-register-routine classification check))))
- (if spam-move-spam-nonspam-groups-only
+ (if spam-move-spam-nonspam-groups-only
(when (not (spam-group-spam-contents-p gnus-newsgroup-name))
(spam-mark-spam-as-expired-and-move-routine
(gnus-parameter-spam-process-destination gnus-newsgroup-name)))
- (gnus-message 5 "Marking spam as expired and moving it to %s"
+ (gnus-message 5 "Marking spam as expired and moving it to %s"
gnus-newsgroup-name)
- (spam-mark-spam-as-expired-and-move-routine
+ (spam-mark-spam-as-expired-and-move-routine
(gnus-parameter-spam-process-destination gnus-newsgroup-name)))
;; now we redo spam-mark-spam-as-expired-and-move-routine to only
;; group parameters
(when (spam-group-spam-contents-p gnus-newsgroup-name)
(gnus-message 5 "Marking %s articles as spam"
- (if spam-mark-only-unseen-as-spam
+ (if spam-mark-only-unseen-as-spam
"unseen"
"unread"))
- (let ((articles (if spam-mark-only-unseen-as-spam
+ (let ((articles (if spam-mark-only-unseen-as-spam
gnus-newsgroup-unseen
gnus-newsgroup-unreads)))
(dolist (article articles)
(when (eq (gnus-summary-article-mark article) gnus-spam-mark)
(gnus-summary-mark-article article gnus-expirable-mark)
(push article tomove)))
-
+
;; now do the actual copies
(dolist (group groups)
(when (and tomove
(when tomove
(if (or (not backend-supports-deletions)
(> (length groups) 1))
- (progn
+ (progn
(gnus-summary-copy-article nil group)
(setq deletep t))
(gnus-summary-move-article nil group)))))
-
+
;; now delete the articles, if there was a copy done, and the
;; backend allows it
(when (and deletep backend-supports-deletions)
(when tomove
(let ((gnus-novice-user nil)) ; don't ask me if I'm sure
(gnus-summary-delete-article nil))))
-
+
(gnus-summary-yank-process-mark))))
-
+
(defun spam-ham-copy-or-move-routine (copy groups)
(gnus-summary-kill-process-mark)
(let ((todo (spam-list-articles gnus-newsgroup-articles 'ham))
(gnus-summary-copy-article nil group)
(setq deletep t))
(gnus-summary-move-article nil group))))) ; else move articles
-
+
;; now delete the articles, unless a) copy is t, and there was a copy done
;; b) a move was done to a single group
;; c) backend-supports-deletions is nil
(when todo
(let ((gnus-novice-user nil)) ; don't ask me if I'm sure
(gnus-summary-delete-article nil))))))
-
+
(gnus-summary-yank-process-mark))
-
+
(defun spam-ham-copy-routine (&rest groups)
(if (and (car-safe groups) (listp (car-safe groups)))
(apply 'spam-ham-copy-routine (car groups))
(spam-ham-copy-or-move-routine t groups)))
-
+
(defun spam-ham-move-routine (&rest groups)
(if (and (car-safe groups) (listp (car-safe groups)))
(apply 'spam-ham-move-routine (car groups))
(spam-ham-copy-or-move-routine nil groups)))
-
+
(eval-and-compile
(defalias 'spam-point-at-eol (if (fboundp 'point-at-eol)
'point-at-eol
;; (defun spam-get-article-as-filename (article)
;; (let ((article-filename))
;; (when (numberp article)
-;; (nnml-possibly-change-directory
+;; (nnml-possibly-change-directory
;; (gnus-group-real-name gnus-newsgroup-name))
-;; (setq article-filename (expand-file-name
+;; (setq article-filename (expand-file-name
;; (int-to-string article) nnml-current-directory)))
;; (if (file-exists-p article-filename)
;; article-filename
"Fetch the `from' field quickly, using the internal gnus-data-list function"
(if (and (numberp article)
(assoc article (gnus-data-list nil)))
- (mail-header-from
+ (mail-header-from
(gnus-data-header (assoc article (gnus-data-list nil))))
nil))
gnus-data-list function"
(if (and (numberp article)
(assoc article (gnus-data-list nil)))
- (mail-header-subject
+ (mail-header-subject
(gnus-data-header (assoc article (gnus-data-list nil))))
nil))
gnus-data-list function"
(if (and (numberp article)
(assoc article (gnus-data-list nil)))
- (mail-header-message-id
+ (mail-header-message-id
(gnus-data-header (assoc article (gnus-data-list nil))))
nil))
is the value of `spam-split-group', meaning that the message is
definitely a spam.")
-(defvar spam-list-of-statistical-checks
+(defvar spam-list-of-statistical-checks
'(spam-use-ifile
- spam-use-regex-body
- spam-use-stat
+ spam-use-regex-body
+ spam-use-stat
spam-use-bogofilter
spam-use-spamoracle)
"The spam-list-of-statistical-checks list contains all the mail
;;;TODO: modify to invoke self with each check if invoked without specifics
(defun spam-split (&rest specific-checks)
"Split this message into the `spam' group if it is spam.
-This function can be used as an entry in `nnmail-split-fancy',
+This function can be used as an entry in the variable `nnmail-split-fancy',
for example like this: (: spam-split). It can take checks as
parameters. A string as a parameter will set the
spam-split-group to that string.
(when (stringp check)
(setq spam-split-group-choice check)
(setq specific-checks (delq check specific-checks))))
-
+
(let ((spam-split-group spam-split-group-choice))
(save-excursion
(save-restriction
(when (and (symbol-value (car pair))
(or (null specific-checks)
(memq (car pair) specific-checks)))
- (gnus-message 5 "spam-split: calling the %s function"
+ (gnus-message 5 "spam-split: calling the %s function"
(symbol-name (cdr pair)))
(setq decision (funcall (cdr pair)))
;; if we got a decision at all, save the current check
(if spam-split-symbolic-return
(setq decision spam-split-group)
(gnus-error
- 5
+ 5
(format "spam-split got %s but %s is nil"
(symbol-name decision)
(symbol-name spam-split-symbolic-return))))))))
decision))))))))
(defun spam-find-spam ()
- "This function will detect spam in the current newsgroup using spam-split"
+ "This function will detect spam in the current newsgroup using spam-split."
(interactive)
-
+
(let* ((group gnus-newsgroup-name)
(autodetect (gnus-parameter-spam-autodetect group))
(methods (gnus-parameter-spam-autodetect-methods group))
(first-method (nth 0 methods)))
- (when (and autodetect
+ (when (and autodetect
(not (equal first-method 'none)))
(mapcar
(lambda (article)
(spam-split-symbolic-return-positive t)
(split-return
(with-temp-buffer
- (gnus-request-article-this-buffer
- article
+ (gnus-request-article-this-buffer
+ article
group)
(if (or (null first-method)
(equal first-method 'default))
(gnus-registry-add-group
id group subject sender))
- (spam-log-processing-to-registry
+ (spam-log-processing-to-registry
id
'incoming
split-return
(defvar spam-registration-functions
;; first the ham register, second the spam register function
;; third the ham unregister, fourth the spam unregister function
- '((spam-use-blacklist nil
+ '((spam-use-blacklist nil
spam-blacklist-register-routine
nil
spam-blacklist-unregister-routine)
nil
spam-whitelist-unregister-routine
nil)
- (spam-use-BBDB spam-BBDB-register-routine
+ (spam-use-BBDB spam-BBDB-register-routine
nil
- spam-BBDB-unregister-routine
+ spam-BBDB-unregister-routine
nil)
- (spam-use-ifile spam-ifile-register-ham-routine
+ (spam-use-ifile spam-ifile-register-ham-routine
spam-ifile-register-spam-routine
- spam-ifile-unregister-ham-routine
+ spam-ifile-unregister-ham-routine
spam-ifile-unregister-spam-routine)
- (spam-use-spamoracle spam-spamoracle-learn-ham
+ (spam-use-spamoracle spam-spamoracle-learn-ham
spam-spamoracle-learn-spam
- spam-spamoracle-unlearn-ham
+ spam-spamoracle-unlearn-ham
spam-spamoracle-unlearn-spam)
- (spam-use-stat spam-stat-register-ham-routine
+ (spam-use-stat spam-stat-register-ham-routine
spam-stat-register-spam-routine
- spam-stat-unregister-ham-routine
+ spam-stat-unregister-ham-routine
spam-stat-unregister-spam-routine)
;; note that spam-use-gmane is not a legitimate check
- (spam-use-gmane nil
+ (spam-use-gmane nil
spam-report-gmane-register-routine
;; does Gmane support unregistration?
nil
nil)
- (spam-use-bogofilter spam-bogofilter-register-ham-routine
+ (spam-use-bogofilter spam-bogofilter-register-ham-routine
spam-bogofilter-register-spam-routine
- spam-bogofilter-unregister-ham-routine
+ spam-bogofilter-unregister-ham-routine
spam-bogofilter-unregister-spam-routine))
"The spam-registration-functions list contains pairs
associating a parameter variable with the ham and spam
(nth 2 flist))))
(defun spam-list-articles (articles classification)
- (let ((mark-check (if (eq classification 'spam)
- 'spam-group-spam-mark-p
+ (let ((mark-check (if (eq classification 'spam)
+ 'spam-group-spam-mark-p
'spam-group-ham-mark-p))
list mark-cache-yes mark-cache-no)
(dolist (article articles)
(push article list)
;; else, we have to actually check the mark
(if (funcall mark-check
- gnus-newsgroup-name
+ gnus-newsgroup-name
mark)
(progn
(push article list)
(push mark mark-cache-no))))))
list))
-(defun spam-register-routine (classification
- check
- &optional unregister
+(defun spam-register-routine (classification
+ check
+ &optional unregister
specific-articles)
(when (and (spam-classification-valid-p classification)
(spam-registration-check-valid-p check))
(spam-registration-function classification check))
(unregister-function
(spam-unregistration-function classification check))
- (run-function (if unregister
- unregister-function
+ (run-function (if unregister
+ unregister-function
register-function))
(log-function (if unregister
'spam-log-undo-registration
(when run-function
;; make list of articles, using specific-articles if given
(setq articles (or specific-articles
- (spam-list-articles
- gnus-newsgroup-articles
+ (spam-list-articles
+ gnus-newsgroup-articles
classification)))
;; process them
(gnus-message 5 "%s %d %s articles with classification %s, check %s"
(if (and (stringp id)
(spam-process-type-valid-p type))
(cdr-safe (gnus-registry-fetch-extra id type))
- (progn
+ (progn
(gnus-message 5 (format "%s called with bad ID, type, classification, or check"
"spam-log-registered-p"))
nil))))
(eq check (nth 1 cell)))
(setq found t))))
found)
- (progn
+ (progn
(gnus-message 5 (format "%s called with bad ID, type, classification, or check"
"spam-log-unregistration-needed-p"))
nil))))
id
type
new-cell-list))
- (progn
+ (progn
(gnus-message 5 (format "%s called with bad ID, type, check, or group"
"spam-log-undo-registration"))
nil))))
-;;; set up IMAP widening if it's necessary
+;;; set up IMAP widening if it's necessary
(defun spam-setup-widening ()
(dolist (check spam-list-of-statistical-checks)
(when (symbol-value check)
(defun spam-check-regex-headers (&optional body)
(let ((type (if body "body" "header"))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group))
ret found)
(dolist (h-regex spam-regex-headers-ham)
"Check the Received headers for blackholed relays."
(let ((headers (nnmail-fetch-field "received"))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group))
ips matches)
(when headers
(dolist (ip ips)
(unless (and spam-blackhole-good-server-regex
;; match the good-server-regex against the reversed (again) IP string
- (string-match
+ (string-match
spam-blackhole-good-server-regex
(spam-reverse-ip-string ip)))
(unless matches
(if spam-use-dig
(let ((query-result (query-dig query-string)))
(when query-result
- (gnus-message 5 "(DIG): positive blackhole check '%s'"
+ (gnus-message 5 "(DIG): positive blackhole check '%s'"
query-result)
(push (list ip server query-result)
matches)))
(condition-case nil
(progn
(require 'hashcash)
-
+
(defun spam-check-hashcash ()
"Check the headers for hashcash payments."
(mail-check-payment))) ;mail-check-payment returns a boolean
(defalias 'mail-check-payment 'ignore)
(defalias 'spam-check-hashcash 'ignore))))
\f
-;;;; BBDB
+;;;; BBDB
;;; original idea for spam-check-BBDB from Alexander Kotelnikov
;;; <sacha@giotto.sj.ru>
(progn
(require 'bbdb)
(require 'bbdb-com)
-
+
(defun spam-enter-ham-BBDB (addresses &optional remove)
"Enter an address into the BBDB; implies ham (non-spam) sender"
(dolist (from addresses)
(when (stringp from)
(let* ((parsed-address (gnus-extract-address-components from))
(name (or (nth 0 parsed-address) "Ham Sender"))
- (remove-function (if remove
+ (remove-function (if remove
'bbdb-delete-record-internal
'ignore))
(net-address (nth 1 parsed-address))
- (record (and net-address
+ (record (and net-address
(bbdb-search-simple nil net-address))))
(when net-address
- (gnus-message 5 "%s address %s %s BBDB"
- (if remove "Deleting" "Adding")
+ (gnus-message 5 "%s address %s %s BBDB"
+ (if remove "Deleting" "Adding")
from
(if remove "from" "to"))
(if record
(funcall remove-function record)
- (bbdb-create-internal name nil net-address nil nil
+ (bbdb-create-internal name nil net-address nil nil
"ham sender added by spam.el")))))))
-
+
(defun spam-BBDB-register-routine (articles &optional unregister)
(let (addresses)
(dolist (article articles)
"Mail from people in the BBDB is classified as ham or non-spam"
(let ((who (nnmail-fetch-field "from"))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group)))
(when who
(setq who (nth 1 (gnus-extract-address-components who)))
(if (bbdb-search-simple nil who)
- t
+ t
(if spam-use-BBDB-exclusive
spam-split-group
nil))))))
(if spam-ifile-database-path
(format "--db-file=%s" spam-ifile-database-path)
nil))
-
+
(defun spam-check-ifile ()
- "Check the ifile backend for the classification of this message"
- (let ((article-buffer-name (buffer-name))
+ "Check the ifile backend for the classification of this message."
+ (let ((article-buffer-name (buffer-name))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group))
category return)
(with-temp-buffer
(insert article-string))))
(apply 'call-process-region
(point-min) (point-max) spam-ifile-path
- nil nil nil
+ nil nil nil
add-or-delete-option category
(if db `(,db "-h") `("-h"))))))
(progn
(let ((spam-stat-install-hooks nil))
(require 'spam-stat))
-
+
(defun spam-check-stat ()
"Check the spam-stat backend for the classification of this message"
(let ((spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group))
(spam-stat-split-fancy-spam-group spam-split-group) ; override
(spam-stat-buffer (buffer-name)) ; stat the current buffer
(defun spam-maybe-spam-stat-load ()
(when spam-use-stat (spam-stat-load)))
-
+
(defun spam-maybe-spam-stat-save ()
(when spam-use-stat (spam-stat-save))))
;;; address can be a list, too
(defun spam-enter-whitelist (address &optional remove)
- "Enter ADDRESS (list or single) into the whitelist. With a
- non-nil REMOVE, remove them."
+ "Enter ADDRESS (list or single) into the whitelist.
+With a non-nil REMOVE, remove them."
(interactive "sAddress: ")
(spam-enter-list address spam-whitelist remove)
(setq spam-whitelist-cache nil))
;;; address can be a list, too
(defun spam-enter-blacklist (address &optional remove)
- "Enter ADDRESS (list or single) into the blacklist. With a
- non-nil REMOVE, remove them."
+ "Enter ADDRESS (list or single) into the blacklist.
+With a non-nil REMOVE, remove them."
(interactive "sAddress: ")
(spam-enter-list address spam-blacklist remove)
(setq spam-blacklist-cache nil))
(defun spam-check-whitelist ()
;; FIXME! Should it detect when file timestamps change?
(let ((spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group)))
(unless spam-whitelist-cache
(setq spam-whitelist-cache (spam-parse-list spam-whitelist)))
- (if (spam-from-listed-p spam-whitelist-cache)
+ (if (spam-from-listed-p spam-whitelist-cache)
t
(if spam-use-whitelist-exclusive
spam-split-group
(defun spam-check-blacklist ()
;; FIXME! Should it detect when file timestamps change?
(let ((spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group)))
(unless spam-blacklist-cache
(setq spam-blacklist-cache (spam-parse-list spam-blacklist)))
(defun spam-filelist-register-routine (articles blacklist &optional unregister)
(let ((de-symbol (if blacklist 'spam-use-whitelist 'spam-use-blacklist))
(declassification (if blacklist 'ham 'spam))
- (enter-function
+ (enter-function
(if blacklist 'spam-enter-blacklist 'spam-enter-whitelist))
(remove-function
(if blacklist 'spam-enter-whitelist 'spam-enter-blacklist))
(setq sender-ignored t)))
;; remember the messages we need to unregister, unless remove is set
(when (and
- (null unregister)
+ (null unregister)
(spam-log-unregistration-needed-p
id 'process declassification de-symbol))
(push from unregister-list))
(defun spam-check-bogofilter-headers (&optional score)
(let ((header (nnmail-fetch-field spam-bogofilter-header))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group)))
(when header ; return nil when no header
(if score ; scoring mode
(save-excursion
(set-buffer article-buffer-name)
(apply 'call-process-region
- (point-min) (point-max)
+ (point-min) (point-max)
spam-bogofilter-path
nil temp-buffer-name nil
(if db `("-d" ,db "-v") `("-v"))))
(setq return (spam-check-bogofilter-headers score))))
return))
-(defun spam-bogofilter-register-with-bogofilter (articles
- spam
+(defun spam-bogofilter-register-with-bogofilter (articles
+ spam
&optional unregister)
"Register an article, given as a string, as spam or non-spam."
(dolist (article articles)
(let ((article-string (spam-get-article-as-string article))
(db spam-bogofilter-database-directory)
(switch (if unregister
- (if spam
+ (if spam
spam-bogofilter-spam-strong-switch
spam-bogofilter-ham-strong-switch)
- (if spam
- spam-bogofilter-spam-switch
+ (if spam
+ spam-bogofilter-spam-switch
spam-bogofilter-ham-switch))))
(when (stringp article-string)
(with-temp-buffer
(insert article-string)
(apply 'call-process-region
- (point-min) (point-max)
+ (point-min) (point-max)
spam-bogofilter-path
nil nil nil switch
(if db `("-d" ,db "-v") `("-v"))))))))
-
+
(defun spam-bogofilter-register-spam-routine (articles &optional unregister)
(spam-bogofilter-register-with-bogofilter articles t unregister))
"Run spamoracle on an article to determine whether it's spam."
(let ((article-buffer-name (buffer-name))
(spam-split-group (if spam-split-symbolic-return
- 'spam
+ 'spam
spam-split-group)))
(with-temp-buffer
(let ((temp-buffer-name (buffer-name)))
(save-excursion
(set-buffer article-buffer-name)
- (let ((status
- (apply 'call-process-region
+ (let ((status
+ (apply 'call-process-region
(point-min) (point-max)
- spam-spamoracle-binary
+ spam-spamoracle-binary
nil temp-buffer-name nil
(if spam-spamoracle-database
`("-f" ,spam-spamoracle-database "mark")
(dolist (article articles)
(insert (spam-get-article-as-string article)))
(let* ((arg (if (spam-xor unregister article-is-spam-p)
- "-spam"
+ "-spam"
"-good"))
- (status
+ (status
(apply 'call-process-region
(point-min) (point-max)
spam-spamoracle-binary
nil temp-buffer-name nil
(if spam-spamoracle-database
- `("-f" ,spam-spamoracle-database
+ `("-f" ,spam-spamoracle-database
"add" ,arg)
`("add" ,arg)))))
(when (not (eq 0 status))
(provide 'spam)
;;; spam.el ends here.
+
+(provide 'spam)
+
+;;; spam.el ends here