12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678 |
- \input texinfo @c -*-texinfo-*-
- @include gnus-overrides.texi
- @setfilename ../../info/message.info
- @settitle Message Manual
- @include docstyle.texi
- @synindex fn cp
- @synindex vr cp
- @synindex pg cp
- @copying
- This file documents Message, the Emacs message composition mode.
- Copyright @copyright{} 1996--2017 Free Software Foundation, Inc.
- @quotation
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3 or
- any later version published by the Free Software Foundation; with no
- Invariant Sections, with the Front-Cover Texts being ``A GNU Manual'',
- and with the Back-Cover Texts as in (a) below. A copy of the license
- is included in the section entitled ``GNU Free Documentation License''.
- (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and
- modify this GNU manual.''
- @end quotation
- @end copying
- @dircategory Emacs network features
- @direntry
- * Message: (message). Mail and news composition mode that
- goes with Gnus.
- @end direntry
- @iftex
- @finalout
- @end iftex
- @titlepage
- @ifset WEBHACKDEVEL
- @title Message Manual (DEVELOPMENT VERSION)
- @end ifset
- @ifclear WEBHACKDEVEL
- @title Message Manual
- @end ifclear
- @author by Lars Magne Ingebrigtsen
- @page
- @vskip 0pt plus 1filll
- @insertcopying
- @end titlepage
- @summarycontents
- @contents
- @node Top
- @top Message
- @ifnottex
- @insertcopying
- @end ifnottex
- All message composition from Gnus (both mail and news) takes place in
- Message mode buffers.
- @menu
- * Interface:: Setting up message buffers.
- * Commands:: Commands you can execute in message mode buffers.
- * Variables:: Customizing the message buffers.
- * Appendices:: More technical things.
- * GNU Free Documentation License:: The license for this documentation.
- * Index:: Variable, function and concept index.
- * Key Index:: List of Message mode keys.
- @end menu
- @c Adjust ../Makefile.in if you change the following lines:
- Message is distributed with Gnus. The Gnus distribution
- @c
- corresponding to this manual is Gnus v5.13
- @node Interface
- @chapter Interface
- When a program (or a person) wants to respond to a message---reply,
- follow up, forward, cancel---the program (or person) should just put
- point in the buffer where the message is and call the required command.
- @code{Message} will then pop up a new @code{message} mode buffer with
- appropriate headers filled out, and the user can edit the message before
- sending it.
- @menu
- * New Mail Message:: Editing a brand new mail message.
- * New News Message:: Editing a brand new news message.
- * Reply:: Replying via mail.
- * Wide Reply:: Responding to all people via mail.
- * Followup:: Following up via news.
- * Canceling News:: Canceling a news article.
- * Superseding:: Superseding a message.
- * Forwarding:: Forwarding a message via news or mail.
- * Resending:: Resending a mail message.
- * Bouncing:: Bouncing a mail message.
- * Mailing Lists:: Send mail to mailing lists.
- @end menu
- You can customize the Message Mode tool bar, see @kbd{M-x
- customize-apropos RET message-tool-bar}. This feature is only available
- in Emacs.
- @node New Mail Message
- @section New Mail Message
- @findex message-mail
- The @code{message-mail} command pops up a new message buffer.
- Two optional parameters are accepted: The first will be used as the
- @code{To} header and the second as the @code{Subject} header. If these
- are @code{nil}, those two headers will be empty.
- @node New News Message
- @section New News Message
- @findex message-news
- The @code{message-news} command pops up a new message buffer.
- This function accepts two optional parameters. The first will be used
- as the @code{Newsgroups} header and the second as the @code{Subject}
- header. If these are @code{nil}, those two headers will be empty.
- @node Reply
- @section Reply
- @findex message-reply
- The @code{message-reply} function pops up a message buffer that's a
- reply to the message in the current buffer.
- @vindex message-reply-to-function
- Message uses the normal methods to determine where replies are to go
- (@pxref{Responses}), but you can change the behavior to suit your needs
- by fiddling with the @code{message-reply-to-function} variable.
- If you want the replies to go to the @code{Sender} instead of the
- @code{From}, you could do something like this:
- @lisp
- (setq message-reply-to-function
- (lambda ()
- (cond ((equal (mail-fetch-field "from") "somebody")
- (list (cons 'To (mail-fetch-field "sender"))))
- (t
- nil))))
- @end lisp
- This function will be called narrowed to the head of the article that is
- being replied to.
- As you can see, this function should return a list. In this case, it
- returns @code{((To . "Whom"))} if it has an opinion as to what the To
- header should be. If it does not, it should just return @code{nil}, and
- the normal methods for determining the To header will be used.
- Each list element should be a cons, where the @sc{car} should be the
- name of a header (e.g., @code{Cc}) and the @sc{cdr} should be the header
- value (e.g., @samp{larsi@@ifi.uio.no}). All these headers will be
- inserted into the head of the outgoing mail.
- @node Wide Reply
- @section Wide Reply
- @findex message-wide-reply
- The @code{message-wide-reply} pops up a message buffer that's a wide
- reply to the message in the current buffer. A @dfn{wide reply} is a
- reply that goes out to all people listed in the @code{To}, @code{From}
- (or @code{Reply-to}) and @code{Cc} headers.
- @vindex message-wide-reply-to-function
- Message uses the normal methods to determine where wide replies are to go,
- but you can change the behavior to suit your needs by fiddling with the
- @code{message-wide-reply-to-function}. It is used in the same way as
- @code{message-reply-to-function} (@pxref{Reply}).
- @vindex message-dont-reply-to-names
- Addresses that match the @code{message-dont-reply-to-names} regular
- expression (or list of regular expressions or a predicate function)
- will be removed from the @code{Cc} header. A value of @code{nil} means
- to exclude only your email address.
- @vindex message-prune-recipient-rules
- @code{message-prune-recipient-rules} is used to prune the addresses
- used when doing a wide reply. It's meant to be used to remove
- duplicate addresses and the like. It's a list of lists, where the
- first element is a regexp to match the address to trigger the rule,
- and the second is a regexp that will be expanded based on the first,
- to match addresses to be pruned.
- It's complicated to explain, but it's easy to use.
- For instance, if you get an email from @samp{foo@@example.org}, but
- @samp{foo@@zot.example.org} is also in the @code{Cc} list, then your
- wide reply will go out to both these addresses, since they are unique.
- To avoid this, do something like the following:
- @lisp
- (setq message-prune-recipient-rules
- '(("^\\([^@@]+\\)@@\\(.*\\)" "\\1@@.*[.]\\2")))
- @end lisp
- If, for instance, you want all wide replies that involve messages from
- @samp{cvs@@example.org} to go to that address, and nowhere else (i.e.,
- remove all other recipients if @samp{cvs@@example.org} is in the
- recipient list:
- @lisp
- (setq message-prune-recipient-rules
- '(("cvs@@example.org" ".")))
- @end lisp
- @vindex message-wide-reply-confirm-recipients
- If @code{message-wide-reply-confirm-recipients} is non-@code{nil} you
- will be asked to confirm that you want to reply to multiple
- recipients. The default is @code{nil}.
- @node Followup
- @section Followup
- @findex message-followup
- The @code{message-followup} command pops up a message buffer that's a
- followup to the message in the current buffer.
- @vindex message-followup-to-function
- Message uses the normal methods to determine where followups are to go,
- but you can change the behavior to suit your needs by fiddling with the
- @code{message-followup-to-function}. It is used in the same way as
- @code{message-reply-to-function} (@pxref{Reply}).
- @vindex message-use-followup-to
- The @code{message-use-followup-to} variable says what to do about
- @code{Followup-To} headers. If it is @code{use}, always use the value.
- If it is @code{ask} (which is the default), ask whether to use the
- value. If it is @code{t}, use the value unless it is @samp{poster}. If
- it is @code{nil}, don't use the value.
- @node Canceling News
- @section Canceling News
- @findex message-cancel-news
- The @code{message-cancel-news} command cancels the article in the
- current buffer.
- @vindex message-cancel-message
- The value of @code{message-cancel-message} is inserted in the body of
- the cancel message. The default is @samp{I am canceling my own
- article.}.
- @cindex Cancel Locks
- @vindex message-insert-canlock
- @cindex canlock
- When Message posts news messages, it inserts @code{Cancel-Lock}
- headers by default. This is a cryptographic header that ensures that
- only you can cancel your own messages, which is nice. The downside
- is that if you lose your @file{.emacs} file (which is where Gnus
- stores the secret cancel lock password (which is generated
- automatically the first time you use this feature)), you won't be
- able to cancel your message. If you want to manage a password yourself,
- you can put something like the following in your @file{~/.gnus.el} file:
- @lisp
- (setq canlock-password "geheimnis"
- canlock-password-for-verify canlock-password)
- @end lisp
- Whether to insert the header or not is controlled by the
- @code{message-insert-canlock} variable.
- Not many news servers respect the @code{Cancel-Lock} header yet, but
- this is expected to change in the future.
- @node Superseding
- @section Superseding
- @findex message-supersede
- The @code{message-supersede} command pops up a message buffer that will
- supersede the message in the current buffer.
- @vindex message-ignored-supersedes-headers
- Headers matching the @code{message-ignored-supersedes-headers} are
- removed before popping up the new message buffer. The default is@*
- @samp{^Path:\\|^Date\\|^NNTP-Posting-Host:\\|^Xref:\\|^Lines:\\|@*
- ^Received:\\|^X-From-Line:\\|^X-Trace:\\|^X-Complaints-To:\\|@*
- Return-Path:\\|^Supersedes:\\|^NNTP-Posting-Date:\\|^X-Trace:\\|@*
- ^X-Complaints-To:\\|^Cancel-Lock:\\|^Cancel-Key:\\|^X-Hashcash:\\|@*
- ^X-Payment:\\|^Approved:}.
- @node Forwarding
- @section Forwarding
- @findex message-forward
- The @code{message-forward} command pops up a message buffer to forward
- the message in the current buffer. If given a prefix, forward using
- news.
- @table @code
- @item message-forward-ignored-headers
- @vindex message-forward-ignored-headers
- In non-@code{nil}, all headers that match this regexp will be deleted
- when forwarding a message.
- @item message-forward-included-headers
- @vindex message-forward-included-headers
- In non-@code{nil}, only headers that match this regexp will be kept
- when forwarding a message.
- @item message-make-forward-subject-function
- @vindex message-make-forward-subject-function
- A list of functions that are called to generate a subject header for
- forwarded messages. The subject generated by the previous function is
- passed into each successive function.
- The provided functions are:
- @table @code
- @item message-forward-subject-author-subject
- @findex message-forward-subject-author-subject
- Source of article (author or newsgroup), in brackets followed by the
- subject.
- @item message-forward-subject-fwd
- Subject of article with @samp{Fwd:} prepended to it.
- @end table
- @item message-wash-forwarded-subjects
- @vindex message-wash-forwarded-subjects
- If this variable is @code{t}, the subjects of forwarded messages have
- the evidence of previous forwards (such as @samp{Fwd:}, @samp{Re:},
- @samp{(fwd)}) removed before the new subject is
- constructed. The default value is @code{nil}.
- @item message-forward-as-mime
- @vindex message-forward-as-mime
- If this variable is @code{t} (the default), forwarded messages are
- included as inline @acronym{MIME} RFC822 parts. If it's @code{nil}, forwarded
- messages will just be copied inline to the new message, like previous,
- non @acronym{MIME}-savvy versions of Gnus would do.
- @item message-forward-before-signature
- @vindex message-forward-before-signature
- If non-@code{nil}, put forwarded message before signature, else after.
- @end table
- @node Resending
- @section Resending
- @findex message-resend
- The @code{message-resend} command will prompt the user for an address
- and resend the message in the current buffer to that address.
- @vindex message-ignored-resent-headers
- Headers that match the @code{message-ignored-resent-headers} regexp will
- be removed before sending the message.
- @node Bouncing
- @section Bouncing
- @findex message-bounce
- The @code{message-bounce} command will, if the current buffer contains a
- bounced mail message, pop up a message buffer stripped of the bounce
- information. A @dfn{bounced message} is typically a mail you've sent
- out that has been returned by some @code{mailer-daemon} as
- undeliverable.
- @vindex message-ignored-bounced-headers
- Headers that match the @code{message-ignored-bounced-headers} regexp
- will be removed before popping up the buffer. The default is
- @samp{^\\(Received\\|Return-Path\\|Delivered-To\\):}.
- @node Mailing Lists
- @section Mailing Lists
- @cindex Mail-Followup-To
- Sometimes while posting to mailing lists, the poster needs to direct
- followups to the post to specific places. The Mail-Followup-To (MFT)
- was created to enable just this. Three example scenarios where this is
- useful:
- @itemize @bullet
- @item
- A mailing list poster can use MFT to express that responses should be
- sent to just the list, and not the poster as well. This will happen
- if the poster is already subscribed to the list.
- @item
- A mailing list poster can use MFT to express that responses should be
- sent to the list and the poster as well. This will happen if the poster
- is not subscribed to the list.
- @item
- If a message is posted to several mailing lists, MFT may also be used
- to direct the following discussion to one list only, because
- discussions that are spread over several lists tend to be fragmented
- and very difficult to follow.
- @end itemize
- Gnus honors the MFT header in other's messages (i.e., while following
- up to someone else's post) and also provides support for generating
- sensible MFT headers for outgoing messages as well.
- @c @menu
- @c * Honoring an MFT post:: What to do when one already exists
- @c * Composing with a MFT header:: Creating one from scratch.
- @c @end menu
- @c @node Composing with a MFT header
- @subsection Composing a correct MFT header automagically
- The first step in getting Gnus to automagically generate a MFT header
- in posts you make is to give Gnus a list of the mailing lists
- addresses you are subscribed to. You can do this in more than one
- way. The following variables would come in handy.
- @table @code
- @vindex message-subscribed-addresses
- @item message-subscribed-addresses
- This should be a list of addresses the user is subscribed to. Its
- default value is @code{nil}. Example:
- @lisp
- (setq message-subscribed-addresses
- '("ding@@gnus.org" "bing@@noose.org"))
- @end lisp
- @vindex message-subscribed-regexps
- @item message-subscribed-regexps
- This should be a list of regexps denoting the addresses of mailing
- lists subscribed to. Default value is @code{nil}. Example: If you
- want to achieve the same result as above:
- @lisp
- (setq message-subscribed-regexps
- '("\\(ding@@gnus\\)\\|\\(bing@@noose\\)\\.org")
- @end lisp
- @vindex message-subscribed-address-functions
- @item message-subscribed-address-functions
- This can be a list of functions to be called (one at a time!!) to
- determine the value of MFT headers. It is advisable that these
- functions not take any arguments. Default value is @code{nil}.
- There is a pre-defined function in Gnus that is a good candidate for
- this variable. @code{gnus-find-subscribed-addresses} is a function
- that returns a list of addresses corresponding to the groups that have
- the @code{subscribed} (@pxref{Group Parameters, ,Group Parameters,
- gnus, The Gnus Manual}) group parameter set to a non-@code{nil} value.
- This is how you would do it.
- @lisp
- (setq message-subscribed-address-functions
- '(gnus-find-subscribed-addresses))
- @end lisp
- @vindex message-subscribed-address-file
- @item message-subscribed-address-file
- You might be one organized human freak and have a list of addresses of
- all subscribed mailing lists in a separate file! Then you can just
- set this variable to the name of the file and life would be good.
- @end table
- You can use one or more of the above variables. All their values are
- ``added'' in some way that works :-)
- Now you are all set. Just start composing a message as you normally do.
- And just send it; as always. Just before the message is sent out, Gnus'
- MFT generation thingy kicks in and checks if the message already has a
- MFT field. If there is one, it is left alone. (Except if it's empty;
- in that case, the field is removed and is not replaced with an
- automatically generated one. This lets you disable MFT generation on a
- per-message basis.) If there is none, then the list of recipient
- addresses (in the To: and Cc: headers) is checked to see if one of them
- is a list address you are subscribed to. If none of them is a list
- address, then no MFT is generated; otherwise, a MFT is added to the
- other headers and set to the value of all addresses in To: and Cc:
- @kindex C-c C-f C-a
- @findex message-generate-unsubscribed-mail-followup-to
- @kindex C-c C-f C-m
- @findex message-goto-mail-followup-to
- Hm. ``So'', you ask, ``what if I send an email to a list I am not
- subscribed to? I want my MFT to say that I want an extra copy.'' (This
- is supposed to be interpreted by others the same way as if there were no
- MFT, but you can use an explicit MFT to override someone else's
- to-address group parameter.) The function
- @code{message-generate-unsubscribed-mail-followup-to} might come in
- handy. It is bound to @kbd{C-c C-f C-a} by default. In any case, you
- can insert a MFT of your own choice; @kbd{C-c C-f C-m}
- (@code{message-goto-mail-followup-to}) will help you get started.
- @c @node Honoring an MFT post
- @subsection Honoring an MFT post
- @vindex message-use-mail-followup-to
- When you followup to a post on a mailing list, and the post has a MFT
- header, Gnus' action will depend on the value of the variable
- @code{message-use-mail-followup-to}. This variable can be one of:
- @table @code
- @item use
- Always honor MFTs. The To: and Cc: headers in your followup will be
- derived from the MFT header of the original post. This is the default.
- @item nil
- Always dishonor MFTs (just ignore the darned thing)
- @item ask
- Gnus will prompt you for an action.
- @end table
- It is considered good netiquette to honor MFT, as it is assumed the
- fellow who posted a message knows where the followups need to go
- better than you do.
- @node Commands
- @chapter Commands
- @menu
- * Buffer Entry:: Commands after entering a Message buffer.
- * Header Commands:: Commands for moving headers or changing headers.
- * Movement:: Moving around in message buffers.
- * Insertion:: Inserting things into message buffers.
- * MIME:: @acronym{MIME} considerations.
- * IDNA:: Non-@acronym{ASCII} domain name considerations.
- * Security:: Signing and encrypting messages.
- * Various Commands:: Various things.
- * Sending:: Actually sending the message.
- * Mail Aliases:: How to use mail aliases.
- * Spelling:: Having Emacs check your spelling.
- @end menu
- @node Buffer Entry
- @section Buffer Entry
- @cindex undo
- @kindex C-_
- You most often end up in a Message buffer when responding to some other
- message of some sort. Message does lots of handling of quoted text, and
- may remove signatures, reformat the text, or the like---depending on
- which used settings you're using. Message usually gets things right,
- but sometimes it stumbles. To help the user unwind these stumblings,
- Message sets the undo boundary before each major automatic action it
- takes. If you press the undo key (usually located at @kbd{C-_}) a few
- times, you will get back the un-edited message you're responding to.
- @node Header Commands
- @section Header Commands
- @subsection Commands for moving to headers
- These following commands move to the header in question. If it doesn't
- exist, it will be inserted.
- @table @kbd
- @item C-c ?
- @kindex C-c ?
- @findex describe-mode
- Describe the message mode.
- @item C-c C-f C-t
- @kindex C-c C-f C-t
- @findex message-goto-to
- Go to the @code{To} header (@code{message-goto-to}).
- @item C-c C-f C-o
- @kindex C-c C-f C-o
- @findex message-goto-from
- Go to the @code{From} header (@code{message-goto-from}). (The ``o''
- in the key binding is for Originator.)
- @item C-c C-f C-b
- @kindex C-c C-f C-b
- @findex message-goto-bcc
- Go to the @code{Bcc} header (@code{message-goto-bcc}).
- @item C-c C-f C-w
- @kindex C-c C-f C-w
- @findex message-goto-fcc
- Go to the @code{Fcc} header (@code{message-goto-fcc}).
- @item C-c C-f C-c
- @kindex C-c C-f C-c
- @findex message-goto-cc
- Go to the @code{Cc} header (@code{message-goto-cc}).
- @item C-c C-f C-s
- @kindex C-c C-f C-s
- @findex message-goto-subject
- Go to the @code{Subject} header (@code{message-goto-subject}).
- @item C-c C-f C-r
- @kindex C-c C-f C-r
- @findex message-goto-reply-to
- Go to the @code{Reply-To} header (@code{message-goto-reply-to}).
- @item C-c C-f C-n
- @kindex C-c C-f C-n
- @findex message-goto-newsgroups
- Go to the @code{Newsgroups} header (@code{message-goto-newsgroups}).
- @item C-c C-f C-d
- @kindex C-c C-f C-d
- @findex message-goto-distribution
- Go to the @code{Distribution} header (@code{message-goto-distribution}).
- @item C-c C-f C-f
- @kindex C-c C-f C-f
- @findex message-goto-followup-to
- Go to the @code{Followup-To} header (@code{message-goto-followup-to}).
- @item C-c C-f C-k
- @kindex C-c C-f C-k
- @findex message-goto-keywords
- Go to the @code{Keywords} header (@code{message-goto-keywords}).
- @item C-c C-f C-u
- @kindex C-c C-f C-u
- @findex message-goto-summary
- Go to the @code{Summary} header (@code{message-goto-summary}).
- @item C-c C-f C-i
- @kindex C-c C-f C-i
- @findex message-insert-or-toggle-importance
- This inserts the @samp{Importance:} header with a value of
- @samp{high}. This header is used to signal the importance of the
- message to the receiver. If the header is already present in the
- buffer, it cycles between the three valid values according to RFC
- 1376: @samp{low}, @samp{normal} and @samp{high}.
- @item C-c C-f C-a
- @kindex C-c C-f C-a
- @findex message-generate-unsubscribed-mail-followup-to
- Insert a reasonable @samp{Mail-Followup-To:} header
- (@pxref{Mailing Lists}) in a post to an
- unsubscribed list. When making original posts to a mailing list you are
- not subscribed to, you have to type in a @samp{Mail-Followup-To:} header
- by hand. The contents, usually, are the addresses of the list and your
- own address. This function inserts such a header automatically. It
- fetches the contents of the @samp{To:} header in the current mail
- buffer, and appends the current @code{user-mail-address}.
- If the optional argument @code{include-cc} is non-@code{nil}, the
- addresses in the @samp{Cc:} header are also put into the
- @samp{Mail-Followup-To:} header.
- @end table
- @subsection Commands to change headers
- @table @kbd
- @item C-c C-o
- @kindex C-c C-o
- @findex message-sort-headers
- @vindex message-header-format-alist
- Sort headers according to @code{message-header-format-alist}
- (@code{message-sort-headers}).
- @item C-c C-t
- @kindex C-c C-t
- @findex message-insert-to
- Insert a @code{To} header that contains the @code{Reply-To} or
- @code{From} header of the message you're following up
- (@code{message-insert-to}).
- @item C-c C-n
- @kindex C-c C-n
- @findex message-insert-newsgroups
- Insert a @code{Newsgroups} header that reflects the @code{Followup-To}
- or @code{Newsgroups} header of the article you're replying to
- (@code{message-insert-newsgroups}).
- @item C-c C-l
- @kindex C-c C-l
- @findex message-to-list-only
- Send a message to the list only. Remove all addresses but the list
- address from @code{To:} and @code{Cc:} headers.
- @item C-c M-n
- @kindex C-c M-n
- @findex message-insert-disposition-notification-to
- Insert a request for a disposition
- notification. (@code{message-insert-disposition-notification-to}).
- This means that if the recipient supports RFC 2298 she might send you a
- notification that she received the message.
- @item M-x message-insert-importance-high
- @kindex M-x message-insert-importance-high
- @findex message-insert-importance-high
- @cindex Importance
- Insert an @samp{Importance} header with a value of @samp{high},
- deleting headers if necessary.
- @item M-x message-insert-importance-low
- @kindex M-x message-insert-importance-low
- @findex message-insert-importance-low
- @cindex Importance
- Insert an @samp{Importance} header with a value of @samp{low}, deleting
- headers if necessary.
- @item C-c C-f s
- @kindex C-c C-f s
- @findex message-change-subject
- @cindex Subject
- Change the current @samp{Subject} header. Ask for new @samp{Subject}
- header and append @samp{(was: <Old Subject>)}. The old subject can be
- stripped on replying, see @code{message-subject-trailing-was-query}
- (@pxref{Message Headers}).
- @item C-c C-f x
- @kindex C-c C-f x
- @findex message-cross-post-followup-to
- @vindex message-cross-post-default
- @vindex message-cross-post-note-function
- @cindex X-Post
- @cindex cross-post
- Set up the @samp{FollowUp-To} header with a target newsgroup for a
- cross-post, add that target newsgroup to the @samp{Newsgroups} header if
- it is not a member of @samp{Newsgroups}, and insert a note in the body.
- If @code{message-cross-post-default} is @code{nil} or if this command is
- called with a prefix-argument, only the @samp{FollowUp-To} header will
- be set but the target newsgroup will not be added to the
- @samp{Newsgroups} header. The function to insert a note is controlled
- by the @code{message-cross-post-note-function} variable.
- @item C-c C-f t
- @kindex C-c C-f t
- @findex message-reduce-to-to-cc
- Replace contents of @samp{To} header with contents of @samp{Cc}
- header (or the @samp{Bcc} header, if there is no @samp{Cc} header).
- @item C-c C-f w
- @kindex C-c C-f w
- @findex message-insert-wide-reply
- Insert @samp{To} and @samp{Cc} headers as if you were doing a wide
- reply even if the message was not made for a wide reply first.
- @item C-c C-f a
- @kindex C-c C-f a
- @findex message-add-archive-header
- @vindex message-archive-header
- @vindex message-archive-note
- @cindex X-No-Archive
- Insert @samp{X-No-Archive: Yes} in the header and a note in the body.
- The header and the note can be customized using
- @code{message-archive-header} and @code{message-archive-note}. When
- called with a prefix argument, ask for a text to insert. If you don't
- want the note in the body, set @code{message-archive-note} to
- @code{nil}.
- @end table
- @node Movement
- @section Movement
- @table @kbd
- @item C-c C-b
- @kindex C-c C-b
- @findex message-goto-body
- Move to the beginning of the body of the message
- (@code{message-goto-body}).
- @item C-c C-i
- @kindex C-c C-i
- @findex message-goto-signature
- Move to the signature of the message (@code{message-goto-signature}).
- @item C-a
- @kindex C-a
- @findex message-beginning-of-line
- @vindex message-beginning-of-line
- If at beginning of header value, go to beginning of line, else go to
- beginning of header value. (The header value comes after the header
- name and the colon.) This behavior can be disabled by toggling
- the variable @code{message-beginning-of-line}.
- @end table
- @node Insertion
- @section Insertion
- @table @kbd
- @item C-c C-y
- @kindex C-c C-y
- @findex message-yank-original
- Yank the message that's being replied to into the message buffer
- (@code{message-yank-original}).
- @item C-c C-M-y
- @kindex C-c C-M-y
- @findex message-yank-buffer
- Prompt for a buffer name and yank the contents of that buffer into the
- message buffer (@code{message-yank-buffer}).
- @item C-c C-q
- @kindex C-c C-q
- @findex message-fill-yanked-message
- Fill the yanked message (@code{message-fill-yanked-message}). Warning:
- Can severely mess up the yanked text if its quoting conventions are
- strange. You'll quickly get a feel for when it's safe, though. Anyway,
- just remember that @kbd{C-x u} (@code{undo}) is available and you'll be
- all right.
- @item C-c C-w
- @kindex C-c C-w
- @findex message-insert-signature
- Insert a signature at the end of the buffer
- (@code{message-insert-signature}).
- @item C-c M-h
- @kindex C-c M-h
- @findex message-insert-headers
- Insert the message headers (@code{message-insert-headers}).
- @item C-c M-m
- @kindex C-c M-m
- @findex message-mark-inserted-region
- Mark some region in the current article with enclosing tags. See
- @code{message-mark-insert-begin} and @code{message-mark-insert-end}.
- When called with a prefix argument, use slrn style verbatim marks
- (@samp{#v+} and @samp{#v-}).
- @item C-c M-f
- @kindex C-c M-f
- @findex message-mark-insert-file
- Insert a file in the current article with enclosing tags.
- See @code{message-mark-insert-begin} and @code{message-mark-insert-end}.
- When called with a prefix argument, use slrn style verbatim marks
- (@samp{#v+} and @samp{#v-}).
- @end table
- @node MIME
- @section MIME
- @cindex MML
- @cindex MIME
- @cindex multipart
- @cindex attachment
- Message is a @acronym{MIME}-compliant posting agent. The user generally
- doesn't have to do anything to make the @acronym{MIME} happen---Message will
- automatically add the @code{Content-Type} and
- @code{Content-Transfer-Encoding} headers.
- @findex mml-attach-file
- @kindex C-c C-a
- The most typical thing users want to use the multipart things in
- @acronym{MIME} for is to add ``attachments'' to mail they send out.
- This can be done with the @kbd{C-c C-a} command (@kbd{M-x mml-attach-file}),
- which will prompt for a file name and a @acronym{MIME} type.
- @vindex mml-dnd-protocol-alist
- @vindex mml-dnd-attach-options
- If your Emacs supports drag and drop, you can also drop the file in the
- Message buffer. The variable @code{mml-dnd-protocol-alist} specifies
- what kind of action is done when you drop a file into the Message
- buffer. The variable @code{mml-dnd-attach-options} controls which
- @acronym{MIME} options you want to specify when dropping a file. If it
- is a list, valid members are @code{type}, @code{description} and
- @code{disposition}. @code{disposition} implies @code{type}. If it is
- @code{nil}, don't ask for options. If it is @code{t}, ask the user
- whether or not to specify options.
- You can also create arbitrarily complex multiparts using the @acronym{MML}
- language (@pxref{Composing, , Composing, emacs-mime, The Emacs MIME
- Manual}).
- @node IDNA
- @section IDNA
- @cindex IDNA
- @cindex internationalized domain names
- @cindex non-ascii domain names
- @acronym{IDNA} is a standard way to encode non-@acronym{ASCII} domain
- names into a readable @acronym{ASCII} string. The details can be
- found in RFC 3490.
- Message is a @acronym{IDNA}-compliant posting agent. The user
- generally doesn't have to do anything to make the @acronym{IDNA}
- happen---Message will encode non-@acronym{ASCII} domain names in @code{From},
- @code{To}, and @code{Cc} headers automatically.
- Until @acronym{IDNA} becomes more well known, Message queries you
- whether @acronym{IDNA} encoding of the domain name really should
- occur. Some users might not be aware that domain names can contain
- non-@acronym{ASCII} now, so this gives them a safety net if they accidentally
- typed a non-@acronym{ASCII} domain name.
- @vindex message-use-idna
- The @code{message-use-idna} variable control whether @acronym{IDNA} is
- used. If the variable is @code{nil} no @acronym{IDNA} encoding will
- ever happen, if it is set to the symbol @code{ask} the user will be
- queried, and if set to @code{t} (which is the default if @acronym{IDNA}
- is fully available) @acronym{IDNA} encoding happens automatically.
- @findex message-idna-to-ascii-rhs
- If you want to experiment with the @acronym{IDNA} encoding, you can
- invoke @kbd{M-x message-idna-to-ascii-rhs RET} in the message buffer
- to have the non-@acronym{ASCII} domain names encoded while you edit
- the message.
- Note that you must have @uref{http://www.gnu.org/software/libidn/, GNU
- Libidn} installed in order to use this functionality.
- @node Security
- @section Security
- @cindex Security
- @cindex S/MIME
- @cindex PGP
- @cindex PGP/MIME
- @cindex sign
- @cindex encrypt
- @cindex secure
- By default, e-mails are transmitted without any protection around the
- Internet, which implies that they can be read and changed by lots of
- different parties. In particular, they are analyzed under bulk
- surveillance, which violates basic human rights. To defend those
- rights, digital self-defense is necessary (in addition to legal
- changes), and encryption and digital signatures are powerful
- techniques for self-defense. In essence, encryption ensures that
- only the intended recipient will be able to read a message, while
- digital signatures make sure that modifications to messages can be
- detected by the recipient.
- Nowadays, there are two major incompatible e-mail encryption
- standards, namely @acronym{OpenPGP} and @acronym{S/MIME}. Both of
- these standards are implemented by the @uref{https://www.gnupg.org/,
- GNU Privacy Guard (GnuPG)}, which needs to be installed as external
- software in addition to GNU Emacs. Before you can start to encrypt,
- decrypt, and sign messages, you need to create a so-called key-pair,
- which consists of a private key and a public key. Your @emph{public} key
- (also known as @emph{certificate}, in particular with @acronym{S/MIME}), is
- used by others (a) to encrypt messages intended for you and (b) to verify
- digital signatures created by you. In contrast, you use your @emph{private}
- key (a) to decrypt messages and (b) to sign messages. (You may want to
- think of your public key as an open safe that you offer to others such
- that they can deposit messages and lock the door, while your private
- key corresponds to the opening combination for the safe.)
- Thus, you need to perform the following steps for e-mail encryption,
- typically outside Emacs. See, for example, the
- @uref{https://www.gnupg.org/gph/en/manual.html, The GNU Privacy
- Handbook} for details covering the standard @acronym{OpenPGP} with
- @acronym{GnuPG}.
- @enumerate
- @item
- Install GnuPG.
- @item
- Create a key-pair for your own e-mail address.
- @item
- Distribute your public key, e.g., via upload to key servers.
- @item
- Import the public keys for the recipients to which you want to send
- encrypted e-mails.
- @end enumerate
- Whether to use the standard @acronym{OpenPGP} or @acronym{S/MIME} is
- beyond the scope of this documentation. Actually, you can use one
- standard for one set of recipients and the other standard for
- different recipients (depending their preferences or capabilities).
- In case you are not familiar with all those acronyms: The standard
- @acronym{OpenPGP} is also called @acronym{PGP} (Pretty Good Privacy).
- The command line tools offered by @acronym{GnuPG} for
- @acronym{OpenPGP} are called @command{gpg} and @command{gpg2}, while
- the one for @acronym{S/MIME} is called @command{gpgsm}. An
- alternative, but discouraged, tool for @acronym{S/MIME} is
- @command{openssl}. To make matters worse, e-mail messages can be
- formed in two different ways with @acronym{OpenPGP}, namely
- @acronym{PGP} (RFC 1991/4880) and @acronym{PGP/MIME} (RFC 2015/3156).
- The good news, however, is the following: In GNU Emacs, Message
- supports all those variants, comes with reasonable defaults that can
- be customized according to your needs, and invokes the proper command
- line tools behind the scenes for encryption, decryption, as well as
- creation and verification of digital signatures.
- Message uses the @acronym{MML} language for the creation of signed
- and/or encrypted messages as explained in the following.
- @menu
- * Signing and encryption:: Signing and encrypting commands.
- * Using S/MIME:: Using S/MIME
- * Using OpenPGP:: Using OpenPGP
- * Passphrase caching:: How to cache passphrases
- * PGP Compatibility:: Compatibility with older implementations
- * Encrypt-to-self:: Reading your own encrypted messages
- * Bcc Warning:: Do not use encryption with Bcc headers
- @end menu
- @node Signing and encryption
- @subsection Signing and encrypting commands
- Instructing @acronym{MML} to perform security operations on a
- @acronym{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.
- @table @kbd
- @item C-c C-m s s
- @kindex C-c C-m s s
- @findex mml-secure-message-sign-smime
- Digitally sign current message using @acronym{S/MIME}.
- @item C-c C-m s o
- @kindex C-c C-m s o
- @findex mml-secure-message-sign-pgp
- Digitally sign current message using @acronym{PGP}.
- @item C-c C-m s p
- @kindex C-c C-m s p
- @findex mml-secure-message-sign-pgpmime
- Digitally sign current message using @acronym{PGP/MIME}.
- @item C-c C-m c s
- @kindex C-c C-m c s
- @findex mml-secure-message-encrypt-smime
- Digitally encrypt current message using @acronym{S/MIME}.
- @item C-c C-m c o
- @kindex C-c C-m c o
- @findex mml-secure-message-encrypt-pgp
- Digitally encrypt current message using @acronym{PGP}.
- @item C-c C-m c p
- @kindex C-c C-m c p
- @findex mml-secure-message-encrypt-pgpmime
- Digitally encrypt current message using @acronym{PGP/MIME}.
- @item C-c C-m C-n
- @kindex C-c C-m C-n
- @findex mml-unsecure-message
- Remove security related @acronym{MML} tags from message.
- @end table
- These commands do not immediately sign or encrypt the message, they
- merely insert the proper @acronym{MML} secure tag to instruct the
- @acronym{MML} engine to perform that operation when the message is
- actually sent. They may perform other operations too, such as locating
- and retrieving a @acronym{S/MIME} certificate of the person you wish to
- send encrypted mail to. When the mml parsing engine converts your
- @acronym{MML} into a properly encoded @acronym{MIME} message, the secure
- tag will be replaced with either a part or a multipart tag. If your
- message contains other mml parts, a multipart tag will be used; if no
- other parts are present in your message a single part tag will be used.
- This way, message mode will do the Right Thing (TM) with
- signed/encrypted multipart messages.
- Since signing and especially encryption often is used when sensitive
- information is sent, you may want to have some way to ensure that your
- mail is actually signed or encrypted. After invoking the above
- sign/encrypt commands, it is possible to preview the raw article by
- using @kbd{C-u C-c RET P} (@code{mml-preview}). Then you can
- verify that your long rant about what your ex-significant other or
- whomever actually did with that funny looking person at that strange
- party the other night, actually will be sent encrypted.
- @emph{Note!} Neither @acronym{PGP/MIME} nor @acronym{S/MIME} encrypt/signs
- RFC822 headers. They only operate on the @acronym{MIME} object. Keep this
- in mind before sending mail with a sensitive Subject line.
- By default, when encrypting a message, Gnus will use the
- ``signencrypt'' mode, which means the message is both signed and
- encrypted. If you would like to disable this for a particular
- message, give the @code{mml-secure-message-encrypt-*} command a prefix
- argument, e.g., @kbd{C-u C-c C-m c p}.
- Actually using the security commands above is not very difficult. At
- least not compared with making sure all involved programs talk with each
- other properly. Thus, we now describe what external libraries or
- programs are required to make things work, and some small general hints.
- @node Using S/MIME
- @subsection Using S/MIME
- @acronym{S/MIME} requires an external implementation, such as
- @uref{https://www.gnupg.org/, GNU Privacy Guard} or
- @uref{https://www.openssl.org/, OpenSSL}. The default Emacs interface
- to the S/MIME implementation is EasyPG (@pxref{Top,,EasyPG Assistant
- User's Manual, epa, EasyPG Assistant User's Manual}), which has been
- included in Emacs since version 23 and which relies on the command
- line tool @command{gpgsm} provided by @acronym{GnuPG}. That tool
- implements certificate management, including certificate revocation
- and expiry, while such tasks need to be performed manually, if OpenSSL
- is used.
- The choice between EasyPG and OpenSSL is controlled by the variable
- @code{mml-smime-use}, which needs to be set to the value @code{epg}
- for EasyPG. Depending on your version of Emacs that value may be the
- default; if not, you can either customize that variable or place the
- following line in your @file{.emacs} file (that line needs to be
- placed above other code related to message/gnus/encryption):
- @lisp
- (require 'epg)
- @end lisp
- Moreover, you may want to customize the variables
- @code{mml-default-encrypt-method} and
- @code{mml-default-sign-method} to the string @code{"smime"}.
- That's all if you want to use S/MIME with EasyPG, and that's the
- recommended way of using S/MIME with Message.
- If you think about using OpenSSL instead of EasyPG, please read the
- BUGS section in the manual for the @command{smime} command coming with
- OpenSSL first. If you still want to use OpenSSL, the following
- applies.
- @emph{Note!} The remainder of this section assumes you have a basic
- familiarity with modern cryptography, @acronym{S/MIME}, various PKCS
- standards, OpenSSL and so on.
- The @acronym{S/MIME} support in Message (and @acronym{MML}) can use
- OpenSSL@. OpenSSL performs the actual @acronym{S/MIME} sign/encrypt
- operations. OpenSSL can be found at @uref{http://www.openssl.org/}.
- OpenSSL 0.9.6 and later should work. Version 0.9.5a cannot extract mail
- addresses from certificates, and it insert a spurious CR character into
- @acronym{MIME} separators so you may wish to avoid it if you would like
- to avoid being regarded as someone who send strange mail. (Although by
- sending @acronym{S/MIME} messages you've probably already lost that
- contest.)
- To be able to send encrypted mail, a personal certificate is not
- required. Message (@acronym{MML}) need a certificate for the person to whom you
- wish to communicate with though. You're asked for this when you type
- @kbd{C-c C-m c s}. Currently there are two ways to retrieve this
- certificate, from a local file or from DNS@. If you chose a local
- file, it need to contain a X.509 certificate in @acronym{PEM} format.
- If you chose DNS, you're asked for the domain name where the
- certificate is stored, the default is a good guess. To my belief,
- Message (@acronym{MML}) is the first mail agent in the world to support
- retrieving @acronym{S/MIME} certificates from DNS, so you're not
- likely to find very many certificates out there. At least there
- should be one, stored at the domain @code{simon.josefsson.org}. LDAP
- is a more popular method of distributing certificates, support for it
- is planned. (Meanwhile, you can use @code{ldapsearch} from the
- command line to retrieve a certificate into a file and use it.)
- As for signing messages, OpenSSL can't perform signing operations
- without some kind of configuration. Especially, you need to tell it
- where your private key and your certificate is stored. @acronym{MML}
- uses an Emacs interface to OpenSSL, aptly named @code{smime.el}, and it
- contain a @code{custom} group used for this configuration. So, try
- @kbd{M-x customize-group RET smime RET} and look around.
- Currently there is no support for talking to a CA (or RA) to create
- your own certificate. None is planned either. You need to do this
- manually with OpenSSL or using some other program. I used Netscape
- and got a free @acronym{S/MIME} certificate from one of the big CA's on the
- net. Netscape is able to export your private key and certificate in
- PKCS #12 format. Use OpenSSL to convert this into a plain X.509
- certificate in PEM format as follows.
- @example
- $ openssl pkcs12 -in ns.p12 -clcerts -nodes > key+cert.pem
- @end example
- The @file{key+cert.pem} file should be pointed to from the
- @code{smime-keys} variable. You should now be able to send signed mail.
- @emph{Note!} Your private key is now stored unencrypted in the file,
- so take care in handling it. Storing encrypted keys on the disk are
- supported, and Gnus will ask you for a passphrase before invoking
- OpenSSL@. Read the OpenSSL documentation for how to achieve this. If
- you use unencrypted keys (e.g., if they are on a secure storage, or if
- you are on a secure single user machine) simply press @code{RET} at
- the passphrase prompt.
- @node Using OpenPGP
- @subsection Using OpenPGP
- Use of OpenPGP requires an external software, such
- as @uref{https://www.gnupg.org/, GNU Privacy Guard}. Pre-OpenPGP
- implementations such as PGP 2.x and PGP 5.x are also supported. The
- default Emacs interface to the PGP implementation is EasyPG
- (@pxref{Top,,EasyPG Assistant User's Manual, epa, EasyPG Assistant
- User's Manual}), but PGG (@pxref{Top, ,PGG, pgg, PGG Manual}) and
- Mailcrypt are also supported. @xref{PGP Compatibility}.
- As stated earlier, messages encrypted with OpenPGP can be formatted
- according to two different standards, namely @acronym{PGP} or
- @acronym{PGP/MIME}. The variables
- @code{mml-default-encrypt-method} and
- @code{mml-default-sign-method} determine which variant to prefer,
- @acronym{PGP/MIME} by default.
- @node Passphrase caching
- @subsection Passphrase caching
- @cindex gpg-agent
- Message with EasyPG internally calls GnuPG (the @command{gpg} or
- @command{gpgsm} command) to perform
- data encryption, and in certain cases (decrypting or signing for
- example), @command{gpg}/@command{gpgsm} requires user's passphrase.
- Currently the recommended way to supply your passphrase is to use the
- @command{gpg-agent} program.
- In particular, the @command{gpg-agent} program supports passphrase
- caching so that you do not need to enter your passphrase for every
- decryption/sign operation. @xref{Agent Options, , , gnupg, Using the
- GNU Privacy Guard}.
- How to use @command{gpg-agent} in Emacs depends on your version of
- GnuPG. With GnuPG version 2.1, @command{gpg-agent} is started
- automatically if necessary. With older versions you may need to run
- the following command from the shell before starting Emacs.
- @example
- eval `gpg-agent --daemon`
- @end example
- This will invoke @command{gpg-agent} and set the environment variable
- @code{GPG_AGENT_INFO} to allow @command{gpg} to communicate with it.
- It might be good idea to put this command in your @file{.xsession} or
- @file{.bash_profile}. @xref{Invoking GPG-AGENT, , , gnupg, Using the
- GNU Privacy Guard}.
- Once your @command{gpg-agent} is set up, it will ask you for a
- passphrase as needed for @command{gpg}. Under the X Window System,
- you will see a new passphrase input dialog appear. The dialog is
- provided by PIN Entry (the @command{pinentry} command), reasonably
- recent versions of which can also cooperate with Emacs on a text
- console. If that does not work, you may need to put a passphrase into
- gpg-agent's cache beforehand. The following command does the trick.
- @example
- gpg --use-agent --sign < /dev/null > /dev/null
- @end example
- @node PGP Compatibility
- @subsection Compatibility with older implementations
- @vindex gpg-temp-directory
- Note, if you are using the @code{gpg.el} you must make sure that the
- directory specified by @code{gpg-temp-directory} have permissions
- 0700.
- Creating your own key is described in detail in the documentation of
- your PGP implementation, so we refer to it.
- If you have imported your old PGP 2.x key into GnuPG, and want to send
- signed and encrypted messages to your fellow PGP 2.x users, you'll
- discover that the receiver cannot understand what you send. One
- solution is to use PGP 2.x instead (e.g., if you use @code{pgg}, set
- @code{pgg-default-scheme} to @code{pgp}). You could also convince your
- fellow PGP 2.x users to convert to GnuPG@.
- @vindex mml-signencrypt-style-alist
- As a final workaround, you can make the sign and encryption work in
- two steps; separately sign, then encrypt a message. If you would like
- to change this behavior you can customize the
- @code{mml-signencrypt-style-alist} variable. For example:
- @lisp
- (setq mml-signencrypt-style-alist '(("smime" separate)
- ("pgp" separate)
- ("pgpauto" separate)
- ("pgpmime" separate)))
- @end lisp
- This causes to sign and encrypt in two passes, thus generating a
- message that can be understood by PGP version 2.
- (Refer to @uref{http://www.gnupg.org/gph/en/pgp2x.html} for more
- information about the problem.)
- @node Encrypt-to-self
- @subsection Encrypt-to-self
- By default, messages are encrypted to all recipients (@code{To},
- @code{Cc}, @code{Bcc} headers). Thus, you will not be able to decrypt
- your own messages. To make sure that messages are also encrypted to
- your own key(s), several alternative solutions exist:
- @enumerate
- @item
- Use the @code{encrypt-to} option in the file @file{gpg.conf} (for
- OpenPGP) or @file{gpgsm.conf} (for @acronym{S/MIME} with EasyPG).
- @xref{Invoking GPG, , , gnupg, Using the GNU Privacy Guard}, or
- @xref{Invoking GPGSM, , , gnupg, Using the GNU Privacy Guard}.
- @item
- Include your own e-mail address (for which you created a key-pair)
- among the recipients.
- @item
- Customize the variable @code{mml-secure-openpgp-encrypt-to-self} (for
- OpenPGP) or @code{mml-secure-smime-encrypt-to-self} (for
- @acronym{S/MIME} with EasyPG).
- @end enumerate
- @node Bcc Warning
- @subsection Bcc Warning
- The @code{Bcc} header is meant to hide recipients of messages.
- However, when encrypted messages are used, the e-mail addresses of all
- @code{Bcc}-headers are given away to all recipients without
- warning, which is a bug.
- @vindex mml-secure-safe-bcc-list
- But now Message got to warn if @code{Bcc} recipients are found in an
- encrypted message when you are just about to send it. If you are sure
- those @code{Bcc} addresses are safe to expose, set the
- @code{mml-secure-safe-bcc-list} variable, that is a list of e-mail
- addresses. See
- @uref{https://debbugs.gnu.org/cgi/bugreport.cgi?bug=18718}.
- @node Various Commands
- @section Various Commands
- @table @kbd
- @item C-c C-r
- @kindex C-c C-r
- @findex message-caesar-buffer-body
- Caesar rotate (aka. rot13) the current message
- (@code{message-caesar-buffer-body}). If narrowing is in effect, just
- rotate the visible portion of the buffer. A numerical prefix says how
- many places to rotate the text. The default is 13.
- @item C-c C-e
- @kindex C-c C-e
- @findex message-elide-region
- @vindex message-elide-ellipsis
- Elide the text between point and mark (@code{message-elide-region}).
- The text is killed and replaced with the contents of the variable
- @code{message-elide-ellipsis}. The default value is to use an ellipsis
- (@samp{[...]}).
- This is a format-spec string, and you can use @samp{%l} to say how
- many lines were removed, and @samp{%c} to say how many characters were
- removed.
- @item C-c M-k
- @kindex C-c M-k
- @findex message-kill-address
- Kill the address under point.
- @item C-c C-z
- @kindex C-c C-z
- @findex message-kill-to-signature
- Kill all the text up to the signature, or if that's missing, up to the
- end of the message (@code{message-kill-to-signature}).
- @item C-c C-v
- @kindex C-c C-v
- @findex message-delete-not-region
- Delete all text in the body of the message that is outside the region
- (@code{message-delete-not-region}).
- @item M-RET
- @kindex M-RET
- @findex message-newline-and-reformat
- Insert four newlines, and then reformat if inside quoted text.
- Here's an example:
- @example
- > This is some quoted text. And here's more quoted text.
- @end example
- If point is before @samp{And} and you press @kbd{M-RET}, you'll get:
- @example
- > This is some quoted text.
- *
- > And here's more quoted text.
- @end example
- @samp{*} says where point will be placed.
- @item C-c M-r
- @kindex C-c M-r
- @findex message-rename-buffer
- Rename the buffer (@code{message-rename-buffer}). If given a prefix,
- prompt for a new buffer name.
- @item TAB
- @kindex TAB
- @findex message-tab
- @vindex message-tab-body-function
- If @code{message-tab-body-function} is non-@code{nil}, execute the
- function it specifies. Otherwise use the function bound to @kbd{TAB} in
- @code{text-mode-map} or @code{global-map}.
- @end table
- @node Sending
- @section Sending
- @table @kbd
- @item C-c C-c
- @kindex C-c C-c
- @findex message-send-and-exit
- Send the message and bury the current buffer
- (@code{message-send-and-exit}).
- @item C-c C-s
- @kindex C-c C-s
- @findex message-send
- Send the message (@code{message-send}).
- @item C-c C-d
- @kindex C-c C-d
- @findex message-dont-send
- Bury the message buffer and exit (@code{message-dont-send}).
- @item C-c C-k
- @kindex C-c C-k
- @findex message-kill-buffer
- Kill the message buffer and exit (@code{message-kill-buffer}).
- @end table
- @node Mail Aliases
- @section Mail Aliases
- @cindex mail aliases
- @cindex aliases
- @cindex completion
- @cindex ecomplete
- @vindex message-mail-alias-type
- The @code{message-mail-alias-type} variable controls what type of mail
- alias expansion to use. Currently two forms are supported:
- @code{mailabbrev} and @code{ecomplete}. If this variable is
- @code{nil}, no mail alias expansion will be performed.
- @code{mailabbrev} works by parsing the @file{/etc/mailrc} and
- @file{~/.mailrc} files. These files look like:
- @example
- alias lmi "Lars Magne Ingebrigtsen <larsi@@ifi.uio.no>"
- alias ding "ding@@ifi.uio.no (ding mailing list)"
- @end example
- After adding lines like this to your @file{~/.mailrc} file, you should
- be able to just write @samp{lmi} in the @code{To} or @code{Cc} (and so
- on) headers and press @kbd{SPC} to expand the alias.
- No expansion will be performed upon sending of the message---all
- expansions have to be done explicitly.
- If you're using @code{ecomplete}, all addresses from @code{To} and
- @code{Cc} headers will automatically be put into the
- @file{~/.ecompleterc} file. When you enter text in the @code{To} and
- @code{Cc} headers, @code{ecomplete} will check out the values stored
- there and ``electrically'' say what completions are possible. To
- choose one of these completions, use the @kbd{M-n} command to move
- down to the list. Use @kbd{M-n} and @kbd{M-p} to move down and up the
- list, and @kbd{RET} to choose a completion.
- @node Spelling
- @section Spelling
- @cindex spelling
- @findex ispell-message
- There are two popular ways to have Emacs spell-check your messages:
- @code{ispell} and @code{flyspell}. @code{ispell} is the older and
- probably more popular package. You typically first write the message,
- and then run the entire thing through @code{ispell} and fix all the
- typos. To have this happen automatically when you send a message, put
- something like the following in your @file{.emacs} file:
- @lisp
- (add-hook 'message-send-hook 'ispell-message)
- @end lisp
- @vindex ispell-message-dictionary-alist
- If you're in the habit of writing in different languages, this can be
- controlled by the @code{ispell-message-dictionary-alist} variable:
- @lisp
- (setq ispell-message-dictionary-alist
- '(("^Newsgroups:.*\\bde\\." . "deutsch8")
- (".*" . "default")))
- @end lisp
- @code{ispell} depends on having the external @samp{ispell} command
- installed.
- The other popular method is using @code{flyspell}. This package checks
- your spelling while you're writing, and marks any mis-spelled words in
- various ways.
- To use @code{flyspell}, put something like the following in your
- @file{.emacs} file:
- @lisp
- (defun my-message-setup-routine ()
- (flyspell-mode 1))
- (add-hook 'message-setup-hook 'my-message-setup-routine)
- @end lisp
- @code{flyspell} depends on having the external @samp{ispell} command
- installed.
- @node Variables
- @chapter Variables
- @menu
- * Message Headers:: General message header stuff.
- * Mail Headers:: Customizing mail headers.
- * Mail Variables:: Other mail variables.
- * News Headers:: Customizing news headers.
- * News Variables:: Other news variables.
- * Insertion Variables:: Customizing how things are inserted.
- * Various Message Variables:: Other message variables.
- * Sending Variables:: Variables for sending.
- * Message Buffers:: How Message names its buffers.
- * Message Actions:: Actions to be performed when exiting.
- @end menu
- @node Message Headers
- @section Message Headers
- Message is quite aggressive on the message generation front. It has to
- be---it's a combined news and mail agent. To be able to send combined
- messages, it has to generate all headers itself (instead of letting the
- mail/news system do it) to ensure that mail and news copies of messages
- look sufficiently similar.
- @table @code
- @item message-generate-headers-first
- @vindex message-generate-headers-first
- If @code{t}, generate all required headers before starting to
- compose the message. This can also be a list of headers to generate:
- @lisp
- (setq message-generate-headers-first
- '(References))
- @end lisp
- @vindex message-required-headers
- The variables @code{message-required-headers},
- @code{message-required-mail-headers} and
- @code{message-required-news-headers} specify which headers are
- required.
- Note that some headers will be removed and re-generated before posting,
- because of the variable @code{message-deletable-headers} (see below).
- @item message-draft-headers
- @vindex message-draft-headers
- When running Message from Gnus, the message buffers are associated
- with a draft group. @code{message-draft-headers} says which headers
- should be generated when a draft is written to the draft group.
- @item message-from-style
- @vindex message-from-style
- Specifies how @code{From} headers should look. There are four valid
- values:
- @table @code
- @item nil
- Just the address---@samp{king@@grassland.com}.
- @item parens
- @samp{king@@grassland.com (Elvis Parsley)}.
- @item angles
- @samp{Elvis Parsley <king@@grassland.com>}.
- @item default
- Look like @code{angles} if that doesn't require quoting, and
- @code{parens} if it does. If even @code{parens} requires quoting, use
- @code{angles} anyway.
- @end table
- @item message-deletable-headers
- @vindex message-deletable-headers
- Headers in this list that were previously generated by Message will be
- deleted before posting. Let's say you post an article. Then you decide
- to post it again to some other group, you naughty boy, so you jump back
- to the @file{*post-buf*} buffer, edit the @code{Newsgroups} line, and
- ship it off again. By default, this variable makes sure that the old
- generated @code{Message-ID} is deleted, and a new one generated. If
- this isn't done, the entire empire would probably crumble, anarchy would
- prevail, and cats would start walking on two legs and rule the world.
- Allegedly.
- @item message-default-headers
- @vindex message-default-headers
- Header lines to be inserted in outgoing messages before you edit the
- message, so you can edit or delete their lines. If set to a string, it
- is directly inserted. If set to a function, it is called and its
- result is inserted.
- @item message-subject-re-regexp
- @vindex message-subject-re-regexp
- @cindex Aw
- @cindex Sv
- @cindex Re
- Responses to messages have subjects that start with @samp{Re: }. This
- is @emph{not} an abbreviation of the English word ``response'', but is
- Latin, and means ``in response to''. Some illiterate nincompoops have
- failed to grasp this fact, and have ``internationalized'' their software
- to use abominations like @samp{Aw: } (``antwort'') or @samp{Sv: }
- (``svar'') instead, which is meaningless and evil. However, you may
- have to deal with users that use these evil tools, in which case you may
- set this variable to a regexp that matches these prefixes. Myself, I
- just throw away non-compliant mail.
- Here's an example of a value to deal with these headers when
- responding to a message:
- @lisp
- (setq message-subject-re-regexp
- (concat
- "^[ \t]*"
- "\\("
- "\\("
- "[Aa][Nn][Tt][Ww]\\.?\\|" ; antw
- "[Aa][Ww]\\|" ; aw
- "[Ff][Ww][Dd]?\\|" ; fwd
- "[Oo][Dd][Pp]\\|" ; odp
- "[Rr][Ee]\\|" ; re
- "[Rr][\311\351][Ff]\\.?\\|" ; ref
- "[Ss][Vv]" ; sv
- "\\)"
- "\\(\\[[0-9]*\\]\\)"
- "*:[ \t]*"
- "\\)"
- "*[ \t]*"
- ))
- @end lisp
- @item message-subject-trailing-was-query
- @vindex message-subject-trailing-was-query
- @vindex message-subject-trailing-was-ask-regexp
- @vindex message-subject-trailing-was-regexp
- Controls what to do with trailing @samp{(was: <old subject>)} in subject
- lines. If @code{nil}, leave the subject unchanged. If it is the symbol
- @code{ask}, query the user what to do. In this case, the subject is
- matched against @code{message-subject-trailing-was-ask-regexp}. If
- @code{message-subject-trailing-was-query} is @code{t}, always strip the
- trailing old subject. In this case,
- @code{message-subject-trailing-was-regexp} is used.
- @item message-alternative-emails
- @vindex message-alternative-emails
- Regexp or predicate function matching alternative email addresses.
- The first address in the To, Cc or From headers of the original
- article matching this variable is used as the From field of outgoing
- messages, replacing the default From value.
- For example, if you have two secondary email addresses john@@home.net
- and john.doe@@work.com and want to use them in the From field when
- composing a reply to a message addressed to one of them, you could set
- this variable like this:
- @lisp
- (setq message-alternative-emails
- (regexp-opt '("john@@home.net" "john.doe@@work.com")))
- @end lisp
- This variable has precedence over posting styles and anything that runs
- off @code{message-setup-hook}.
- @item message-allow-no-recipients
- @vindex message-allow-no-recipients
- Specifies what to do when there are no recipients other than
- @code{Gcc} or @code{Fcc}. If it is @code{always}, the posting is
- allowed. If it is @code{never}, the posting is not allowed. If it is
- @code{ask} (the default), you are prompted.
- @item message-hidden-headers
- @vindex message-hidden-headers
- A regexp, a list of regexps, or a list where the first element is
- @code{not} and the rest are regexps. It says which headers to keep
- hidden when composing a message.
- @lisp
- (setq message-hidden-headers
- '(not "From" "Subject" "To" "Cc" "Newsgroups"))
- @end lisp
- Headers are hidden using narrowing, you can use @kbd{M-x widen} to
- expose them in the buffer.
- @item message-header-synonyms
- @vindex message-header-synonyms
- A list of lists of header synonyms. E.g., if this list contains a
- member list with elements @code{Cc} and @code{To}, then
- @code{message-carefully-insert-headers} will not insert a @code{To}
- header when the message is already @code{Cc}ed to the recipient.
- @end table
- @node Mail Headers
- @section Mail Headers
- @table @code
- @item message-required-mail-headers
- @vindex message-required-mail-headers
- @xref{News Headers}, for the syntax of this variable. It is
- @code{(From Subject Date (optional . In-Reply-To) Message-ID
- (optional . User-Agent))} by default.
- @item message-ignored-mail-headers
- @vindex message-ignored-mail-headers
- Regexp of headers to be removed before mailing. The default is@*
- @samp{^[GF]cc:\\|^Resent-Fcc:\\|^Xref:\\|^X-Draft-From:\\|@*
- ^X-Gnus-Agent-Meta-Information:}.
- @item message-default-mail-headers
- @vindex message-default-mail-headers
- This string is inserted at the end of the headers in all message
- buffers that are initialized as mail.
- @item message-generate-hashcash
- @vindex message-generate-hashcash
- Variable that indicates whether @samp{X-Hashcash} headers
- should be computed for the message. @xref{Hashcash, ,Hashcash,gnus,
- The Gnus Manual}. If @code{opportunistic}, only generate the headers
- when it doesn't lead to the user having to wait.
- @end table
- @node Mail Variables
- @section Mail Variables
- @table @code
- @item message-send-mail-function
- @vindex message-send-mail-function
- @findex message-send-mail-function
- @findex message-send-mail-with-sendmail
- @findex message-send-mail-with-mh
- @findex message-send-mail-with-qmail
- @findex message-smtpmail-send-it
- @findex smtpmail-send-it
- @findex feedmail-send-it
- @findex message-send-mail-with-mailclient
- Function used to send the current buffer as mail. The default is
- @code{message-send-mail-with-sendmail}, or @code{smtpmail-send-it}
- according to the system. Other valid values include
- @code{message-send-mail-with-mailclient},
- @code{message-send-mail-with-mh}, @code{message-send-mail-with-qmail},
- @code{message-smtpmail-send-it} and @code{feedmail-send-it}.
- The function
- @code{message-send-mail-with-sendmail} pipes your article to the
- @code{sendmail} binary for further queuing and sending. When your local
- system is not configured for sending mail using @code{sendmail}, and you
- have access to a remote @acronym{SMTP} server, you can set
- @code{message-send-mail-function} to @code{smtpmail-send-it} and make
- sure to setup the @code{smtpmail} package correctly. An example:
- @lisp
- (setq message-send-mail-function 'smtpmail-send-it
- 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 @acronym{ISP}
- requires the @acronym{POP}-before-@acronym{SMTP} authentication.
- @xref{POP before SMTP, , POP before SMTP, gnus, The Gnus Manual}.
- @cindex X-Message-SMTP-Method
- If you have a complex @acronym{SMTP} setup, and want some messages to
- go via one mail server, and other messages to go through another, you
- can use the @samp{X-Message-SMTP-Method} header. These are the
- supported values:
- @table @samp
- @item smtpmail
- @example
- X-Message-SMTP-Method: smtp smtp.fsf.org 587
- @end example
- This will send the message via @samp{smtp.fsf.org}, using port 587.
- @example
- X-Message-SMTP-Method: smtp smtp.fsf.org 587 other-user
- @end example
- This is the same as the above, but uses @samp{other-user} as the user
- name when authenticating. This is handy if you have several
- @acronym{SMTP} accounts on the same server.
- @item sendmail
- @example
- X-Message-SMTP-Method: sendmail
- @end example
- This will send the message via the locally installed sendmail/exim/etc
- installation.
- @end table
- @item message-mh-deletable-headers
- @vindex message-mh-deletable-headers
- Most versions of MH doesn't like being fed messages that contain the
- headers in this variable. If this variable is non-@code{nil} (which is
- the default), these headers will be removed before mailing when sending
- messages via MH@. Set it to @code{nil} if your MH can handle these
- headers.
- @item message-qmail-inject-program
- @vindex message-qmail-inject-program
- @cindex qmail
- Location of the qmail-inject program.
- @item message-qmail-inject-args
- @vindex message-qmail-inject-args
- Arguments passed to qmail-inject programs.
- This should be a list of strings, one string for each argument. It
- may also be a function.
- E.g., if you wish to set the envelope sender address so that bounces
- go to the right place or to deal with listserv's usage of that address, you
- might set this variable to @code{'("-f" "you@@some.where")}.
- @item message-sendmail-f-is-evil
- @vindex message-sendmail-f-is-evil
- @cindex sendmail
- Non-@code{nil} means don't add @samp{-f username} to the sendmail
- command line. Doing so would be even more evil than leaving it out.
- @item message-sendmail-envelope-from
- @vindex message-sendmail-envelope-from
- When @code{message-sendmail-f-is-evil} is @code{nil}, this specifies
- the address to use in the @acronym{SMTP} envelope. If it is
- @code{nil}, use @code{user-mail-address}. If it is the symbol
- @code{header}, use the @samp{From} header of the message.
- @item message-mailer-swallows-blank-line
- @vindex message-mailer-swallows-blank-line
- Set this to non-@code{nil} if the system's mailer runs the header and
- body together. (This problem exists on SunOS 4 when sendmail is run
- in remote mode.) The value should be an expression to test whether
- the problem will actually occur.
- @item message-send-mail-partially-limit
- @vindex message-send-mail-partially-limit
- @cindex split large message
- The limitation of messages sent as message/partial. The lower bound
- of message size in characters, beyond which the message should be sent
- in several parts. If it is @code{nil} (which is the default), the
- size is unlimited.
- @end table
- @node News Headers
- @section News Headers
- @vindex message-required-news-headers
- @code{message-required-news-headers} a list of header symbols. These
- headers will either be automatically generated, or, if that's
- impossible, they will be prompted for. The following symbols are valid:
- @table @code
- @item From
- @cindex From
- @findex user-full-name
- @findex user-mail-address
- This required header will be filled out with the result of the
- @code{message-make-from} function, which depends on the
- @code{message-from-style}, @code{user-full-name},
- @code{user-mail-address} variables.
- @item Subject
- @cindex Subject
- This required header will be prompted for if not present already.
- @item Newsgroups
- @cindex Newsgroups
- This required header says which newsgroups the article is to be posted
- to. If it isn't present already, it will be prompted for.
- @item Organization
- @cindex organization
- @vindex message-user-organization
- @vindex message-user-organization-file
- This optional header will be filled out depending on the
- @code{message-user-organization} variable.
- @code{message-user-organization-file} will be used if this variable is
- @code{t}. This variable can also be a string (in which case this string
- will be used), or it can be a function (which will be called with no
- parameters and should return a string to be used).
- @item Lines
- @cindex Lines
- This optional header will be computed by Message.
- @item Message-ID
- @cindex Message-ID
- @vindex message-user-fqdn
- @vindex mail-host-address
- @vindex user-mail-address
- @findex system-name
- @cindex Sun
- @cindex i-did-not-set--mail-host-address--so-tickle-me
- This required header will be generated by Message. A unique ID will be
- created based on the date, time, user name (for the local part) and the
- domain part. For the domain part, message will look (in this order) at
- @code{message-user-fqdn}, @code{system-name}, @code{mail-host-address}
- and @code{message-user-mail-address} (i.e., @code{user-mail-address})
- until a probably valid fully qualified domain name (FQDN) was found.
- @item User-Agent
- @cindex User-Agent
- This optional header will be filled out according to the
- @code{message-newsreader} local variable.
- @item In-Reply-To
- This optional header is filled out using the @code{Date} and @code{From}
- header of the article being replied to.
- @item Expires
- @cindex Expires
- @vindex message-expires
- This extremely optional header will be inserted according to the
- @code{message-expires} variable. It is highly deprecated and shouldn't
- be used unless you know what you're doing.
- @item Distribution
- @cindex Distribution
- @vindex message-distribution-function
- This optional header is filled out according to the
- @code{message-distribution-function} variable. It is a deprecated and
- much misunderstood header.
- @item Path
- @cindex path
- @vindex message-user-path
- This extremely optional header should probably never be used.
- However, some @emph{very} old servers require that this header is
- present. @code{message-user-path} further controls how this
- @code{Path} header is to look. If it is @code{nil}, use the server name
- as the leaf node. If it is a string, use the string. If it is neither
- a string nor @code{nil}, use the user name only. However, it is highly
- unlikely that you should need to fiddle with this variable at all.
- @end table
- @cindex Mime-Version
- In addition, you can enter conses into this list. The @sc{car} of this cons
- should be a symbol. This symbol's name is the name of the header, and
- the @sc{cdr} can either be a string to be entered verbatim as the value of
- this header, or it can be a function to be called. This function should
- take no arguments, and return a string to be inserted. For
- instance, if you want to insert @code{Mime-Version: 1.0}, you should
- enter @code{(Mime-Version . "1.0")} into the list.
- If the list contains a cons where the @sc{car} of the cons is
- @code{optional}, the @sc{cdr} of this cons will only be inserted if it is
- non-@code{nil}.
- If you want to delete an entry from this list, the following Lisp
- snippet might be useful. Adjust accordingly if you want to remove
- another element.
- @lisp
- (setq message-required-news-headers
- (delq 'Message-ID message-required-news-headers))
- @end lisp
- Other variables for customizing outgoing news articles:
- @table @code
- @item message-syntax-checks
- @vindex message-syntax-checks
- Controls what syntax checks should not be performed on outgoing posts.
- To disable checking of long signatures, for instance, add
- @lisp
- (signature . disabled)
- @end lisp
- to this list.
- Valid checks are:
- @table @code
- @item approved
- @cindex approved
- Check whether the article has an @code{Approved} header, which is
- something only moderators should include.
- @item continuation-headers
- Check whether there are continuation header lines that don't begin with
- whitespace.
- @item control-chars
- Check for invalid characters.
- @item empty
- Check whether the article is empty.
- @item existing-newsgroups
- Check whether the newsgroups mentioned in the @code{Newsgroups} and
- @code{Followup-To} headers exist.
- @item from
- Check whether the @code{From} header seems nice.
- @item illegible-text
- Check whether there is any non-printable character in the body.
- @item invisible-text
- Check whether there is any invisible text in the buffer.
- @item long-header-lines
- Check for too long header lines.
- @item long-lines
- @cindex long lines
- Check for too long lines in the body.
- @item message-id
- Check whether the @code{Message-ID} looks syntactically ok.
- @item multiple-headers
- Check for the existence of multiple equal headers.
- @item new-text
- Check whether there is any new text in the messages.
- @item newsgroups
- Check whether the @code{Newsgroups} header exists and is not empty.
- @item quoting-style
- Check whether text follows last quoted portion.
- @item repeated-newsgroups
- Check whether the @code{Newsgroups} and @code{Followup-to} headers
- contains repeated group names.
- @item reply-to
- Check whether the @code{Reply-To} header looks ok.
- @item sender
- @cindex Sender
- Insert a new @code{Sender} header if the @code{From} header looks odd.
- @item sendsys
- @cindex sendsys
- Check for the existence of version and sendsys commands.
- @item shoot
- Check whether the domain part of the @code{Message-ID} header looks ok.
- @item shorten-followup-to
- Check whether to add a @code{Followup-to} header to shorten the number
- of groups to post to.
- @item signature
- Check the length of the signature.
- @item size
- Check for excessive size.
- @item subject
- Check whether the @code{Subject} header exists and is not empty.
- @item subject-cmsg
- Check the subject for commands.
- @item valid-newsgroups
- Check whether the @code{Newsgroups} and @code{Followup-to} headers
- are valid syntactically.
- @end table
- All these conditions are checked by default, except for @code{sender}
- for which the check is disabled by default if
- @code{message-insert-canlock} is non-@code{nil} (@pxref{Canceling News}).
- @item message-ignored-news-headers
- @vindex message-ignored-news-headers
- Regexp of headers to be removed before posting. The default is@*
- @samp{^NNTP-Posting-Host:\\|^Xref:\\|^[BGF]cc:\\|^Resent-Fcc:\\|@*
- ^X-Draft-From:\\|^X-Gnus-Agent-Meta-Information:}.
- @item message-default-news-headers
- @vindex message-default-news-headers
- This string is inserted at the end of the headers in all message
- buffers that are initialized as news.
- @end table
- @node News Variables
- @section News Variables
- @table @code
- @item message-send-news-function
- @vindex message-send-news-function
- Function used to send the current buffer as news. The default is
- @code{message-send-news}.
- @item message-post-method
- @vindex message-post-method
- Gnusish @dfn{select method} (see the Gnus manual for details) used for
- posting a prepared news message.
- @end table
- @node Insertion Variables
- @section Insertion Variables
- @table @code
- @item message-cite-style
- @vindex message-cite-style
- The overall style to be used when replying to messages. This controls
- things like where the reply should be put relative to the original,
- how the citation is formatted, where the signature goes, etc.
- Value is either @code{nil} (no variable overrides) or a let-style list
- of pairs @code{(VARIABLE VALUE)} to override default values.
- See @code{gnus-posting-styles} to set this variable for specific
- groups. Presets to impersonate popular mail agents are available in the
- @code{message-cite-style-*} variables.
- @item message-cite-reply-position
- @vindex message-cite-reply-position
- Where the reply should be positioned. Available styles are
- @code{traditional} to reply inline, @code{above} for top-posting, and
- @code{below} for bottom-posting
- @item message-ignored-cited-headers
- @vindex message-ignored-cited-headers
- All headers that match this regexp will be removed from yanked
- messages. The default is @samp{.}, which means that all headers will be
- removed.
- @item message-cite-prefix-regexp
- @vindex message-cite-prefix-regexp
- Regexp matching the longest possible citation prefix on a line.
- @item message-citation-line-function
- @vindex message-citation-line-function
- @cindex attribution line
- Function called to insert the citation line. The default is
- @code{message-insert-citation-line}, which will lead to citation lines
- that look like:
- @example
- Hallvard B Furuseth <h.b.furuseth@@usit.uio.no> writes:
- @end example
- @c FIXME: Add 'message-insert-formatted-citation-line' and
- @c 'message-citation-line-format'.
- Point will be at the beginning of the body of the message when this
- function is called.
- Note that Gnus provides a feature where clicking on @samp{writes:} hides the
- cited text. If you change the citation line too much, readers of your
- messages will have to adjust their Gnus, too. See the variable
- @code{gnus-cite-attribution-suffix}. @xref{Article Highlighting, ,
- Article Highlighting, gnus, The Gnus Manual}, for details.
- @item message-yank-prefix
- @vindex message-yank-prefix
- @cindex yanking
- @cindex quoting
- When you are replying to or following up an article, you normally want
- to quote the person you are answering. Inserting quoted text is done by
- @dfn{yanking}, and each line you yank will have
- @code{message-yank-prefix} prepended to it (except for quoted lines
- which use @code{message-yank-cited-prefix} and empty lines which use
- @code{message-yank-empty-prefix}). The default is @samp{> }.
- @item message-yank-cited-prefix
- @vindex message-yank-cited-prefix
- @cindex yanking
- @cindex cited
- @cindex quoting
- When yanking text from an article which contains already cited text,
- each line will be prefixed with the contents of this variable. The
- default is @samp{>}. See also @code{message-yank-prefix}.
- @item message-yank-empty-prefix
- @vindex message-yank-empty-prefix
- @cindex yanking
- @cindex quoting
- When yanking text from an article, each empty line will be prefixed with
- the contents of this variable. The default is @samp{>}. You can set
- this variable to an empty string to split the cited text into paragraphs
- automatically. See also @code{message-yank-prefix}.
- @item message-indentation-spaces
- @vindex message-indentation-spaces
- Number of spaces to indent yanked messages.
- @item message-cite-function
- @vindex message-cite-function
- @findex message-cite-original
- @findex message-cite-original-without-signature
- Function for citing an original message. The default is
- @code{message-cite-original}, which simply inserts the original message
- and prepends @samp{> } to each line.
- @code{message-cite-original-without-signature} does the same, but elides
- the signature.
- @item message-indent-citation-function
- @vindex message-indent-citation-function
- Function for modifying a citation just inserted in the mail buffer.
- This can also be a list of functions. Each function can find the
- citation between @code{(point)} and @code{(mark t)}. And each function
- should leave point and mark around the citation text as modified.
- @item message-mark-insert-begin
- @vindex message-mark-insert-begin
- String to mark the beginning of some inserted text.
- @item message-mark-insert-end
- @vindex message-mark-insert-end
- String to mark the end of some inserted text.
- @item message-signature
- @vindex message-signature
- String to be inserted at the end of the message buffer. If @code{t}
- (which is the default), the @code{message-signature-file} file will be
- inserted instead. If a function, the result from the function will be
- used instead. If a form, the result from the form will be used instead.
- If this variable is @code{nil}, no signature will be inserted at all.
- @item message-signature-file
- @vindex message-signature-file
- File containing the signature to be inserted at the end of the buffer.
- If a path is specified, the value of
- @code{message-signature-directory} is ignored, even if set.
- The default is @file{~/.signature}.
- @item message-signature-directory
- @vindex message-signature-directory
- Name of directory containing signature files. Comes in handy if you
- have many such files, handled via Gnus posting styles for instance.
- If @code{nil} (the default), @code{message-signature-file} is expected
- to specify the directory if needed.
- @item message-signature-insert-empty-line
- @vindex message-signature-insert-empty-line
- If @code{t} (the default value) an empty line is inserted before the
- signature separator.
- @end table
- Note that RFC1036bis says that a signature should be preceded by the three
- characters @samp{-- } on a line by themselves. This is to make it
- easier for the recipient to automatically recognize and process the
- signature. So don't remove those characters, even though you might feel
- that they ruin your beautiful design, like, totally.
- Also note that no signature should be more than four lines long.
- Including @acronym{ASCII} graphics is an efficient way to get
- everybody to believe that you are silly and have nothing important to
- say.
- @node Various Message Variables
- @section Various Message Variables
- @table @code
- @item message-default-charset
- @vindex message-default-charset
- @cindex charset
- Symbol naming a @acronym{MIME} charset. Non-@acronym{ASCII} characters
- in messages are assumed to be encoded using this charset. The default
- is @code{iso-8859-1} on non-@sc{mule} Emacsen; otherwise @code{nil},
- which means ask the user. (This variable is used only on non-@sc{mule}
- Emacsen.) @xref{Charset Translation, , Charset Translation, emacs-mime,
- Emacs MIME Manual}, for details on the @sc{mule}-to-@acronym{MIME}
- translation process.
- @item message-fill-column
- @vindex message-fill-column
- @cindex auto-fill
- Local value for the column beyond which automatic line-wrapping should
- happen for message buffers. If non-@code{nil} (the default), also turn on
- auto-fill in message buffers.
- @item message-signature-separator
- @vindex message-signature-separator
- Regexp matching the signature separator. It is @samp{^-- *$} by
- default.
- @item mail-header-separator
- @vindex mail-header-separator
- String used to separate the headers from the body. It is @samp{--text
- follows this line--} by default.
- @item message-directory
- @vindex message-directory
- Directory used by many mailish things. The default is @file{~/Mail/}.
- All other mail file variables are derived from @code{message-directory}.
- @item message-auto-save-directory
- @vindex message-auto-save-directory
- Directory where Message auto-saves buffers if Gnus isn't running. If
- @code{nil}, Message won't auto-save. The default is @file{~/Mail/drafts/}.
- @item message-signature-setup-hook
- @vindex message-signature-setup-hook
- Hook run when initializing the message buffer. It is run after the
- headers have been inserted but before the signature has been inserted.
- @item message-setup-hook
- @vindex message-setup-hook
- Hook run as the last thing when the message buffer has been initialized,
- but before yanked text is inserted.
- @item message-header-setup-hook
- @vindex message-header-setup-hook
- Hook called narrowed to the headers after initializing the headers.
- For instance, if you're running Gnus and wish to insert a
- @samp{Mail-Copies-To} header in all your news articles and all messages
- you send to mailing lists, you could do something like the following:
- @lisp
- (defun my-message-header-setup-hook ()
- (let ((group (or gnus-newsgroup-name "")))
- (when (or (message-fetch-field "newsgroups")
- (gnus-group-find-parameter group 'to-address)
- (gnus-group-find-parameter group 'to-list))
- (insert "Mail-Copies-To: never\n"))))
- (add-hook 'message-header-setup-hook
- 'my-message-header-setup-hook)
- @end lisp
- @item message-send-hook
- @vindex message-send-hook
- Hook run before sending messages.
- If you want to add certain headers before sending, you can use the
- @code{message-add-header} function in this hook. For instance:
- @findex message-add-header
- @lisp
- (add-hook 'message-send-hook 'my-message-add-content)
- (defun my-message-add-content ()
- (message-add-header "X-In-No-Sense: Nonsense")
- (message-add-header "X-Whatever: no"))
- @end lisp
- This function won't add the header if the header is already present.
- @item message-send-mail-hook
- @vindex message-send-mail-hook
- Hook run before sending mail messages. This hook is run very late:
- just before the message is actually sent as mail.
- @item message-send-news-hook
- @vindex message-send-news-hook
- Hook run before sending news messages. This hook is run very late:
- just before the message is actually sent as news.
- @item message-sent-hook
- @vindex message-sent-hook
- Hook run after sending messages.
- @item message-cancel-hook
- @vindex message-cancel-hook
- Hook run when canceling news articles.
- @item message-mode-syntax-table
- @vindex message-mode-syntax-table
- Syntax table used in message mode buffers.
- @item message-cite-articles-with-x-no-archive
- @vindex message-cite-articles-with-x-no-archive
- If non-@code{nil}, don't strip quoted text from articles that have
- @samp{X-No-Archive} set. Even if this variable isn't set, you can
- undo the stripping by hitting the @code{undo} keystroke.
- @item message-strip-special-text-properties
- @vindex message-strip-special-text-properties
- Emacs has a number of special text properties which can break message
- composing in various ways. If this option is set, message will strip
- these properties from the message composition buffer. However, some
- packages requires these properties to be present in order to work. If
- you use one of these packages, turn this option off, and hope the
- message composition doesn't break too bad.
- @item message-send-method-alist
- @vindex message-send-method-alist
- @findex message-mail-p
- @findex message-news-p
- @findex message-send-via-mail
- @findex message-send-via-news
- Alist of ways to send outgoing messages. Each element has the form:
- @lisp
- (@var{type} @var{predicate} @var{function})
- @end lisp
- @table @var
- @item type
- A symbol that names the method.
- @item predicate
- A function called without any parameters to determine whether the
- message is a message of type @var{type}. The function will be called in
- the buffer where the message is.
- @item function
- A function to be called if @var{predicate} returns non-@code{nil}.
- @var{function} is called with one parameter---the prefix.
- @end table
- The default is:
- @lisp
- ((news message-news-p message-send-via-news)
- (mail message-mail-p message-send-via-mail))
- @end lisp
- The @code{message-news-p} function returns non-@code{nil} if the message
- looks like news, and the @code{message-send-via-news} function sends the
- message according to the @code{message-send-news-function} variable
- (@pxref{News Variables}). The @code{message-mail-p} function returns
- non-@code{nil} if the message looks like mail, and the
- @code{message-send-via-mail} function sends the message according to the
- @code{message-send-mail-function} variable (@pxref{Mail Variables}).
- All the elements in this alist will be tried in order, so a message
- containing both a valid @samp{Newsgroups} header and a valid @samp{To}
- header, for example, will be sent as news, and then as mail.
- @end table
- @node Sending Variables
- @section Sending Variables
- @table @code
- @item message-fcc-handler-function
- @vindex message-fcc-handler-function
- A function called to save outgoing articles. This function will be
- called with the name of the file to store the article in. The default
- function is @code{message-output} which saves in Unix mailbox format.
- @item message-courtesy-message
- @vindex message-courtesy-message
- When sending combined messages, this string is inserted at the start of
- the mailed copy. If the string contains the format spec @samp{%s}, the
- newsgroups the article has been posted to will be inserted there. If
- this variable is @code{nil}, no such courtesy message will be added.
- The default value is @samp{"The following message is a courtesy copy of
- an article\\nthat has been posted to %s as well.\\n\\n"}.
- @item message-fcc-externalize-attachments
- @vindex message-fcc-externalize-attachments
- If @code{nil}, attach files as normal parts in Fcc copies; if it is
- non-@code{nil}, attach local files as external parts.
- @item message-interactive
- @vindex message-interactive
- If non-@code{nil} wait for and display errors when sending a message;
- if @code{nil} let the mailer mail back a message to report errors.
- @item message-confirm-send
- @vindex message-confirm-send
- When non-@code{nil}, Gnus will ask for confirmation when sending a
- message.
- @end table
- @node Message Buffers
- @section Message Buffers
- Message will generate new buffers with unique buffer names when you
- request a message buffer. When you send the message, the buffer isn't
- normally killed off. Its name is changed and a certain number of old
- message buffers are kept alive.
- @table @code
- @item message-generate-new-buffers
- @vindex message-generate-new-buffers
- Controls whether to create a new message buffer to compose a message.
- Valid values include:
- @table @code
- @item nil
- Generate the buffer name in the Message way (e.g., *mail*, *news*, *mail
- to whom*, *news on group*, etc.)@: and continue editing in the existing
- buffer of that name. If there is no such buffer, it will be newly
- created.
- @item unique
- @item t
- Create the new buffer with the name generated in the Message way.
- @item unsent
- Similar to @code{unique} but the buffer name begins with "*unsent ".
- @item standard
- Similar to @code{nil} but the buffer name is simpler like *mail
- message*.
- @end table
- @table @var
- @item function
- If this is a function, call that function with three parameters: The
- type, the To address and the group name (any of these may be
- @code{nil}). The function should return the new buffer name.
- @end table
- The default value is @code{unsent}.
- @item message-max-buffers
- @vindex message-max-buffers
- This variable says how many old message buffers to keep. If there are
- more message buffers than this, the oldest buffer will be killed. The
- default is 10. If this variable is @code{nil}, no old message buffers
- will ever be killed.
- @item message-send-rename-function
- @vindex message-send-rename-function
- After sending a message, the buffer is renamed from, for instance,
- @samp{*reply to Lars*} to @samp{*sent reply to Lars*}. If you don't
- like this, set this variable to a function that renames the buffer in a
- manner you like. If you don't want to rename the buffer at all, you can
- say:
- @lisp
- (setq message-send-rename-function 'ignore)
- @end lisp
- @item message-kill-buffer-on-exit
- @findex message-kill-buffer-on-exit
- If non-@code{nil}, kill the buffer immediately on exit.
- @end table
- @node Message Actions
- @section Message Actions
- When Message is being used from a news/mail reader, the reader is likely
- to want to perform some task after the message has been sent. Perhaps
- return to the previous window configuration or mark an article as
- replied.
- @vindex message-kill-actions
- @vindex message-postpone-actions
- @vindex message-exit-actions
- @vindex message-send-actions
- The user may exit from the message buffer in various ways. The most
- common is @kbd{C-c C-c}, which sends the message and exits. Other
- possibilities are @kbd{C-c C-s} which just sends the message, @kbd{C-c
- C-d} which postpones the message editing and buries the message buffer,
- and @kbd{C-c C-k} which kills the message buffer. Each of these actions
- have lists associated with them that contains actions to be executed:
- @code{message-send-actions}, @code{message-exit-actions},
- @code{message-postpone-actions}, and @code{message-kill-actions}.
- Message provides a function to interface with these lists:
- @code{message-add-action}. The first parameter is the action to be
- added, and the rest of the arguments are which lists to add this action
- to. Here's an example from Gnus:
- @lisp
- (message-add-action
- `(set-window-configuration ,(current-window-configuration))
- 'exit 'postpone 'kill)
- @end lisp
- This restores the Gnus window configuration when the message buffer is
- killed, postponed or exited.
- An @dfn{action} can be either: a normal function, or a list where the
- @sc{car} is a function and the @sc{cdr} is the list of arguments, or
- a form to be @code{eval}ed.
- @node Appendices
- @chapter Appendices
- @menu
- * Responses:: Standard rules for determining where responses go.
- @end menu
- @node Responses
- @section Responses
- To determine where a message is to go, the following algorithm is used
- by default.
- @table @dfn
- @item reply
- A @dfn{reply} is when you want to respond @emph{just} to the person who
- sent the message via mail. There will only be one recipient. To
- determine who the recipient will be, the following headers are
- consulted, in turn:
- @table @code
- @item Reply-To
- @item From
- @end table
- @item wide reply
- A @dfn{wide reply} is a mail response that includes @emph{all} entities
- mentioned in the message you are responding to. All mailboxes from the
- following headers will be concatenated to form the outgoing
- @code{To}/@code{Cc} headers:
- @table @code
- @item From
- (unless there's a @code{Reply-To}, in which case that is used instead).
- @item Cc
- @item To
- @end table
- If a @code{Mail-Copies-To} header is present, it will also be included
- in the list of mailboxes. If this header is @samp{never}, that means
- that the @code{From} (or @code{Reply-To}) mailbox will be suppressed.
- @item followup
- A @dfn{followup} is a response sent via news. The following headers
- (listed in order of precedence) determine where the response is to be
- sent:
- @table @code
- @item Followup-To
- @item Newsgroups
- @end table
- If a @code{Mail-Copies-To} header is present, it will be used as the
- basis of the new @code{Cc} header, except if this header is
- @samp{never}.
- @end table
- @node GNU Free Documentation License
- @chapter GNU Free Documentation License
- @include doclicense.texi
- @node Index
- @chapter Index
- @printindex cp
- @node Key Index
- @chapter Key Index
- @printindex ky
- @bye
- @c End:
|