\makeindex
\begin{document}
-\newcommand{\gnusversionname}{Oort Gnus v0.06}
+\newcommand{\gnusversionname}{Oort Gnus v0.07}
\newcommand{\gnuschaptername}{}
\newcommand{\gnussectionname}{}
* Agent Basics:: How it all is supposed to work.
* Agent Categories:: How to tell the Gnus Agent what to download.
* Agent Commands:: New commands for all the buffers.
+* Agent as Cache:: The Agent is a big cache too.
* Agent Expiry:: How to make old articles go away.
* Agent and IMAP:: How to use the Agent with IMAP.
* Outgoing Messages:: What happens when you post/mail something?
* Hard Picons:: The way you should do it. You'll learn something.
* Picon Useless Configuration:: Other variables you can trash/tweak/munge/play with.
+Thwarting Email Spam
+
+* Anti-Spam Basics:: Simple steps to reduce the amount of spam.
+* SpamAssassin:: How to use external anti-spam tools.
+* Hashcash:: Reduce spam by burning CPU time.
+
Appendices
* XEmacs:: Requirements for installing under XEmacs.
@item G
Group name.
+@item C
+Group comment (@pxref{Group Parameters}) or group name if there is no
+comment element in the group parameters.
+
@item D
Newsgroup description.
(cond (window-system
(setq custom-background-mode 'light)
(defface my-group-face-1
- '((t (:foreground "Red" :bold t))) "First group face")
+ '((t (:foreground "Red" :bold t))) "First group face")
(defface my-group-face-2
- '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face")
+ '((t (:foreground "DarkSeaGreen4" :bold t))) "Second group face")
(defface my-group-face-3
- '((t (:foreground "Green4" :bold t))) "Third group face")
+ '((t (:foreground "Green4" :bold t))) "Third group face")
(defface my-group-face-4
- '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
+ '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
(defface my-group-face-5
- '((t (:foreground "Blue" :bold t))) "Fifth group face")))
+ '((t (:foreground "Blue" :bold t))) "Fifth group face")))
(setq gnus-group-highlight
'(((> unread 200) . my-group-face-1)
@end table
This variable can also be a function. In that case, that function
-will be called to place point on a subject line.
+will be called to place point on a subject line.
If you want to prevent automatic selection in some group (say, in a
binary group with Huge articles) you can set the
@item G w
@kindex G w (Group)
@findex gnus-group-make-web-group
-@cindex DejaNews
-@cindex Alta Vista
-@cindex InReference
+@cindex Google
@cindex nnweb
+@cindex gmane
Make an ephemeral group based on a web search
(@code{gnus-group-make-web-group}). If you give a prefix to this
command, make a solid group instead. You will be prompted for the
search engine type and the search string. Valid search engine types
-include @code{dejanews}, @code{altavista} and @code{reference}.
+include @code{google}, @code{dejanews}, and @code{gmane}.
@xref{Web Searches}.
-If you use the @code{dejanews} search engine, you can limit the search
+If you use the @code{google} search engine, you can limit the search
to a particular group by using a match string like
-@samp{~g alt.sysadmin.recovery shaving}.
+@samp{shaving group:alt.sysadmin.recovery}.
@item G DEL
@kindex G DEL (Group)
(@pxref{Archived Messages}). CAVEAT:: It yields an error putting
@code{(gcc-self . t)} in groups of a @code{nntp} server or so, because
a @code{nntp} server doesn't accept artciles.
-
+
@item auto-expire
@cindex auto-expire
If the group parameter has an element that looks like @code{(auto-expire
@item comment
@cindex comment
-Elements that look like @code{(comment . "This is a comment")}
-are arbitrary comments on the group. They are currently ignored by
-gnus, but provide a place for you to store information on particular
-groups.
+Elements that look like @code{(comment . "This is a comment")} are
+arbitrary comments on the group. You can display comments in the
+group line (@pxref{Group Line Specification}).
@item charset
@cindex charset
@item subscribe-level
When subscribing new groups by topic (see the @code{subscribe} parameter),
-the group will be subscribed with the level specified in the
+the group will be subscribed with the level specified in the
@code{subscribe-level} instead of @code{gnus-level-default-subscribed}.
@end table
If fetching from the first site is unsuccessful, gnus will attempt to go
through @code{gnus-group-faq-directory} and try to open them one by one.
+@item H c
+@kindex H c (Group)
+@findex gnus-group-fetch-charter
+@vindex gnus-group-charter-alist
+@cindex charter
+Try to open the charter for the current group in a web browser
+(@code{gnus-group-fetch-charter}). Gnus will use
+@code{gnus-group-charter-alist} to find the location of the charter.
+If no location is known, Gnus will fetch the control messages for the
+group, which in some cases includes the charter.
+
+@item H C
+@kindex H C (Group)
+@findex gnus-group-fetch-control
+@vindex gnus-group-fetch-control-use-browse-url
+@cindex control message
+Fetch the control messages for the group from the archive at
+@code{ftp.isc.org} (@code{gnus-group-fetch-control}).
+
+If @code{gnus-group-fetch-control-use-browse-url} is non-nil, Gnus
+will open the control messages in a browser using @code{browse-url}.
+Otherwise they are fetched using @code{ange-ftp} and displayed in an
+ephemeral group.
+
+Note that the control messages are compressed. To use this command
+you need to turn on @code{auto-compression-mode}
+(@pxref{(emacs)Compressed Files}).
+
@item H d
@itemx C-c C-d
@c @icon{gnus-group-describe-group}
If you would like greater control of the time format, you can use a
user-defined format spec. Something like the following should do the
-trick:
+trick:
@lisp
(setq gnus-group-line-format
(format-time-string "%b %d %H:%M" time)
"")))
@end lisp
-
+
@node File Commands
@subsection File Commands
@example
if address "sender" "owner-ding@@hpc.uh.edu" @{
- fileinto "INBOX.ding";
- stop;
+ fileinto "INBOX.ding";
+ stop;
@}
@end example
@item n
The name (from the @code{From} header).
@item f
-The name, code @code{To} header or the @code{Newsgroups} header
-(@pxref{To From Newsgroups}).
+The name, @code{To} header or the @code{Newsgroups} header (@pxref{To
+From Newsgroups}).
@item a
The name (from the @code{From} header). This differs from the @code{n}
spec in that it uses the function designated by the
@item c
Number of characters in the article. This specifier is not supported
in some methods (like nnfolder).
+@item k
+Pretty-printed version of the number of characters in the article;
+for example, @samp{1.2k} or @samp{0.4M}.
@item I
Indentation based on thread level (@pxref{Customizing Threading}).
@item B
A related variable is @code{nnmail-extra-headers}, which controls when
to include extra headers when generating overview (@sc{nov}) files. If
you have old overview files, you should regenerate them after changing
-this variable.
+this variable, by entering the server buffer using `^', and then `g' on
+the appropriate mail server (e.g. nnml) to cause regeneration.
@vindex gnus-summary-line-format
You also have to instruct Gnus to display the data by changing the
(The values listed above are the default values in Gnus. Alter them
to fit your needs.)
-Now, this is mostly useful for mail groups, where you have control over
+A note for news server administrators, or for users who wish to try to
+convince their news server administrator to provide some additional
+support:
+
+The above is mostly useful for mail groups, where you have control over
the @sc{nov} files that are created. However, if you can persuade your
-nntp admin to add:
+nntp admin to add (in the usual implementation, notably INN):
@example
Newsgroups:full
@code{Reply-to}) and @code{Cc} headers in all the process/prefixed
articles. This command uses the process/prefix convention.
+@item S V
+@kindex S V (Summary)
+@findex gnus-summary-very-wide-reply-with-original
+Mail a very wide reply to the author of the current article and include the
+original message (@code{gnus-summary-very-wide-reply-with-original}). This
+command uses the process/prefix convention.
+
+@item S B r
+@kindex S B r (Summary)
+@findex gnus-summary-reply-broken-reply-to
+Mail a reply to the author of the current article but ignore the
+@code{Reply-To} field (@code{gnus-summary-reply-broken-reply-to}).
+
+@item S B R
+@kindex S B R (Summary)
+@findex gnus-summary-reply-broken-reply-to-with-original
+Mail a reply to the author of the current article and include the
+original message but ignore the @code{Reply-To} field
+(@code{gnus-summary-reply-broken-reply-to-with-original}).
+
@item S o m
@itemx C-c C-f
@kindex S o m (Summary)
@findex gnus-uu-mark-region
Mark articles in region (@code{gnus-uu-mark-region}).
+@item M P g
+@kindex M P g
+@findex gnus-uu-unmark-region
+Unmark articles in region (@code{gnus-uu-unmark-region}).
+
@item M P t
@kindex M P t (Summary)
@findex gnus-uu-mark-thread
@item gnus-simplify-whitespace
@findex gnus-simplify-whitespace
Remove excessive whitespace.
+
+@item gnus-simplify-all-whitespace
+@findex gnus-simplify-all-whitespace
+Remove all whitespace.
@end table
You may also write your own functions, of course.
@findex gnus-thread-sort-by-subject
@findex gnus-thread-sort-by-author
@findex gnus-thread-sort-by-number
+@findex gnus-thread-sort-by-random
@vindex gnus-thread-sort-functions
@findex gnus-thread-sort-by-most-recent-thread
If you are using a threaded summary display, you can sort the threads by
@code{gnus-thread-sort-by-author}, @code{gnus-thread-sort-by-subject},
@code{gnus-thread-sort-by-date}, @code{gnus-thread-sort-by-score},
@code{gnus-thread-sort-by-most-recent-number},
-@code{gnus-thread-sort-by-most-recent-date} and
+@code{gnus-thread-sort-by-most-recent-date},
+@code{gnus-thread-sort-by-random} and
@code{gnus-thread-sort-by-total-score}.
Each function takes two threads and returns non-@code{nil} if the first
@findex gnus-article-sort-by-score
@findex gnus-article-sort-by-subject
@findex gnus-article-sort-by-author
+@findex gnus-article-sort-by-random
@findex gnus-article-sort-by-number
-If you are using an unthreaded display for some strange reason or other,
-you have to fiddle with the @code{gnus-article-sort-functions} variable.
-It is very similar to the @code{gnus-thread-sort-functions}, except that
-it uses slightly different functions for article comparison. Available
-sorting predicate functions are @code{gnus-article-sort-by-number},
-@code{gnus-article-sort-by-author}, @code{gnus-article-sort-by-subject},
-@code{gnus-article-sort-by-date}, and @code{gnus-article-sort-by-score}.
+If you are using an unthreaded display for some strange reason or
+other, you have to fiddle with the @code{gnus-article-sort-functions}
+variable. It is very similar to the
+@code{gnus-thread-sort-functions}, except that it uses slightly
+different functions for article comparison. Available sorting
+predicate functions are @code{gnus-article-sort-by-number},
+@code{gnus-article-sort-by-author},
+@code{gnus-article-sort-by-subject}, @code{gnus-article-sort-by-date},
+@code{gnus-article-sort-by-random}, and
+@code{gnus-article-sort-by-score}.
If you want to sort an unthreaded summary display by subject, you could
say something like:
@item W W h
@kindex W W h (Summary)
-@findex gnus-article-toggle-headers
-Toggle hiding of headers (@code{gnus-article-toggle-headers}). @xref{Hiding
+@findex gnus-article-hide-headers
+Hide headers (@code{gnus-article-hide-headers}). @xref{Hiding
Headers}.
@item W W b
@item t
@kindex W t (Summary)
@kindex t (Summary)
-@findex gnus-article-toggle-headers
+@findex gnus-summary-toggle-header
Toggle whether to display all headers in the article buffer
-(@code{gnus-article-toggle-headers}).
+(@code{gnus-summary-toggle-header}).
@item W v
@kindex W v (Summary)
@findex gnus-article-de-base64-unreadable
Treat base64 (@code{gnus-article-de-base64-unreadable}).
Base64 is one common @sc{mime} encoding employed when sending non-ASCII
-(i. e., 8-bit) articles. Note that the this is usually done
+(i. e., 8-bit) articles. Note that this is usually done
automatically by Gnus if the message in question has a
@code{Content-Transfer-Encoding} header that says that this encoding has
been done.
@item W h
@kindex W h (Summary)
@findex gnus-article-wash-html
-Treat @sc{html} (@code{gnus-article-wash-html}). Note that the this is
+Treat @sc{html} (@code{gnus-article-wash-html}). Note that this is
usually done automatically by Gnus if the message in question has a
@code{Content-Type} header that says that the message is @sc{html}.
If a prefix is given, a charset will be asked for.
@vindex gnus-article-wash-function
-The default is to use w3 to convert the @sc{html}, but this is
-controlled by the @code{gnus-article-wash-function} variable.
-Pre-defined functions you can use include:
+The default is to use the function specified by
+@code{mm-inline-text-html-renderer} (@pxref{Customization, , , emacs-mime})
+to convert the @sc{html}, but this is controlled by the
+@code{gnus-article-wash-function} variable. Pre-defined functions you
+can use include:
@table @code
-@item gnus-article-wash-html-with-w3
-@findex gnus-article-wash-html-with-w3
-Use w3 (this is the default).
+@item w3
+Use Emacs/w3.
-@item gnus-article-wash-html-with-w3m
-@findex gnus-article-wash-html-with-w3m
+@item w3m
Use emacs-w3m (see @uref{http://emacs-w3m.namazu.org/} for more
information).
+
+@item links
+Use Links (see @uref{http://artax.karlin.mff.cuni.cz/~mikulas/links/}).
+
+@item lynx
+Use Lynx (see @uref{http://lynx.browser.org/}).
+
+@item html2text
+Use html2text -- a simple @sc{html} converter included with Gnus.
+
@end table
@item W b
@item W G f
@kindex W G f (Summary)
-@findex gnus-article-treat-fold-header
+@findex gnus-article-treat-fold-headers
Fold all the message headers
(@code{gnus-article-treat-fold-headers}).
@item regexp
All text that match this regular expression will be considered an
external reference. Here's a typical regexp that matches embedded URLs:
-@samp{<URL:\\([^\n\r>]*\\)>}.
+@samp{<URL:\\([^\n\r>]*\\)>}. This can also be a variable containing a
+regexp, useful variables to use include @code{gnus-button-url-regexp}.
@item button-par
Gnus has to know which parts of the matches is to be highlighted. This
@item M-t
@kindex M-t (Summary)
-@findex gnus-summary-display-buttonized
+@findex gnus-summary-toggle-display-buttonized
Toggle the buttonized display of the article buffer
(@code{gnus-summary-toggle-display-buttonized}).
@item W M w
@kindex W M w (Summary)
+@findex gnus-article-decode-mime-words
Decode RFC 2047-encoded words in the article headers
(@code{gnus-article-decode-mime-words}).
@item W M c
@kindex W M c (Summary)
+@findex gnus-article-decode-charset
Decode encoded article bodies as well as charsets
(@code{gnus-article-decode-charset}).
@item W M v
@kindex W M v (Summary)
+@findex gnus-mime-view-all-parts
View all the @sc{mime} parts in the current article
(@code{gnus-mime-view-all-parts}).
@findex gnus-summary-sort-by-score
Sort by score (@code{gnus-summary-sort-by-score}).
+@item C-c C-s C-r
+@kindex C-c C-s C-r (Summary)
+@findex gnus-summary-sort-by-random
+Randomize (@code{gnus-summary-sort-by-random}).
+
@item C-c C-s C-o
@kindex C-c C-s C-o (Summary)
@findex gnus-summary-sort-by-original
match.
Here's an example setting that will first try the current method, and
-then ask Deja if that fails:
+then ask Google if that fails:
@lisp
(setq gnus-refer-article-method
'(current
- (nnweb "refer" (nnweb-type dejanews))))
+ (nnweb "refer" (nnweb-type google))))
@end lisp
Most of the mail back ends support fetching by @code{Message-ID}, but
(setq gnus-newsgroup-variables
'(message-use-followup-to
(gnus-visible-headers .
- "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
+ "^From:\\|^Newsgroups:\\|^Subject:\\|^Date:\\|^To:")))
@end lisp
@end table
If non-@code{nil}, add a @code{to-list} group parameter to mail groups
that have none when you do a @kbd{a}.
+@item gnus-confirm-mail-reply-to-news
+@vindex gnus-confirm-mail-reply-to-news
+If non-@code{nil}, Gnus requests confirmation when replying to news.
+If you find yourself never wanting to reply to mail, but occasionally
+press R anyway, this variable might be for you.
+
@end table
Thank you for asking. I hate you.
-It can be quite complicated.
+It can be quite complicated.
@vindex gnus-post-method
When posting news, Message usually invokes @code{message-send-news}
smtpmail-default-smtp-server "YOUR SMTP HOST")
@end lisp
+To the thing similar to this, there is @code{message-smtpmail-send-it}.
+It is useful if your ISP requires the POP-before-SMTP authentication.
+See the documentation for the function @code{mail-source-touch-pop}.
+
Other possible choises for @code{message-send-mail-function} includes
@code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail},
and @code{feedmail-send-it}.
(window-system ;; A value symbol
("X-Window-System" (format "%s" window-system)))
;; If I'm replying to Larsi, set the Organization header.
- ((header "to" "larsi.*org")
+ ((header "from" "larsi.*org")
(Organization "Somewhere, Inc."))
((posting-from-work-p) ;; A user defined function
(signature-file "~/.work-signature")
@sc{Mailcrypt}, you need to install at least one of them. The
@sc{s/mime} support in Gnus requires the external program OpenSSL.
+Often, you would like to sign replies to people who send you signed
+messages. Even more often, you might want to encrypt messages which
+are in reply to encrypted messages. Gnus offers
+@code{gnus-message-replysign} to enable the former, and
+@code{gnus-message-replyencrypt} for the latter. In addition, setting
+@code{gnus-message-replysignencrypted} (on by default) will sign
+automatically encrypted messages.
+
Instructing MML to perform security operations on a @sc{mime} part is
done using the @kbd{C-c C-m s} key map for signing and the @kbd{C-c
C-m c} key map for encryption, as follows.
@item C-c C-m s s
@kindex C-c C-m s s
-@findex mml-secure-sign-smime
+@findex mml-secure-message-sign-smime
-Digitally sign current @sc{mime} part using @sc{s/mime}.
+Digitally sign current message using @sc{s/mime}.
@item C-c C-m s o
@kindex C-c C-m s o
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgp
-Digitally sign current @sc{mime} part using PGP.
+Digitally sign current message using PGP.
@item C-c C-m s p
@kindex C-c C-m s p
-@findex mml-secure-sign-pgp
+@findex mml-secure-message-sign-pgp
-Digitally sign current @sc{mime} part using @sc{pgp/mime}.
+Digitally sign current message using @sc{pgp/mime}.
@item C-c C-m c s
@kindex C-c C-m c s
-@findex mml-secure-encrypt-smime
+@findex mml-secure-message-encrypt-smime
-Digitally encrypt current @sc{mime} part using @sc{s/mime}.
+Digitally encrypt current message using @sc{s/mime}.
@item C-c C-m c o
@kindex C-c C-m c o
-@findex mml-secure-encrypt-pgp
+@findex mml-secure-message-encrypt-pgp
-Digitally encrypt current @sc{mime} part using PGP.
+Digitally encrypt current message using PGP.
@item C-c C-m c p
@kindex C-c C-m c p
-@findex mml-secure-encrypt-pgpmime
+@findex mml-secure-message-encrypt-pgpmime
-Digitally encrypt current @sc{mime} part using @sc{pgp/mime}.
+Digitally encrypt current message using @sc{pgp/mime}.
@item C-c C-m C-n
@kindex C-c C-m C-n
(nntp-via-rlogin-command "ssh")
@end lisp
+See also @code{nntp-via-rlogin-command-switches}.
+
If you're behind a firewall, but have direct access to the outside world
through a wrapper command like "runsocks", you could open a socksified
telnet connection to the news server as follows:
;; Type `C-c C-c' after you've finished editing.
;;
;; "snews" is port 563 and is predefined in our /etc/services
+;; however, openssl s_client -port doesn't like named ports
;;
(nntp "snews.bar.com"
(nntp-open-connection-function nntp-open-ssl-stream)
- (nntp-port-number "snews")
+ (nntp-port-number 563)
(nntp-address "snews.bar.com"))
@end lisp
@vindex nntp-via-rlogin-command
Command used to log in on the intermediate host. The default is
@samp{rsh}, but @samp{ssh} is a popular alternative.
+
+@item nntp-via-rlogin-command-switches
+@vindex nntp-via-rlogin-command-switches
+List of strings to be used as the switches to
+@code{nntp-via-rlogin-command}. The default is @code{nil}. If you use
+@samp{ssh} for `nntp-via-rlogin-command', you may set this to
+@samp{("-C")} in order to compress all data connections, otherwise set
+this to @samp{("-t")} or @samp{("-C" "-t")} if the telnet command
+requires a pseudo-tty allocation on an intermediate host.
@end table
@item nntp-open-via-telnet-and-telnet
@item nntp-port-number
@vindex nntp-port-number
Port number to connect to the @sc{nntp} server. The default is @samp{nntp}.
+If you use @sc{nntp} over @sc{ssl}, you may want to use integer ports rather
+than named ports (i.e, use @samp{563} instead of @samp{snews}), because
+external SSL tools may not work with named ports.
@item nntp-end-of-line
@vindex nntp-end-of-line
@code{nnmail-split-header-length-limit} are excluded from the split
function.
+@vindex nnmail-mail-splitting-charset
+@vindex nnmail-mail-splitting-decodes
+By default the splitting codes MIME decodes headers so you can match
+on non-ASCII strings. The @code{nnmail-mail-splitting-charset}
+variable specifies the default charset for decoding. The behaviour
+can be turned off completely by binding
+@code{nnmail-mail-splitting-decodes} to nil, which is useful if you
+want to match articles based on the raw header data.
+
Gnus gives you all the opportunity you could possibly want for shooting
yourself in the foot. Let's say you create a group that will contain
all the mail you get from your boss. And then you accidentally
@table @code
@item :path
The path of the file. Defaults to the value of the @code{MAIL}
-environment variable or @file{/usr/mail/spool/user-name}.
+environment variable or the value of @code{rmail-spool-directory}
+(usually something like @file{/usr/mail/spool/user-name}).
@end table
An example file mail source:
group @code{foo.bar}. (You can change the suffix to be used instead
of @code{.spool}.) Setting
@code{nnmail-scan-directory-mail-source-once} to non-nil forces Gnus
-to scan the mail source only once. This is particularly useful if you
+to scan the mail source only once. This is particularly useful if you
want to scan mail groups at a specified level.
+There is also the variable @code{nnmail-resplit-incoming}, if you set
+that to a non-nil value, then the normal splitting process is applied
+to all the files from the directory.
+
Keywords:
@table @code
@item webmail
Get mail from a webmail server, such as @uref{www.hotmail.com},
@uref{webmail.netscape.com}, @uref{www.netaddress.com},
-@uref{www.my-deja.com}.
-
-NOTE: Now @uref{mail.yahoo.com} provides POP3 service, so @sc{pop} mail source
-is suggested.
+@uref{mail.yahoo..com}.
NOTE: Webmail largely depends cookies. A "one-line-cookie" patch is
required for url "4.0pre.46".
-WARNING: Mails may lost. NO WARRANTY.
+WARNING: Mails may be lost. NO WARRANTY.
Keywords:
the back end (via @code{Gcc}, for instance) into the mail duplication
discovery cache. The default is @code{nil}.
+@item nnmail-cache-ignore-groups
+@vindex nnmail-cache-ignore-groups
+This can be a regular expression or a list of regular expressions.
+Group names that match any of the regular expressions will never be
+recorded in the @code{Message-ID} cache.
+
+This can be useful, for example, when using Fancy Splitting
+(@pxref{Fancy Mail Splitting}) together with the function
+@code{nnmail-split-fancy-with-parent}.
+
@end table
you can include @code{nnmail-split-fancy-with-parent} using the colon
feature, like so:
@lisp
-(setq nnmail-split-fancy
+(setq nnmail-treat-duplicates 'warn ; or 'delete
+ nnmail-cache-accepted-message-ids t
+ nnmail-split-fancy
'(| (: nnmail-split-fancy-with-parent)
;; other splits go here
))
also records the message ids of moved articles, so that the followup
messages goes into the new group.
+Also see the variable @code{nnmail-cache-ignore-groups} if you don't
+want certain groups to be recorded in the cache. For example, if all
+outgoing messages are written to an `outgoing' group, you could set
+@code{nnmail-cache-ignore-groups} to match that group name.
+Otherwise, answers to all your messages would end up in the
+`outgoing' group.
+
@node Group Mail Splitting
@subsection Group Mail Splitting
splits like this:
@lisp
-(: gnus-mlsplt-fancy GROUPS NO-CROSSPOST CATCH-ALL)
+(: gnus-group-split-fancy GROUPS NO-CROSSPOST CATCH-ALL)
@end lisp
@var{groups} may be a regular expression or a list of group names whose
(setq nnmail-expiry-target 'nnmail-fancy-expiry-target
nnmail-fancy-expiry-targets
'((to-from "boss" "nnfolder:Work")
- ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
+ ("subject" "IMPORTANT" "nnfolder:IMPORTANT.%Y.%b")
("from" ".*" "nnfolder:Archive-%Y")))
@end lisp
Clear leading white space that ``helpful'' listservs have added to the
headers to make them look nice. Aaah.
+(Note that this function works on both the header on the body of all
+messages, so it is a potentially dangerous function to use (if a body
+of a message contains something that looks like a header line). So
+rather than fix the bug, it is of course the right solution to make it
+into a feature by documenting it.)
+
@item nnmail-remove-list-identifiers
@findex nnmail-remove-list-identifiers
Some list servers add an identifier---for example, @samp{(idm)}---to the
@node Web Searches
@subsection Web Searches
@cindex nnweb
-@cindex DejaNews
-@cindex Alta Vista
-@cindex InReference
+@cindex Google
+@cindex dejanews
+@cindex gmane
@cindex Usenet searches
@cindex searching the Usenet
manner. Not even using duplicate suppression (@pxref{Duplicate
Suppression}) will help, since @code{nnweb} doesn't even know the
@code{Message-ID} of the articles before reading them using some search
-engines (DejaNews, for instance). The only possible way to keep track
+engines (Google, for instance). The only possible way to keep track
of which articles you've read is by scoring on the @code{Date}
header---mark all articles posted before the last date you read the
group as read.
@item nnweb-type
@vindex nnweb-type
What search engine type is being used. The currently supported types
-are @code{dejanews}, @code{dejanewsold}, @code{altavista} and
-@code{reference}.
+are @code{google}, @code{dejanews}, and @code{gmane}. Note that
+@code{dejanews} is an alias to @code{google}.
@item nnweb-search
@vindex nnweb-search
@item nnweb-max-hits
@vindex nnweb-max-hits
Advisory maximum number of hits per search to display. The default is
-100.
+999.
@item nnweb-type-definition
@vindex nnweb-type-definition
(defun gnus-user-format-function-X (header)
(let ((descr
- (assq nnrss-description-field (mail-header-extra header))))
+ (assq nnrss-description-field (mail-header-extra header))))
(if descr (concat "\n\t" (cdr descr)) "")))
@end lisp
doesn't exist actually does exist. More specifically, @sc{imap} has
this concept of marking articles @code{Deleted} which doesn't actually
delete them, and this (marking them @code{Deleted}, that is) is what
-nnimap does when you delete a article in Gnus (with @kbd{G DEL} or
+nnimap does when you delete a article in Gnus (with @kbd{B DEL} or
similar).
Since the articles aren't really removed when we mark them with the
@item nnimap-importantize-dormant
@vindex nnimap-importantize-dormant
-If non-nil, marks dormant articles as ticked (as well), for other
-@sc{imap} clients. Within Gnus, dormant articles will naturally still
-(only) be marked as ticked. This is to make dormant articles stand
-out, just like ticked articles, in other @sc{imap} clients. (In other
-words, Gnus has two ``Tick'' marks and @sc{imap} has only one.)
+If non-nil (the default), marks dormant articles as ticked (as well),
+for other @sc{imap} clients. Within Gnus, dormant articles will
+naturally still (only) be marked as dormant. This is to make dormant
+articles stand out, just like ticked articles, in other @sc{imap}
+clients. (In other words, Gnus has two ``Tick'' marks and @sc{imap}
+has only one.)
Probably the only reason for frobing this would be if you're trying
enable per-user persistant dormant flags, using something like:
Newsgroups: alt.religion.emacs
@end example
-will get this @code{From} header inserted:
+will get this @code{To} header inserted:
@example
To: alt-religion-emacs@@GATEWAY
@code{nnvirtual} groups do not inherit anything but articles and marks
from component groups---group parameters, for instance, are not
-inherited.
+inherited.
@node Kibozed Groups
functionality up to the newsreader makes sense if you're the only person
reading news on a machine.
-Using Gnus as an ``offline'' newsreader is quite simple.
-
-@itemize @bullet
-@item
-First, set up Gnus as you would do if you were running it on a machine
-that has full connection to the net. Go ahead. I'll still be waiting
-here.
-
-@item
-Then, put the following magical incantation in your @file{.gnus.el}
-file:
-
-@lisp
-(setq gnus-agent t)
-@end lisp
-@end itemize
-
-That's it. Gnus is now an ``offline'' newsreader.
+Setting up Gnus as an ``offline'' newsreader is quite simple. In
+fact, you don't even have to configure anything.
Of course, to use it as such, you have to learn a few new commands.
* Agent Basics:: How it all is supposed to work.
* Agent Categories:: How to tell the Gnus Agent what to download.
* Agent Commands:: New commands for all the buffers.
+* Agent as Cache:: The Agent is a big cache too.
* Agent Expiry:: How to make old articles go away.
* Agent and IMAP:: How to use the Agent with IMAP.
* Outgoing Messages:: What happens when you post/mail something?
Decide which servers should be covered by the Agent. If you have a mail
back end, it would probably be nonsensical to have it covered by the
Agent. Go to the server buffer (@kbd{^} in the group buffer) and press
-@kbd{J a} the server (or servers) that you wish to have covered by the
-Agent (@pxref{Server Agent Commands}). This will typically be only the
-primary select method, which is listed on the bottom in the buffer.
+@kbd{J a} on the server (or servers) that you wish to have covered by the
+Agent (@pxref{Server Agent Commands}), or @kbd{J r} on automatically
+added servers you do not wish to have covered by the Agent. By default,
+all @code{nntp} and @code{nnimap} groups in @code{gnus-select-method} and
+@code{gnus-secondary-select-methods} are agentized.
@item
Decide on download policy. @xref{Agent Categories}.
or you could append your predicate to the predefined
@code{gnus-category-predicate-alist} in your @file{~/.gnus.el} or
-wherever.
+wherever.
@lisp
(require 'gnus-agent)
(setq gnus-category-predicate-alist
(append gnus-category-predicate-alist
- '((old . my-article-old-p))))
+ '((old . my-article-old-p))))
@end lisp
and simply specify your predicate as:
@end table
+@node Agent as Cache
+@subsection Agent as Cache
+
+When Gnus is plugged, it is not efficient to download headers or
+articles from the server again, if they are already stored in the
+Agent. So, Gnus normally only downloads headers once, and stores them
+in the Agent. These headers are later used when generating the summary
+buffer, regardless of whether you are plugged or unplugged. Articles
+are not cached in the Agent by default though (that would potentially
+consume lots of disk space), but if you have already downloaded an
+article into the Agent, Gnus will not download the article from the
+server again but use the locally stored copy instead.
+
+This behaviour can be controlled by @code{gnus-agent-cache}
+(@pxref{Agent Variables}).
+
@node Agent Expiry
@subsection Agent Expiry
case for nntp. Thus Gnus need to remember flag changes when
disconnected, and synchronize these flags when you plug back in.
-Gnus keep track of flag changes when reading nnimap groups under the
-Agent by default. When you plug back in, by default Gnus will check if
-you have any changed any flags and ask if you wish to synchronize these
-with the server. This behavior is customizable with
-@code{gnus-agent-synchronize-flags}.
+Gnus keeps track of flag changes when reading nnimap groups under the
+Agent. When you plug back in, Gnus will check if you have any changed
+any flags and ask if you wish to synchronize these with the server.
+The behavior is customizable by @code{gnus-agent-synchronize-flags}.
@vindex gnus-agent-synchronize-flags
If @code{gnus-agent-synchronize-flags} is @code{nil}, the Agent will
-never automatically synchronize flags. If it is @code{ask}, the
-default, the Agent will check if you made any changes and if so ask if
-you wish to synchronize these when you re-connect. If it has any other
-value, all flags will be synchronized automatically.
+never automatically synchronize flags. If it is @code{ask}, which is
+the default, the Agent will check if you made any changes and if so
+ask if you wish to synchronize these when you re-connect. If it has
+any other value, all flags will be synchronized automatically.
-If you do not wish to automatically synchronize flags when you
-re-connect, this can be done manually with the
+If you do not wish to synchronize flags automatically when you
+re-connect, you can do it manually with the
@code{gnus-agent-synchronize-flags} command that is bound to @kbd{J Y}
-in the group buffer by default.
+in the group buffer.
Some things are currently not implemented in the Agent that you'd might
expect from a disconnected @sc{imap} client, including:
@subsection Outgoing Messages
When Gnus is unplugged, all outgoing messages (both mail and news) are
-stored in the draft groups (@pxref{Drafts}). You can view them there
-after posting, and edit them at will.
+stored in the draft group ``queue'' (@pxref{Drafts}). You can view
+them there after posting, and edit them at will.
When Gnus is plugged again, you can send the messages either from the
draft group with the special commands available there, or you can use
@item gnus-agent-cache
@vindex gnus-agent-cache
-Variable to control whether use the locally stored @sc{nov} and articles when
-plugged.
+Variable to control whether use the locally stored @sc{nov} and
+articles when plugged, e.g. essentially using the Agent as a cache.
+The default is non-nil, which means to use the Agent as a cache.
@item gnus-agent-go-online
@vindex gnus-agent-go-online
;;; Make Gnus into an offline newsreader.
;;; (gnus-agentize) ; The obsolete setting.
-(setq gnus-agent t)
+;;; (setq gnus-agent t) ; Now the default.
@end lisp
That should be it, basically. Put that in your @file{~/.gnus.el} file,
Internally, Gnus calls @code{gnus-make-predicate} on these specifiers
to create a function that can be called. This input parameter to this
function will be passed along to all the functions in the predicate
-specifier.
+specifier.
@node Moderation
This is annoying.
-The way to deal with this is having Gnus split out all spam into a
+@menu
+* Anti-Spam Basics:: Simple steps to reduce the amount of spam.
+* SpamAssassin:: How to use external anti-spam tools.
+* Hashcash:: Reduce spam by burning CPU time.
+@end menu
+
+@node Anti-Spam Basics
+@subsection Anti-Spam Basics
+@cindex email spam
+@cindex spam
+@cindex UCE
+@cindex unsolicited commercial email
+
+One way of dealing with spam is having Gnus split out all spam into a
@samp{spam} mail group (@pxref{Splitting Mail}).
First, pick one (1) valid mail address that you can be reached at, and
to non-existent domains is yucky, in my opinion.
+
+@node SpamAssassin
+@subsection SpamAssassin, Vipul's Razor, DCC, etc
+@cindex SpamAssassin
+@cindex Vipul's Razor
+@cindex DCC
+
+The days where the hints in the previous section was sufficient in
+avoiding spam is coming to an end. There are many tools out there
+that claim to reduce the amount of spam you get. This section could
+easily become outdated fast, as new products replace old, but
+fortunately most of these tools seem to have similar interfaces. Even
+though this section will use SpamAssassin as an example, it should be
+easy to adapt it to most other tools.
+
+If the tool you are using is not installed on the mail server, you
+need to invoke it yourself. Ideas on how to use the
+@code{:postscript} mail source parameter (@pxref{Mail Source
+Specifiers}) follows.
+
+@lisp
+(setq mail-sources
+ '((file :prescript "formail -bs spamassassin < /var/mail/%u")
+ (pop :user "jrl"
+ :server "pophost"
+ :postscript "mv %t /tmp/foo; formail -bs spamc < /tmp/foo > %t")))
+@end lisp
+
+Once you managed to process your incoming spool somehow, thus making
+the mail contain e.g. a header indicating it is spam, you are ready to
+filter it out. Using normal split methods (@pxref{Splitting Mail}):
+
+@lisp
+(setq nnmail-split-methods '(("spam" "^X-Spam-Flag: YES")
+ ...))
+@end lisp
+
+Or using fancy split methods (@pxref{Fancy Mail Splitting}):
+
+@lisp
+(setq nnmail-split-methods 'nnmail-split-fancy
+ nnmail-split-fancy '(| ("X-Spam-Flag" "YES" "spam")
+ ...))
+@end lisp
+
+Some people might not like the idea of piping the mail through various
+programs using a @code{:prescript} (if some program is buggy, you
+might lose all mail). If you are one of them, another solution is to
+call the external tools during splitting. Example fancy split method:
+
+@lisp
+(setq nnmail-split-fancy '(| (: kevin-spamassassin)
+ ...))
+(defun kevin-spamassassin ()
+ (save-excursion
+ (let ((buf (or (get-buffer " *nnmail incoming*")
+ (get-buffer " *nnml move*"))))
+ (if (not buf)
+ (progn (message "Oops, cannot find message buffer") nil)
+ (set-buffer buf)
+ (if (eq 1 (call-process-region (point-min) (point-max)
+ "spamc" nil nil nil "-c"))
+ "spam")))))
+@end lisp
+
+That is about it. As some spam is likely to get through anyway, you
+might want to have a nifty function to call when you happen to read
+spam. And here is the nifty function:
+
+@lisp
+ (defun my-gnus-raze-spam ()
+ "Submit SPAM to Vipul's Razor, then mark it as expirable."
+ (interactive)
+ (gnus-summary-show-raw-article)
+ (gnus-summary-save-in-pipe "razor-report -f -d")
+ (gnus-summary-mark-as-expirable 1))
+@end lisp
+
+@node Hashcash
+@subsection Hashcash
+@cindex hashcash
+
+A novel technique to fight spam is to require senders to do something
+costly for each message they send. This has the obvious drawback that
+you cannot rely on that everyone in the world uses this technique,
+since it is not part of the internet standards, but it may be useful
+in smaller communities.
+
+While the tools in the previous section work well in practice, they
+work only because the tools are constantly maintained and updated as
+new form of spam appears. This means that a small percentage of spam
+will always get through. It also means that somewhere, someone needs
+to read lots of spam to update these tools. Hashcash avoids that, but
+instead requires that everyone you communicate with supports the
+scheme. You can view the two approaches as pragmatic vs dogmatic.
+The approaches have their own advantages and disadvantages, but as
+often in the real world, a combination of them is stronger than either
+one of them separately.
+
+@cindex X-Hashcash
+The ``something costly'' is to burn CPU time, more specifically to
+compute a hash collision up to a certain number of bits. The
+resulting hashcash cookie is inserted in a @samp{X-Hashcash:}
+header. For more details, and for the external application
+@code{hashcash} you need to install to use this feature, see
+@uref{http://www.cypherspace.org/~adam/hashcash/}. Even more
+information can be found at @uref{http://www.camram.org/}.
+
+If you wish to call hashcash for each message you send, say something
+like:
+
+@lisp
+(require 'hashcash)
+(add-hook 'message-send-hook 'mail-add-payment)
+@end lisp
+
+The @code{hashcash.el} library can be found at
+@uref{http://users.actrix.gen.nz/mycroft/hashcash.el}, or in the Gnus
+development contrib directory.
+
+You will need to set up some additional variables as well:
+
+@table @code
+
+@item hashcash-default-payment
+@vindex hashcash-default-payment
+This variable indicates the default number of bits the hash collision
+should consist of. By default this is 0, meaning nothing will be
+done. Suggested useful values include 17 to 29.
+
+@item hashcash-payment-alist
+@vindex hashcash-payment-alist
+Some receivers may require you to spend burn more CPU time than the
+default. This variable contains a list of @samp{(ADDR AMOUNT)} cells,
+where ADDR is the receiver (email address or newsgroup) and AMOUNT is
+the number of bits in the collision that is needed. It can also
+contain @samp{(ADDR STRING AMOUNT)} cells, where the STRING is the
+string to use (normally the email address or newsgroup name is used).
+
+@item hashcash
+@vindex hashcash
+Where the @code{hashcash} binary is installed.
+
+@end table
+
+Currently there is no built in functionality in Gnus to verify
+hashcash cookies, it is expected that this is performed by your hand
+customized mail filtering scripts. Improvements in this area would be
+a useful contribution, however.
+
@node Various Various
@section Various Various
@cindex mode lines
@lisp
(setq mail-sources
'((directory :path "~/mail/incoming/"
- :suffix ".in")))
+ :suffix ".in")))
@end lisp
More information is available in the info doc at Select Methods ->