<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/assets/atom.xsl" type="text/xsl"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	><title>Sacha Chua - tag - gnus</title>
	<subtitle>Emacs, sketches, and life</subtitle>
	<link rel="self" type="application/atom+xml" href="https://sachachua.com/blog/tag/gnus/feed/atom/index.xml" />
  <link rel="alternate" type="text/html" href="https://sachachua.com/blog/tag/gnus" />
  <id>https://sachachua.com/blog/tag/gnus/feed/atom/index.xml</id>
  <generator uri="https://11ty.dev">11ty</generator>
	<updated>2016-02-04T02:25:00Z</updated>
<entry>
		<title type="html">Publishing Emacs News as plain text, HTML, and attached Org file</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2016/02/publishing-emacs-news-plain-text-html-attached-org-file/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2016-02-05T22:41:47Z</updated>
    <published>2016-02-04T02:25:00Z</published>
    <category term="emacs" />
<category term="org" />
		<id>https://sachachua.com/blog/?p=28599</id>
		<content type="html"><![CDATA[<p>Update 2016-02-05: Since @ThierryStoehr linked to this post about Emacs News-related code, I figured I'd add a link to the <a href="http://pages.sachachua.com/.emacs.d/Sacha.html#emacs-news">other support functions I've been using to help me with Emacs News summarization.</a> There's also this bit:</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">let</span> ((date (org-read-date nil nil <span class="org-string">"-mon"</span>)))
    (concat
     (my/org-list-from-rss <span class="org-string">"http://planet.emacsen.org/atom.xml"</span> date) <span class="org-string">"\n"</span>
     (shell-command-to-string (concat <span class="org-string">"~/bin/list-reddit-links.coffee emacs "</span> date)) <span class="org-string">"\n"</span>
     (shell-command-to-string (concat <span class="org-string">"~/bin/list-reddit-links.coffee org-mode "</span> date)) <span class="org-string">"\n"</span>
     <span class="org-string">"- New packages:\n"</span>
     (my/list-new-packages) 
     <span class="org-string">"\n"</span>))
</pre>
</div>
<p>Handy little things!</p>
<p>&#8212;&#8212;</p>
<p>I've been publishing these weekly summaries of Emacs-related links on my blog and to the <a href="https://lists.gnu.org/mailman/listinfo/emacs-tangents">emacs-tangents mailing list</a> / <a href="http://news.gmane.org/gmane.emacs.tangents">newsgroup</a>. I started by posting plain text from Org Mode's ASCII export, and people asked for Org Mode and HTML formats. So here's some code that prepares things for pasting into a Gnus message buffer.</p>
<p>It turns out that order matters for multipart/alternative &#8211; start with plain text, then include richer alternatives. First time around, I put the HTML version first, so people didn't end up seeing it. Anyway, here's something that shows up properly now: text/plain, then text/html, with text/x-org attached. The heavy lifting is done with <code>org-export-string-as</code>, which exports into different formats.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">  (<span class="org-keyword">defun</span> <span class="org-function-name">my/share-emacs-news</span> ()
    <span class="org-doc">"Prepare current subtree for yanking into post."</span>
    (<span class="org-keyword">interactive</span>)
    <span class="org-comment-delimiter">;; </span><span class="org-comment">Draft Gnus article</span>
    (<span class="org-keyword">save-restriction</span>
      (org-narrow-to-subtree)
      (<span class="org-keyword">let</span> ((org-export-html-preamble nil)
            (org-html-toplevel-hlevel 3)
            output)
        (<span class="org-keyword">setq</span> output
              (apply
               'format
               <span class="org-string">"&lt;#multipart type=alternative&gt;</span>
<span class="org-string">&lt;#part type=\"text/plain\" disposition=inline&gt;</span>
<span class="org-string">%s</span>
<span class="org-string">&lt;#/part&gt;</span>
<span class="org-string">&lt;#part type=\"text/html\" disposition=inline&gt;</span>
<span class="org-string">%s</span>
<span class="org-string">&lt;#/part&gt;</span>
<span class="org-string">&lt;#/multipart&gt;</span>
<span class="org-string">&lt;#part type=\"text/x-org\" disposition=attachment name=\"emacs-news.org\"&gt;</span>
<span class="org-string">%s</span>
<span class="org-string">&lt;#/part&gt;</span>
<span class="org-string">"</span>
               (mapcar
                (<span class="org-keyword">lambda</span> (format)
                  (org-export-string-as (buffer-substring (point-min) (point-max)) format t))
                '(ascii html org))))
        (kill-new output))))
</pre>
</div>
<p><a href="http://howardism.org">Howard Abrams</a> showed me something like this in <a href="https://sachachua.com/blog/2015/06/emacs-hangout-june-2015/">June 2015's Emacs Hangout</a> (<a href="https://www.youtube.com/watch?v=jzFI8knL5BY&amp;t=1h18m26s">~1:18:26</a>) using <a href="http://orgmode.org/worg/org-contrib/org-mime.html">org-mime-org-buffer-htmlize</a>, which probably does the job in a much cooler way. =) I thought he had a blog post about it, but I can't seem to find it. Anyway, there's my little hack above!</p>
<p>You can <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2016%2F02%2Fpublishing-emacs-news-plain-text-html-attached-org-file%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Mail with Gnus on Windows</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2015/11/mail-with-gnus/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2015-11-27T07:43:42Z</updated>
    <published>2015-11-20T17:36:00Z</published>
    <category term="emacs" />
		<id>https://sachachua.com/blog/?p=28485</id>
		<content type="html"><![CDATA[<p>Update 2015-11-26: fixed link to my config. Thanks, Thomas!</p>
<p>I use Gmail for my mail because it:</p>
<ul class="org-ul">
<li>synchronizes with my phone, which is handy for notifications and quick replies</li>
<li>filters most of the spam for me</li>
<li>works with a few interesting extensions such as Boomerang for Gmail</li>
</ul>
<p>However, I like the way the Gnus mail/news client in Emacs gives me a much more keyboard-friendly way to manage lots of mail, and I can even write code to partially automate some of my common operations.</p>
<p>I used to have my config in in <code>~/.gnus</code>, but people might find it handy, so I&#8217;ve added it to my public <a href="https://sachachua.com/dotemacs">Emacs configuration</a>.</p>
<p>I like using <a href="http://gmane.org/">Gmane</a> to read mailing lists, and I use IMAP to read my Gmail.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq gnus-select-method '(nnnil <span class="org-string">""</span>))
(setq gnus-secondary-select-methods
      '((nntp <span class="org-string">"news.gmane.org"</span>)
        (nnimap <span class="org-string">"imap.gmail.com"</span>
                (nnimap-address <span class="org-string">"imap.gmail.com"</span>)
                (nnimap-server-port 993)
                (nnimap-stream ssl)
                (nnimap-authenticator login))))
</pre>
</div>
<p>I have two-factor authentication enabled for Gmail, so I set up an app-specific password for Gnus. I have an <code>~/.authinfo</code> file set up with something like:</p>
<pre class="example">machine imap.gmail.com login sacha@sachachua.com password mysecretapppassword
machine imap.gmail.com login sacha@sachachua.com password mysecretapppassword port 993
machine smtp.gmail.com login sacha@sachachua.com password mysecretapppassword port 587
</pre>
<p>(I should probably get around to using GPG to automatically encrypt and decrypt this file.)</p>
<p>Sending e-mail on Windows was a bit of a pain. Fortunately, I eventually found something that works. I&#8217;ve configured <a href="http://emailrelay.sourceforge.net/">emailrelay</a> to accept the mail and forward it to Gmail. The server starts with this batch file:</p>
<pre class="example">start "emailrelay" "C:\Program Files (x86)\emailrelay\emailrelay.exe" &#45;&#45;as-proxy smtp.gmail.com:25 &#45;&#45;client-auth "C:/sacha/.emailrelay" &#45;&#45;client-tls &#45;&#45;log &#45;&#45;pid-file "C:\Program Files (x86)\emailrelay\emailrelay.pid" &#45;&#45;spool-dir C:\sacha\tmp\emailrelay
</pre>
<p>Sending queued mail works with this batch file:</p>
<pre class="example">"c:\Program Files (x86)\emailrelay\emailrelay.exe" &#45;&#45;as-client smtp.gmail.com:587 &#45;&#45;client-auth c:\sacha\.emailrelay &#45;&#45;client-tls &#45;&#45;spool-dir c:\sacha\tmp\emailrelay
</pre>
<p>I should probably get around to using <code>&#45;&#45;as-proxy</code> properly, since it still seems to hold mail until I explicitly send it.</p>
<p>Some more config. Not sure how much of this is needed.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq message-send-mail-function 'smtpmail-send-it
      smtpmail-starttls-credentials '((<span class="org-string">"localhost"</span> 25 <span class="org-string">"sacha@local.sachachua.com"</span> nil))
      smtpmail-auth-credentials '((<span class="org-string">"localhost"</span> 25 <span class="org-string">"sacha@local.sachachua.com"</span> nil))
      smtpmail-default-smtp-server <span class="org-string">"localhost"</span>
      smtpmail-smtp-server <span class="org-string">"localhost"</span>
      smtpmail-smtp-service 25
      smtpmail-local-domain <span class="org-string">"local.sachachua.com"</span>)
(setq send-mail-function 'smtpmail-send-it)
(setq smtpmail-smtp-server <span class="org-string">"127.0.0.1"</span>)
(setq smtpmail-smtp-service 25)
(setq user-mail-address <span class="org-string">"sacha@sachachua.com"</span>)
</pre>
</div>
<p>Hide HTML mail. I need to fiddle with this some more, since Gnus still tries to display them. Sometimes my Gnus crashes when it tries to display HTML mail.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq mm-discouraged-alternatives
      '(<span class="org-string">"text/html"</span> <span class="org-string">"text/richtext"</span>)
      mm-automatic-display
      (-difference mm-automatic-display '(<span class="org-string">"text/html"</span> <span class="org-string">"text/enriched"</span> <span class="org-string">"text/richtext"</span>)))
</pre>
</div>
<p>Hide quoted text.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq gnus-treat-hide-citation t)
</pre>
</div>
<p>Get smarter about filtering depending on what I reed or mark. I use <code>!</code> (tick) for marking threads as something that interests me.</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq gnus-use-adaptive-scoring t)
(setq gnus-default-adaptive-score-alist
     '((gnus-unread-mark)
       (gnus-ticked-mark (subject 10))
       (gnus-killed-mark (subject -5))
       (gnus-catchup-mark (subject -1))))
</pre>
</div>
<p>You can <a href="https://sachachua.com/blog/2015/11/mail-with-gnus/#comment">view 10 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2015%2F11%2Fmail-with-gnus%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Cobbling together a semi-auto-responder using Emacs, Gnus, and org-contacts</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2014/05/cobbling-together-semi-auto-responder-using-emacs-gnus-org-contacts/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2014-05-22T00:42:43Z</updated>
    <published>2014-05-21T20:42:43Z</published>
    <category term="emacs" />
<category term="org" />
		<id>https://sachachua.com/blog/?p=27250</id>
		<content type="html"><![CDATA[<p>
It turns out that lots of people are interested in an <a href="https://sachachua.com/blog/2014/05/planning-e-mail-based-course-emacs-lisp/">e-mail-based course for learning Emacs Lisp</a>. Yay! =) Maybe it's the idea of bite-size chunks. Maybe it's the ease of asking questions. Maybe it's the regular reminders to work on something. Who knows? Whatever the reason, it's awesome to see so many people willing to join me on this experiment.
</p>
<p>
Since this is my first time to venture into the world of teaching people online, I wanted to see how far I could push actually doing all the mails myself, instead of just signing up for an Aweber account and handing everyone off to an impersonal autoresponder. I dusted off Gnus, offlineimap, and org-contacts, and started figuring out my workflow. I'll share how that workflow's evolving so that you can get a sense of how someone might write little bits of Emacs Lisp to make something repetitive easier.
</p>
<p>
For the first little while, I got by with using <code>C-x r s</code> (<code>copy-to-register</code>) and <code>C-x r i</code> (<code>insert-register</code>) to store the text that I needed.<br>
Sometimes I needed to paste in the welcome message and checklist, and sometimes I needed to paste in the first lesson. By using registers, I could insert whatever I wanted instead of going through the kill ring. I also had another bit of templated code in yet another register so that I could easily create an org-contacts entry for the person whose mail I was replying to. In the beginning, I used tasks under each person's heading to indicate that I had sent them the checklist or that I had sent them the first lesson. Eventually, I changed my org-contacts notes so that the TODO state of each person showed which lesson I was going to send them next, or CHECKLIST if I was waiting for their reply to the checklist. I also set up Org so that it would automatically log when the TODO state was changed.
</p>
<div class="org-src-container">
<pre class="src src-org"><span class="org-org-meta-line">#+TODO: TODO | DONE</span>
<span class="org-org-meta-line">#+TODO: CHECKLIST(c!) BEGINNER1(1!) BEGINNER2(2!) BEGINNER3(3!) BEGINNER4(4!) FULL(f!) | FINISHED(x!)</span>
<span class="org-org-meta-line">#+TODO: | CANCELLED</span>

<span class="org-org-level-1">* Who</span>
<span class="org-org-level-2">** CHECKLIST Jane Smith ...</span>
<span class="org-org-level-2">** BEGINNER1 John Smith</span>
   <span class="org-org-special-keyword">SCHEDULED:</span> <span class="org-org-date">&lt;2014-05-28 Wed&gt;</span>
<span class="org-org-special-keyword">   :PROPERTIES:</span>
   <span class="org-org-special-keyword">:EMAIL:</span> <span class="org-org-property-value">john@example.com</span>
<span class="org-org-special-keyword">   :END:</span>
(notes from the messages, etc.)
</pre>
</div>
<p>
I wrote some code to make it easier to send someone a checklist and create a note for them in my org-contacts file. I bound it to <code>C-c e c</code> for convenience.<br>
(The <code>bind-key</code> function is defined by a package.)
</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq sacha/elisp-course-checklist-body <span class="org-string">"... really long text here..."</span>)
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha/elisp-course-checklist</span> ()
  <span class="org-doc">"Copy this message and put it at the end as a checklist item. </span>
<span class="org-doc">Start a message with the checklist."</span>
  (interactive)
  (gnus-summary-scroll-up 1)
  (<span class="org-keyword">with-current-buffer</span> gnus-article-buffer
    (<span class="org-keyword">let</span> ((message (buffer-substring-no-properties (point-min) (point-max)))
          (email (cadr (org-contacts-gnus-get-name-email))))
      (<span class="org-keyword">with-current-buffer</span> <span class="org-string">"elisp-course.org"</span>
        (<span class="org-keyword">save-excursion</span>
          (goto-char (point-max))
          (<span class="org-keyword">save-excursion</span>
            (insert <span class="org-string">"\n** "</span> message)
            (org-set-property <span class="org-string">"EMAIL"</span> email)
            (org-todo <span class="org-string">"CHECKLIST"</span>))))))
  (gnus-summary-followup-with-original nil)
  (goto-char (point-max))
  (insert sacha/elisp-course-checklist-body))
(bind-key <span class="org-string">"C-c e c"</span> 'sacha/elisp-course-checklist)
</pre>
</div>
<p>
This made it easier for me to read the starred messages from my inbox and use <code>C-c e c</code> to get a head start on processing people's introductory messages.<br>
Yay! I used the register trick to help me reply to people who were ready for the first lesson. After the first few replies, I noticed that the attachment code was fine even if I put that in the register too, so I added it as well.
</p>
<p>
Things got more complicated when I started processing lesson 2. I didn't want to have to set up and remember lots of different registers, and I didn't want to manually update the TODO states either. So I started defining functions that I could call with keyboard shortcuts:
</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(<span class="org-keyword">defun</span> <span class="org-function-name">sacha/elisp-course-1</span> ()
  (interactive)
  (<span class="org-keyword">let</span> ((marker (org-contacts-gnus-article-from-get-marker)))
    (<span class="org-keyword">if</span> marker
        (org-with-point-at marker
          (org-todo <span class="org-string">"BEGINNER2"</span>))))
  <span class="org-comment-delimiter">;; </span><span class="org-comment">Find the person's contact record</span>
  (gnus-summary-scroll-up 1)
  (gnus-summary-followup-with-original nil)
  (message-goto-subject)
  (message-delete-line)
  (insert (concat <span class="org-string">"Subject: "</span> sacha/elisp-course-1-subject <span class="org-string">"\n"</span>))
  (goto-char (point-max))
  (insert sacha/elisp-course-1-body))
(bind-key <span class="org-string">"C-c e 1"</span> 'sacha/elisp-course-1)
(<span class="org-keyword">defun</span> <span class="org-function-name">sacha/elisp-course-2</span> ()
  (interactive)
  (<span class="org-keyword">let</span> ((marker (org-contacts-gnus-article-from-get-marker)))
    (<span class="org-keyword">if</span> marker
        (org-with-point-at marker
          (org-todo <span class="org-string">"BEGINNER3"</span>))))
  <span class="org-comment-delimiter">;; </span><span class="org-comment">Find the person's contact record</span>
  (gnus-summary-scroll-up)
  (gnus-summary-followup-with-original nil)
  (goto-char (point-max))
  (insert sacha/elisp-course-2-body))
(bind-key <span class="org-string">"C-c e 2"</span> 'sacha/elisp-course-2)
</pre>
</div>
<p>
Really, though, it doesn't make sense to have a lot of duplicated code. So I wrote some code that would use the person's TODO keyword to look up the message to send them, and then move them to the next keyword. Now I don't need <code>sacha/elisp-course-1</code> or <code>sacha/elisp-course-2</code> any more.
</p>
<div class="org-src-container">
<pre class="src src-emacs-lisp">(setq sacha/elisp-course-info
      `((<span class="org-string">"CHECKLIST"</span> nil ,sacha/elisp-course-checklist-body)
        (<span class="org-string">"BEGINNER1"</span> ,sacha/elisp-course-1-subject ,sacha/elisp-course-1-body)
        (<span class="org-string">"BEGINNER2"</span> ,sacha/elisp-course-2-subject ,sacha/elisp-course-2-body)))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha/elisp-course-process</span> (subject body <span class="org-type">&amp;optional</span> state)
  <span class="org-doc">"Process this course entry."</span>
  (<span class="org-keyword">if</span> (derived-mode-p 'org-mode)
      (<span class="org-keyword">progn</span>
        <span class="org-comment-delimiter">;; </span><span class="org-comment">Move this node to the next state and compose a message</span>
        (<span class="org-keyword">if</span> state (org-todo state))
        (org-todo 'right)
        (message-mail (org-entry-get (point) <span class="org-string">"EMAIL"</span>) subject)
        (goto-char (point-max))
        (insert body))
    <span class="org-comment-delimiter">;; </span><span class="org-comment">Doing this from Gnus; find the person's info</span>
    (<span class="org-keyword">let</span> ((marker (org-contacts-gnus-article-from-get-marker)))
      (<span class="org-keyword">if</span> marker (org-with-point-at marker
                   (<span class="org-keyword">if</span> state (org-todo state))
                   (org-todo 'right)))
      <span class="org-comment-delimiter">;; </span><span class="org-comment">Compose a reply</span>
      (gnus-summary-scroll-up 1)
      (gnus-summary-followup-with-original nil)
      (message-goto-subject)
      (message-delete-line)
      (insert (concat <span class="org-string">"Subject: "</span> subject <span class="org-string">"\n"</span>))
      (goto-char (point-max))
      (insert body))))

(<span class="org-keyword">defun</span> <span class="org-function-name">sacha/elisp-course-guess-and-process</span> (<span class="org-type">&amp;optional</span> state)
  (interactive (list (<span class="org-keyword">if</span> current-prefix-arg (read-string <span class="org-string">"State: "</span>))))
  (<span class="org-keyword">let</span> ((current-state
         (or state (elt
                    (<span class="org-keyword">if</span> (derived-mode-p 'org-mode)
                        (org-heading-components) 
                      (<span class="org-keyword">let</span> ((marker (org-contacts-gnus-article-from-get-marker)))
                        (<span class="org-keyword">if</span> marker (org-with-point-at marker (org-heading-components)))))
                    2))))
    (sacha/elisp-course-process
     (elt (assoc current-state sacha/elisp-course-info) 1)
     (elt (assoc current-state sacha/elisp-course-info) 2)
     state)))
(bind-key <span class="org-string">"C-c e e"</span> 'sacha/elisp-course-guess-and-process)
</pre>
</div>
<p>
Come to think of it, I should totally have it schedule the next update for the next Wednesday, too. ;) That's just <code>(org-schedule "+wed")</code>. Neat, huh?<br>
And I'm sure there are all sorts of ways the code can be simpler, but it works for me at the moment, so hooray!
</p>
<p>
I really like this approach. It lets me pull in standard information while also letting me customize the messages and how it fits into my task tracking. I can't get that with Gmail (even with canned responses), and I'm not sure any CRM is going to be quite as awesome as this. I can't wait to see how else we'll tweak this as we go through more conversations. I'd like to get better at:
</p>
<ul class="org-ul">
<li>having a consistent place where I can process all the messages and make sure nothing falls through the cracks; I currently star messages to make sure I process them, since the Gmail label folder in IMAP seems to be missing some messages
</li>
<li>seeing all Gnus conversations related to an org-contacts entry
</li>
<li>reaching out to people proactively with the next lesson, even if they haven't e-mailed me (or maybe I should wait for them?)
</li>
</ul>
<p>
Anyway, that's an example of writing a little bit of Emacs Lisp in order to connect different packages. Gnus handles mail, Org handles notes, org-contacts links the two together, and with a little bit of custom code, I can make the combination fit what I want to do. I read the source code of org-contacts to find out how I could look up the appropriate note, and I looked at <code>org-shiftright</code> to find out how to move things to the next TODO state. If you know something that works roughly like what you want it to work, you can find out how it does things and then copy that.
</p>
<p>
As for the course itself: I've been sending people links to the HTML output, attached .txt files (with <code>-*- mode: org -*-</code>) so they can open it in Emacs if they want, and inline text so that they can skim it briefly in their e-mail client if they want to. I'm not perfectly happy with the plain-text formats, but it seems to be a reasonable compromise, and so far people have been able to deal with it. I've been improving pieces of it based on feedback on clarity, suggestions for good examples, and so on. I didn't take all the feedback; after thinking about some of the suggestions, I still preferred it my way. It's shaping up quite nicely, though!
</p>
<p>
If you're curious about the beginner's course on reading Emacs Lisp, e-mail me at <a href="mailto:sacha@sachachua.com">sacha@sachachua.com</a> and we'll see how this works out. I'm certainly learning a lot. =)</p>
<p>You can <a href="https://sachachua.com/blog/2014/05/cobbling-together-semi-auto-responder-using-emacs-gnus-org-contacts/#comment">view 3 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2014%2F05%2Fcobbling-together-semi-auto-responder-using-emacs-gnus-org-contacts%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Emacs Gnus: Organize Your Mail</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2008/05/emacs-gnus-organize-your-mail/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2008-06-01T00:47:17Z</updated>
    <published>2008-05-31T20:47:17Z</published>
    <category term="emacs" />
<category term="wickedcoolemacs" />
		<id>https://sachachua.com/blog/?p=4905</id>
		<content type="html"><![CDATA[<p>
People handle large volumes of mail in different ways. Keeping<br>
everything in one mailbox can quickly become unmanageable because<br>
messages you need to read get lost among messages you don&#8217;t need to<br>
read.
</p>
<p>
You can move mail manually by selecting them in the summary buffer and<br>
typing B m (gnus-summary-move-article). Then type the name of the<br>
group to which you would like to move the message. The group will be<br>
created if it doesn&#8217;t exist.
</p>
<p>
To move multiple messages, mark them with #<br>
(gnus-summary-mark-as-processable) and then type B m<br>
(gnus-summary-move-article). To unmark a message, type M-#<br>
(gnus-summary-unmark-as-processable). To unmark all messages, type M P<br>
U (gnus-summary-unmark-all-processable).
</p>
<h3>Automatically filing mail</h3>
<p>
Moving messages by hand is tedious and time-consuming. One way to deal<br>
with this is to set up rules that automatically file mail into<br>
different groups (or folders, as they&#8217;re called in other mail<br>
clients). Gnus calls this &#8220;splitting&#8221; mail, and you can split mail on<br>
IMAP servers as well as mail downloaded from POP3 servers to your<br>
computer.
</p>
<p>
For example, if you&#8217;re using Gnus to read mail from an IMAP server,<br>
you can split your messages by adding this to your ~/.gnus:
</p>
<p></p><pre>
 (setq nnimap-split-inbox "INBOX") ;; (1)
 (setq nnimap-split-predicate "UNDELETED") ;; (2)
 (setq nnimap-split-rule
       '(
         ("INBOX.emacs" "^Subject:.*emacs")
         ("INBOX.work" "^To:.*you@work.example.com")    
         ("INBOX.personal" "^To:.*you@personal.example.com")    
         ("INBOX.errors" "^From:.*\\(mailer.daemon\\|postmaster\\)")   
        )) 
</pre>
<p></p>
<p>
If you use a different inbox, change the value of<br>
nnimap-split-inbox(1). Any messages in the inbox will be split<br>
according to nnimap-split-rule(2), which is a list where each element<br>
is a list containing the group&#8217;s name and a regular expression<br>
matching the header of messages that should be filed in the group.  In<br>
this example, Gnus will move mail with subjects containing the word<br>
&#8220;emacs&#8221; to INBOX.emacs, mail directed to you@work.example.com to the<br>
INBOX.work group, mail directed to you@personal.example.com to the<br>
INBOX.personal group, and mail error messages to INBOX.errors. All<br>
other messages will be stored in INBOX.
</p>
<p>
If you&#8217;re downloading your mail from a POP3 server and storing it in<br>
nnml, add this to your ~/.gnus instead:
</p>
<p></p><pre>
 (setq nnmail-split-methods
      '(
        ("mail.emacs" "^Subject:.*emacs")
        ("mail.work" "^To:.*you@work.example.com")    
        ("mail.personal" "^To:.*you@personal.example.com")    
        ("mail.errors" "^From:.*\\(mailer.daemon\\|postmaster\\)")   
       )) 
</pre>
<p></p>
<p>
All other messages will be stored in mail.misc.
</p>
<p>
Start M-x gnus again, and your mail will be split into the different<br>
groups.
</p>
<h3>Where are my groups?</h3>
<p>
If you don&#8217;t see your new groups in the group buffer displayed by M-x<br>
gnus, type A A (gnus-group-list-active) to see all the groups. Go to<br>
the group that you would like to add to the group buffer, then type u<br>
(gnus-group-unsubscribe-current-group) to toggle its subscription. In<br>
this example, INBOX.automated is not subscribed to, but INBOX is.
</p>
<p></p><pre>
 U    13: INBOX.automated 
      76: INBOX 
</pre>
<p></p>
<p>
When you type M-x gnus again, you&#8217;ll see your subscribed groups if<br>
they have unread messages.
</p>
<p>
nnimap-split-rule and nnmail-split-methods allow you to filter<br>
interesting or uninteresting mail into different groups based on their<br>
headers. Gnus comes with an even more powerful mail splitting engine.<br>
In fact, Gnus comes with &#8220;fancy mail splitting.&#8221;
</p>
<h3>Fancy mail splitting</h3>
<p>
With fancy mail splitting and some configuration, you can split mail<br>
based on a combination of criteria. You can even manually file a<br>
message and have Gnus automatically file incoming replies in the same<br>
group.
</p>
<p>
To configure an IMAP connection to use fancy mail splitting, add the<br>
following to your ~/.gnus:
</p>
<p></p><pre>
 (setq nnimap-split-inbox "INBOX")
 (setq nnimap-split-predicate "UNDELETED")
 (setq nnmail-split-fancy ;; (1)
       '(|                                ;; (2)
         (: gnus-registry-split-fancy-with-parent) ;; (3)
         ;; splitting rules go here       ;; (4)
         "INBOX"                          ;; (5)
        ))
 (setq nnimap-split-rule 'nnmail-split-fancy)
 (setq nnmail-split-methods 'nnimap-split-fancy) ;; (6)
 (gnus-registry-initialize) ;; (7)
</pre>
<p></p>
<p>
This configures IMAP to use the nnmail-split-fancy function to<br>
determine the group for messages. Note that we&#8217;re setting the<br>
nnmail-split-fancy variable here. If you want to process your IMAP<br>
mail separately from your other mail, you can set the<br>
nnimap-split-fancy variable instead. If so, also set nnimap-split-rule<br>
to &#8216;nnimap-split-fancy. Using nnmail-split-fancy here makes the other<br>
examples easier to understand, though.
</p>
<p>
The nnmail-split-fancy variable controls the splitting behavior(1). The<br>
&#8220;|&#8221; symbol means that that the first matching rule is used(2). For<br>
example, if the message being processed is a reply to a message that<br>
Gnus knows about, then the gnus-registry-split-fancy-with-parent<br>
function will return the name of the group, and nnmail-split-fancy<br>
will file the message there(3).  You can add other splitting rules as<br>
well(4). If messages don&#8217;t match any of these rules, the last rule<br>
specifies that the messages will be filed in INBOX(5). Set<br>
nnmail-split-methods to nnimap-split-fancy as well in order to work<br>
around some assumptions in other parts of the code(6). After that,<br>
initialize the Gnus registry(7), which is responsible for tracking<br>
moved and deleted messages. This allows you to automatically split<br>
replies into the same folders as the original messages.
</p>
<p>
To configure fancy mail splitting with an nnml backend (suggested<br>
configuration for POP3), add the following to your ~/.gnus instead:
</p>
<p></p><pre>
 (gnus-registry-initialize)
 (setq nnmail-split-fancy                 
       '(|                                
         (: gnus-registry-split-fancy-with-parent)
         ;; splitting rules go here       
         "mail.misc"                          ;; (1)
        ))
 (setq nnmail-split-methods 'nnmail-split-fancy)    
</pre>
<p></p>
<p>
This code is similar to the IMAP example, except that the default<br>
mailbox name for nnml is mail.misc(1).
</p>
<p>
Here&#8217;s how the previous rules in nnmail-split-methods would be<br>
translated to nnmail-split-fancy rules for an IMAP configuration:
</p>
<p></p><pre>
 (setq nnmail-split-fancy
      '(|
        (: gnus-registry-split-fancy-with-parent)
         ;; splitting rules go here       
        (from mail "INBOX.errors")   ;; (1)
        (any "you@work.example.com" "INBOX.work")   ;; (2)
        (any "you@personal.example.com" "INBOX.personal") ;; 
        ("subject" "emacs" "INBOX.emacs") ;; (3)
        "INBOX"    ;; or "mail.misc" for nnml/POP3
       )) 
</pre>
<p></p>
<p>
The <code>from</code> keyword matches against the &#8220;From&#8221;, &#8220;Sender&#8221;, and<br>
&#8220;Resent-From&#8221; fields, while the mail keyword matches common mail<br>
system addresses(1). The corresponding <code>to</code> keyword matches against<br>
the &#8220;To&#8221;, &#8220;Cc&#8221;, &#8220;Apparently-To&#8221;, &#8220;Resent-To&#8221; and &#8220;Resent-Cc&#8221; headers,<br>
while <code>any</code> matches the fields checked by the <code>from</code> and <code>to</code><br>
keywords(2). You can also compare against the subject<br>
and other headers(3).
</p>
<p>
You can use logic in splitting rules, too. For example, if you like<br>
reading the jokes on joke-mailing-list@example.com, but you don&#8217;t like<br>
the ones sent by vi-guy@example.com (he not only has a bad sense of<br>
humor, but also likes picking on Emacs!), you can use a rule like<br>
this in your nnmail-split-fancy:
</p>
<p></p><pre>
         ;; ... other splitting rules go here...
         (any "joke-mailing-list@example.com"   ;; (1)
              (| (from "vi-guy@example.com" "INBOX.junk") ;; (2)
                 "INBOX.jokes")) ;; (3)
         ;; ... other splitting rules go here
</pre>
<p></p>
<p>
The first rule matches all messages with<br>
&#8220;joke-mailing-list@example.com&#8221; in from- or to-related headers.<br>
Matching messages are processed with another split rule, which moves<br>
messages from vi-guy@example.com to a separate group(2) and files the<br>
other messages in INBOX.jokes(3). To learn more about creating complex<br>
rules, read the Gnus Info manual for &#8220;Fancy Mail Splitting&#8221;.</p>
<p>You can <a href="https://sachachua.com/blog/2008/05/emacs-gnus-organize-your-mail/#comment">view 1 comment</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2008%2F05%2Femacs-gnus-organize-your-mail%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Emacs Gnus: Searching Mail</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2008/05/emacs-gnus-searching-mail/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2013-08-27T22:57:27Z</updated>
    <published>2008-05-31T12:49:37Z</published>
    <category term="emacs" />
<category term="wickedcoolemacs" />
		<id>https://sachachua.com/blog/?p=4902</id>
		<content type="html"><![CDATA[<p>
There are several ways to find messages in Emacs. From the summary<br>
buffer, you can use / o (gnus-summary-insert-old-articles) to display<br>
all or some old messages. You can then scan through the headers in the<br>
summary buffer by using C-s (isearch-forward), or you can limit the<br>
displayed messages with these commands:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<col align="left">
<col align="left">
<col align="left">
<tbody>
<tr>
<td>Messages from a given author</td>
<td width="50">/&nbsp;a</td>
<td>gnus-summary-limit-to-author</td>
</tr>
<tr>
<td>Messages whose subjects matching a given regular expression</td>
<td>/ /</td>
<td>gnus-summary-limit-to-subject</td>
</tr>
<tr>
<td>Messages that match a given extra header</td>
<td>/ x</td>
<td>gnus-summary-limit-to-extra-headers</td>
</tr>
<tr>
<td>Messages at least N days old</td>
<td>/ t</td>
<td>gnus-summary-limit-to-age</td>
</tr>
</tbody>
</table>
<p>
Limits work on the messages that are currently displayed, so you can<br>
apply multiple limits. If you make a mistake, use / w<br>
(gnus-summary-pop-limit) to remove the previous limit. You can repeat<br>
/ w (gnus-summary-pop-limit) until satisfied. To remove all the<br>
limits, type C-u / w (gnus-summary-popl-limit).
</p>
<p>
If you specify a prefix, the limit&#8217;s meaning is reversed.  For<br>
example, C-u / a (gnus-summary-limit-to-author) will remove the<br>
messages from the matching author or authors.
</p>
<p>
You can use Gnus to search the currently-displayed messages by using<br>
M-s (gnus-summary-search-article-forward) and M-r<br>
(gnus-summary-search-article-backward).
</p>
<p>
If you want to search a lot of mail, you&#8217;ll find NNIR handy. NNIR is a<br>
front-end to mail search engines which can index your mail and return<br>
search results quickly. If you want to use NNIR with a local or remote<br>
IMAP server, you will need to use nnir.el and imap.el. If you download<br>
your mail using fetchmail or connect to a POP3 server and use an nnml<br>
backend, you can use NNIR with a search engine such as swish-e to<br>
search your ~/Mail directory efficiently.
</p>
<div class="outline-5">
<h5 id="sec-17">1.6.7.1 Setting up IMAP and NNIR</h5>
<p>
If you use IMAP, then your mail is stored on the mail server and<br>
you&#8217;ll need to use the IMAP search interface to search through<br>
it. Download nnir.el from<br>
<a href="http://www.emacswiki.org/cgi-bin/wiki/download/nnir.el">http://www.emacswiki.org/cgi-bin/wiki/download/nnir.el</a> and save it to<br>
your ~/elisp directory. You will also need an imap.el that is newer<br>
than the one that comes with Emacs 22. Download imap.el from<br>
<a href="http://www.emacswiki.org/cgi-bin/wiki/download/imap.el">http://www.emacswiki.org/cgi-bin/wiki/download/imap.el</a> and save it to<br>
your ~/elisp directory as well. Because Gnus comes with an older<br>
version of imap.el, you will need to make sure that the new version of<br>
imap.el is loaded. Add the following to your ~/.gnus:
</p>
<pre>
(add-to-list 'load-path "~/elisp")
(load-file "~/elisp/imap.el")
(require 'nnir)
</pre>
<p>
Restart your Emacs. You can check if the correct version of imap.el<br>
has been loaded by typing M-x locate-library and specifying<br>
imap.el. If Emacs reports &#8220;~/elisp/imap.el&#8221;, then Gnus is configured<br>
to use the updated imap.el.
</p>
</div>
<div class="outline-5">
<h5 id="sec-18">1.6.7.2 Setting up POP3 and NNIR</h5>
<p>
If you use the configuration for POP3 that is suggested in this<br>
chapter, then your mail is stored in the nnml backend, which uses one<br>
file per message. To search this using NNIR, to install nnir.el and an<br>
external search mail engine. The Namazu search engine runs on Linux,<br>
UNIX, and Microsoft Windows, so that&#8217;s what we&#8217;ll talk about here. To<br>
find and configure other mail search engines supported by NNIR, check<br>
out the comments in nnir.el.
</p>
<p>
First, you&#8217;ll need to download and install Namazu. If Namazu is<br>
available as a package for your distribution, install it that way, as<br>
it depends on a number of other programs. An installer for Microsoft<br>
Windows can be found at <a href="http://www.namazu.org/windows/">http://www.namazu.org/windows/</a> . If you need<br>
to build Namazu from source, you can get the source code and instructions<br>
from <a href="http://www.namazu.org">http://www.namazu.org</a> .
</p>
<p>
After you&#8217;ve installed Namazu, create a directory for Namazu&#8217;s index<br>
files, such as ~/.namazu-mail. Then index your mail by typing this at<br>
the command-line:
</p>
<pre>
mknmz &#45;&#45;mailnews -O ~/.namazu-mail ~/Mail
</pre>
<p>
and add the following to your ~/.gnus:
</p>
<pre>
(add-to-list 'load-path "~/elisp")
(require 'nnir)
(setq nnir-search-engine 'namazu)
(setq nnir-namazu-index-directory (expand-file-name "~/.namazu-mail"))
(setq nnir-namazu-remove-prefix (expand-file-name "~/Mail"))
(setq nnir-mail-backend gnus-select-method)
</pre>
</div>
<div class="outline-5">
<h5 id="sec-19">1.6.7.3 Searching your mail with NNIR</h5>
<p>
From the group buffer displayed by M-x gnus, you can type G G<br>
(gnus-group-make-nnir-group) to search your mail for a keyword.</p>
<p>
If you&#8217;re using the Namazu search engine, then you can use more<br>
sophisticated search queries such as:
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<col align="left">
<col align="left">
<tbody>
<tr>
<td>Linux Emacs</td>
<td>messages that contain both &#8220;Linux&#8221; and &#8220;Emacs&#8221;</td>
</tr>
<tr>
<td>Linux or Emacs</td>
<td>messages that contain either &#8220;Linux&#8221; or &#8220;Emacs&#8221;</td>
</tr>
<tr>
<td>Emacs not Linux</td>
<td>messages that contain &#8220;Emacs&#8221; but not &#8220;Linux&#8221;</td>
</tr>
<tr>
<td>Emacs and (Linux or Windows)</td>
<td>messages that contain &#8220;Emacs&#8221; and either &#8220;Linux&#8221; or &#8220;Windows&#8221;</td>
</tr>
<tr>
<td>&#8220;apple pie&#8221;</td>
<td>messages that contain the phrase &#8220;apple pie&#8221;</td>
</tr>
<tr>
<td>{apple pie}</td>
<td>messages that contain the phrase &#8220;apple pie&#8221;</td>
</tr>
<tr>
<td>+from:example@example.com</td>
<td>messages with example@example.com in the From: header</td>
</tr>
<tr>
<td>+subject:&#8221;apple pie&#8221;</td>
<td>messages with the phrase &#8220;apple pie&#8221; in the Subject: header</td>
</tr>
<tr>
<td>+subject:apple +subject:pie</td>
<td>messages whose Subject: headers contain both &#8220;apple&#8221; and &#8220;pie&#8221;</td>
</tr>
</tbody>
</table>
<p> If<br>
matching messages are found, then you will see a temporary group with<br>
the results. Although you can&#8217;t delete messages from this view,<br>
reading and replying to these messages is the same as reading and<br>
replying to regular messages.
</p>
<p>
To see a message in its original context, type G T<br>
(gnus-summary-nnir-goto-thread) from the summary buffer. This opens<br>
the message&#8217;s original group. If Gnus asks you how many articles to<br>
load, press RET to accept the default of all the articles.
</p>
</div>
<hr size="1">
This is a draft for the <a href="https://sachachua.com/blog/category/wickedcoolemacs">Wicked Cool Emacs</a> book I&#8217;m working on. =) Hope it helps!<p></p>
<p>You can <a href="https://sachachua.com/blog/2008/05/emacs-gnus-searching-mail/#comment">view 1 comment</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2008%2F05%2Femacs-gnus-searching-mail%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Geek: How to use offlineimap and the dovecot mail server to read your Gmail in Emacs efficiently</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2008/05/geek-how-to-use-offlineimap-and-the-dovecot-mail-server-to-read-your-gmail-in-emacs-efficiently/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2015-12-25T04:53:24Z</updated>
    <published>2008-05-09T02:07:09Z</published>
    <category term="emacs" />
<category term="geek" />
		<id>https://sachachua.com/blog/?p=4858</id>
		<content type="html"><![CDATA[<div class="update">2015-12-24: Updated with config changes now that I&#8217;m back to using Gnus+dovecot+offlineimap+Gmail</div>
<div class="update">2014-04-09: This post is from 2008. =) I think I used dovecot+offlineimap because Gnus and maildir weren&#8217;t getting along properly and directly connecting with IMAP to Gmail&#8217;s server was slow, but things have probably changed a fair bit since then. I eventually moved to using the Gmail web interface for most things, but I still miss my Gnus setup!</div>
<blockquote>
<ol>
</ol>
<ol>
<li>Make sure you&#8217;ve set up Postfix or some other mail server that can send mail.</li>
<li>Install dovecot (IMAP server) and offlineimap (IMAP synchronization). You can probably find binaries for your distribution.</li>
<li>Edit /etc/dovecot/conf.d/10-mail.conf and set the following:
<pre>mail_location = maildir:~/Maildir:LAYOUT=fs</pre>
</li>
<li>Use the instructions from <a href="http://unix.stackexchange.com/questions/44214/encrypt-offlineimap-password">http://unix.stackexchange.com/questions/44214/encrypt-offlineimap-password</a> to set up GPG-encrypted passwords. (optional)</li>
<li>Put the following in ~/.offlineimaprc, changing the details as needed.
<pre>[general]
accounts = SachaGmail
pythonfile = ~/bin/offlineimap-password.py

[Account SachaGmail]
localrepository = Local
remoterepository = Gmail
status_backend = sqlite

[Repository Local]
type = Maildir
localfolders = ~/Maildir

[Repository Gmail]
type = Gmail
maxconnections = 2
remoteuser = sacha@sachachua.com
realdelete = no
folderfilter = lambda foldername: foldername in ['INBOX', '[Gmail]/All Mail', '[Gmail]/Sent Mail', '[Gmail].Starred', '[Gmail].Drafts', '[Gmail].Important']
nametrans = lambda folder: re.sub('^INBOX$', '[Gmail].Inbox', folder)
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remotepasseval = mailpasswd("gmail")
</pre>
<p>If you feel comfortable specifying your password in your ~/.offlineimaprc, you can do so by changing remotepasseval to remotepass. If so, you don&#8217;t need the pythonfile line.</p></li>
<li><kbd>chmod go-rwx ~/.offlineimaprc</kbd> for a little bit of safety.</li>
<li>Type <b>offlineimap</b> to start synchronizing.</li>
<li>While that&#8217;s synchronizing, use something like this as your ~/.gnus:
<pre>(setq gnus-select-method
      '(nnimap "Mail"
	       (nnimap-address "localhost")
	       (nnimap-stream network)
	       (nnimap-authenticator login)))

(setq user-mail-address "youremail@example.com")
(setq gnus-ignored-from-addresses "youruser")
</pre>
</li>
<li>Start Emacs. Start Gnus with M-x gnus. If you don&#8217;t see the INBOX group, press ^ (gnus-group-enter-server-mode), open nnimap:Mail, move your cursor to the INBOX, and either press RET to go into the group or press u (gnus-browse-unsubscribe-current-group) to toggle the subscription status until you&#8217;re subscribed to the group. Then it should show up on the group screen (M-x gnus).</li>
</ol>
<p>Hope that helps. Have fun!</p></blockquote>
<p>You can <a href="https://sachachua.com/blog/2008/05/geek-how-to-use-offlineimap-and-the-dovecot-mail-server-to-read-your-gmail-in-emacs-efficiently/#comment">view 6 comments</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2008%2F05%2Fgeek-how-to-use-offlineimap-and-the-dovecot-mail-server-to-read-your-gmail-in-emacs-efficiently%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry><entry>
		<title type="html">Faster mail with Emacs</title>
		<link rel="alternate" type="text/html" href="https://sachachua.com/blog/2008/04/faster-mail-with-emacs/"/>
		<author><name><![CDATA[Sacha Chua]]></name></author>
		<updated>2008-04-13T04:58:16Z</updated>
    <published>2008-04-13T00:57:36Z</published>
    <category term="emacs" />
		<id>https://sachachua.com/blog/?p=4835</id>
		<content type="html"><![CDATA[<p>I spent a few minutes getting offlineimap to synchronize my Gmail messages with dovecot, an IMAP server on my laptop. I also set up Gnus to work with the messages. Now I&#8217;m having <i>fun</i> speeding through my inbox. I don&#8217;t know why, but my text-based terminal seems a lot zippier and a lot easier to work with than Gmail&#8230; =)</p>
<p>I&#8217;m glad I&#8217;m back to doing my mail in Emacs!</p>
<p>You can <a href="https://sachachua.com/blog/2008/04/faster-mail-with-emacs/#comment">view 1 comment</a> or <a href="mailto:sacha@sachachua.com?subject=Comment%20on%20https%3A%2F%2Fsachachua.com%2Fblog%2F2008%2F04%2Ffaster-mail-with-emacs%2F&body=Name%20you%20want%20to%20be%20credited%20by%20(if%20any)%3A%20%0AMessage%3A%20%0ACan%20I%20share%20your%20comment%20so%20other%20people%20can%20learn%20from%20it%3F%20Yes%2FNo%0A">e-mail me at sacha@sachachua.com</a>.</p>]]></content>
		</entry>
</feed>