使用emacs读写电子邮件


77

我们如何使用emacs读写电子邮件?

该问题旨在为希望使用emacs处理电子邮件的用户提供规范的登陆点。

请为每个答案仅发布一个软件包/解决方案,并提供尽可能多的详细信息。可能有用的信息包括:

  • 要求,支持的环境
  • 支持的方法(读取和/或发送)
  • 支持的协议(pop,imap,smtp,本地邮件设置...)
  • 支持的身份验证
  • 密码存储(无,纯文本,访问外部钱包...)
  • 离线支持(无,主动缓存,按需...)
  • 使用附件有多容易?(通过拖放添加,下载,使用emacs或其他应用程序打开...)
  • 设置说明(越详细越好),屏幕截图...
  • 支持其他电子邮件功能(存档,过滤,文件夹)
  • 支持其他相关功能(联系人,RSS提要)...在此无需赘述,具体取决于该功能与电子邮件的关联程度

只要用户不需要直接与外部过程进行交互,就欢迎需要使用外部工具来处理邮件的解决方案。

示例:充当mutt前端的程序包是热门话题,而雷鸟用户则无法使用emacs编写其消息的解决方案

讨论的帖子

答案的快速链接(按字母顺序):


2
有没有一种方法可以通过emacs支持拖放来添加附件来阅读电子邮件?此功能确实简化了电子邮件客户端的工作。
命名

1
Emacs甚至支持@Name拖放吗?
PythonNut 2015年

@PythonNut好,如果我将文件拖放到缓冲区上,Emacs会打开该文件。因此,似乎Emacs原则上可以处理来自系统的拖放调用。
命名

@PythonNut是的,Emacs确实支持DnD。看到这里这里
罗勒,2017年

@Name:我发现使用或掌舵常春藤挑附件比拖放它们更容易,但是这是个人喜好的问题。
奥马尔(Omar)

Answers:


39

我使用Mu4e。它有充分的文档记录(也通过Info),并且在撰写本文时,已得到积极开发

Mu4e是作为mu的附件提供的,mu“用于处理Maildirs和消息文件,特别是用于索引和搜索电子邮件的一组工具”。它与offlineimapfetchmail一起使用。我还使用Emacs软件包smtpmail-multi,以便可以从具有不同设置的其他帐户发送邮件。为了与电子邮件提供商顺利集成,您应该apt-get install ca-certificates。而且,如果您想使用软件包管理的版本,可以使用来获取mu本身apt-get install maildir-utils

提供了一些示例配置,包括以下“最小配置”:

(require 'mu4e)     
(setq message-send-mail-function   'smtpmail-send-it
      smtpmail-default-smtp-server "smtp.example.com"
      smtpmail-smtp-server         "smtp.example.com"
      smtpmail-local-domain        "example.com")

依靠邮件提供商的设置,您将需要做更多的事情。特别是,您需要配置OfflineIMAP或Fetchmail才能实际检索邮件。在如下所示的配置中,我将所有内容设置为可以使用两个帐户。如果只需要从一个帐户取回,则可能要参考mu4e手册中包含的示例.offlineimaprc

至于扩展和与其他Emacs的包集成:Mu4e方便地与组织模式集成(用于捕捉链接消息或自定义搜索,甚至使用组织语法编写HTML格式的电子邮件,我虽然不使用该功能)通过附带的组织-mu4e.el。有一个单独的helm-mu集成可用,但需要IMO做更多工作。它以solarized.el为主题。还有一个mu4e-maildirs-extension,可以方便地统计每个邮件目录中已读和未读邮件的数量,还有一些我还没有尝试过的东西

这些示例配置与文档一起可以帮助一个新的mu4e用户起步。

.offlineimaprc

[general]
accounts = Gmail, Uni
maxsyncaccounts = 3

[Account Gmail]
localrepository = Local
remoterepository = Remote
status_backend = sqlite

[Repository Local]
type = Maildir
localfolders = ~/Maildir/google

[Repository Remote]
type = IMAP
remotehost = imap.gmail.com
remoteuser = other.e.mail@gmail.com
remotepass = TryAndGuess12345
ssl = yes
maxconnections = 1
realdelete = no

# cert_fingerprint = fa88366ccd90cd02f7a5655800226c43c8044ada
# but they change all the time, so...
sslcacertfile = /etc/ssl/certs/ca-certificates.crt

# Folders to get:
#
# In Gmail, filter all current mail that isn't *otherwise*
# filtered into the folder or folders you want to receive/sync.
# Keep that up to date; it will boost efficiency if you would
# otherwise be syncing a very large "Inbox" here.
folderfilter = lambda foldername: foldername in [
             'JUNE2015', 'Drafts', 'Sent']

[Account Uni]
localrepository = UniLocal
remoterepository = UniRemote
status_backend = sqlite

[Repository UniLocal]
type = Maildir
localfolders = ~/Maildir/uni

[Repository UniRemote]
type = IMAP
remotehost = pod666.outlook.com
remoteuser = username@campus.university.ac.uk
remotepass = TryAndGuess9876
ssl = yes
maxconnections = 1
realdelete = no

sslcacertfile = /etc/ssl/certs/ca-certificates.crt

配置mu4esmtpmail-multi

;;; Replies

(setq message-citation-line-function 'message-insert-formatted-citation-line) 
(setq message-citation-line-format "On %a, %b %d %Y, %f wrote:\n")

;;; smtp

(add-to-list 'load-path "~/smtpmail-multi")
(require 'smtpmail-multi)
(require 'smtpmail)

(setq smtpmail-multi-accounts
      (quote
       ((uni . ("username@campus.university.ac.uk"
                 "pod666.outlook.com"
                 587
                 "e.mail@uni.ac.uk"
                 nil nil nil nil))
        (gmail . ("other.e.mail@gmail.com"
                   "smtp.gmail.com"
                   587
                   "other.e.mail@gmail.com"
                   starttls
                   nil nil nil)))))

(setq smtpmail-multi-associations
      (quote
       (("other.e.mail@gmail.com" gmail)
        ("e.mail@uni.ac.uk" uni))))

(setq smtpmail-multi-default-account (quote gmail))

(setq message-send-mail-function 'smtpmail-multi-send-it)

(setq smtpmail-debug-info t)
(setq smtpmail-debug-verbose t)

;;; MU4E config

(require 'shr)

(defun shr-render-current-buffer ()
  (shr-render-region (point-min) (point-max)))

(setq mu4e-compose-dont-reply-to-self t)
(setq mu4e-compose-signature-auto-include nil)
(setq mu4e-html2text-command 'shr-render-current-buffer)

(setq mu4e-mu-binary "~/mu/mu/mu")

(setq user-full-name "Hello World")
(setq user-mail-address "other.e.mail@gmail.com")

(setq mu4e-hide-index-messages t)

(setq
   mu4e-maildir       "~/Maildir"   ;; top-level Maildir
   mu4e-sent-folder   "/sent"       ;; folder for sent messages
   mu4e-drafts-folder "/drafts"     ;; unfinished messages
   mu4e-trash-folder  "/trash"      ;; trashed messages
   mu4e-refile-folder "/archive")   ;; saved messages

(setq
   mu4e-get-mail-command "offlineimap"   ;;  -a Uni to just do university acc't
   mu4e-update-interval nil)             ;; 300 to update every 5 minutes

(setq mu4e-bookmarks
  '( ("flag:unread AND NOT flag:trashed"                "Unread messages"        ?u)
     ("date:today..now"                                 "Today's messages"       ?t)
     ("date:7d..now"                                    "Last 7 days"            ?w)
     ("date:1d..now AND NOT list:emacs-orgmode.gnu.org" "Last 1 days"            ?o)
     ("date:1d..now AND list:emacs-orgmode.gnu.org"     "Last 1 days (org mode)" ?m)
     ("maildir:/sent"                                   "sent"                   ?s)
     ("maildir:/uni/INBOX AND date:7d..now"             "University Last 7 days" ?g)
     ("maildir:/google/JUNE2015 AND date:7d..now"       "Gmail Last 7 days"      ?c)
     ("mime:image/*"                                    "Messages with images"   ?p)))

(setq mu4e-maildir-shortcuts
      '( ("/google/JUNE2015" . ?c)
         ("/uni/INBOX"       . ?g)
         ("/sent"            . ?s)))

(setq mu4e-user-mail-address-list (list "other.e.mail@gmail.com" "e.mail@uni.ac.uk"))

(setq message-kill-buffer-on-exit t)

(setq
 mu4e-view-show-images t
 mu4e-view-image-max-width 800)

;; A little demo function for switching accounts
(defun switch ()
  (interactive)
  (save-excursion (goto-char (point-min))
                  (forward-char 19)
                  (cond
                   ((looking-at "other.e.mail@gmail.com")
                    (delete-region (match-beginning 0) (match-end 0))
                    (insert "e.mail@uni.ac.uk")
                    (buffer-face-set 'default))
                   ((looking-at "e.mail@uni.ac.uk")
                    (delete-region (match-beginning 0) (match-end 0))
                    (insert "other.e.mail@gmail.com")
                    (buffer-face-set 'bold-italic))
                   (t nil))))

(add-hook 'mu4e-compose-mode-hook (lambda () (buffer-face-set 'bold-italic)))

;;; Saving outgoing mail

;; Following tip from documentation for `mu4e-sent-messages-behavior' - see also
;; http://www.djcbsoftware.nl/code/mu/mu4e/Saving-outgoing-messages.html
;; for some related points, but not necessary to do things both ways.

(setq message-sendmail-envelope-from 'header)

(setq mu4e-sent-messages-behavior
      (lambda ()
    (if (string= (message-sendmail-envelope-from) "other.e.mail@gmail.com")
        (progn (message "Delete sent mail.")
           'delete)
      (progn (message "Save sent mail.")
         'sent))))

;;; Org mode compatibility

;; Use `org-store-link' to store links, and `org-insert-link' to paste them

(require 'org-mu4e)

;;; That's all

(provide 'my-mu4e-config)

屏幕截图:使用搜索字词列表浏览:emacs-orgmode.gnu.org

浏览组织列表


1
它支持Windows emacs吗?
Leu_Grady

1
@ user3173715,OfflineIMAP不正式支持Windows,“但是有些已经使它能够工作”;Fetchmail是另一个选项,并且是此Unixmail for Windows端口的一部分;mu本身是“用C和一点C ++(与Xapian交互)编写的”,它具有“对本机Microsoft Windows支持的两个选项”。如果您愿意将这样的零碎代码放在一起,则很有可能使其正常工作。我自己不是Windows用户,所以我不能告诉您更多信息,也许其他人会对此进一步发表评论。
Joe Corneli 2015年

2
是否有一些网站解释为什么gnus用户想要切换或已切换到mu4e,为什么?我很好奇,目前似乎很受欢迎。
politza

2
@Malabarba,我从mu4e文档中添加了“最小配置”,并链接到其简单的示例.offlineimaprc
Joe Corneli 2015年

2
一个重要的功能或破坏交易的方法(取决于用户的观看方式)是mu 服务器在启动后一直运行mu4e,这在我的测试中极大地影响了Emacs的性能,并阻止使用其他实用程序,例如打开需要使用的另一个缓冲区aspell。与mu 服务器通信是一种内置功能,不能禁用它。我认为,这是一个设计缺陷,应该在mu不运行24/7服务器的情况下通过单独调用进行纠正。要验证,请M-x list-processes在运行后键入M-x mu4e
法律列表

24

如果您使用Gnus(已经捆绑了Emacs),请检查https://github.com/redguardtoo/mastering-emacs-in-one-year-guide/blob/master/gnus-guide-en.org

这是指南的摘要:

  • 使用EmacsWiki的最低设置就足够了(http://www.emacswiki.org/emacs/GnusGmail)。它不仅适用于Gmail,还适用于任何邮件服务
  • 您可以读/写HTML邮件
  • 您需要手动订阅邮件文件夹
  • C-u Enter在任何邮件文件夹上按以查看该文件夹中的所有项目,否则,仅可见未读邮件
  • 开箱即用地支持流行的协议和身份验证方法
  • 为了存储密码,我只使用了与Emacs捆绑在一起的easygpg。easygpg是一个通用框架。因此,密码被加密并离线存储。
  • Gnus以前支持电子邮件离线本地缓存
  • 添加/删除/下载附件很容易。我不知道拖放的事情,因为我只使用键盘。您需要设置“ mailcap-mime-data”来打开第三方应用程序的附件。
  • 开箱即用地支持本地/远程搜索邮件
  • 支持过滤器/存档。但是我建议使用popfile,它是一个独立的邮件过滤器软件。我使用popfile是因为它比任何其他邮件过滤器(例如Gmail自己的过滤器)要好得多。
  • 联系人管理由bbdb(另一个Emacs插件)处理,通过使用gmail2bbdb.el(由我编写)从Gmail导入联系人也很容易。
  • 对于rss的阅读,您最好改用elfeed(Gnus可以通过使用Gwene服务来做到这一点,但是elfeed易于设置并且具有更多现成的功能)。Gwene功能强大,但需要更多知识(我的Gnus指南,emacs-w3m的API,hydra,Lisp编程,Linux cli工具,shell)
  • Gnus支持所有平台。但是在Windows上,您需要将OpenSSH和GnuTLS中的二进制文件添加到环境变量PATH中。这两个软件包可以通过Cygwin安装。Emacs可以是Windows本机版本。从Emacs 26开始,所有依赖项都打包到一个包中。

查看我的指南以获取更多提示。

IMO,您最好不要将Gnus完全替代Gmail的Web UI(或任何其他邮件服务的Web UI)。掌握Gnus的最佳做法是将Gnus视为Gmail的增强功能。因此,如果Gnus可以做某些事情,您将不会感到沮丧,因为您始终可以在Web UI上回退。

屏幕截图:

在此处输入图片说明


4
感谢将gnus添加到列表中,它似乎是将电子邮件与emacs结合使用的规范方法之一。但是目前,这个答案仅比仅链接的答案要多。从该链接(或其他位置!)中提取信息以更精确地回答该问题将更为有用:除了防止链接腐烂之外,它还有助于与其他邮件包进行比较。
T. Verron

另外,屏幕截图非常棒,这样新访客就可以轻松获得外观感。
Joe Corneli 2015年

11

不多

我在emacs中使用的电子邮件很少

hello视图的屏幕截图

它仅在本地邮件上运行,每个文件需要存储一封邮件,而我使用smtp服务器向其发送的maildir文件夹。它应该能够处理将邮件同步到计算机上的maildir文件夹的其他解决方案。

要开始使用它,您需要安装命令行库和emacs界面,并通过调用notmuch,通过短文本向导开始配置,设置对过滤脚本的常规调用,该脚本notmuch new从被标记的线程(例如邮件列表)中调用并标记其他邮件。您希望忽略的线程)或将按邮件守护程序排序的邮件标记为特殊的maildir。在emacs中,您需要调用M-x notmuch以查看以前的界面。该界面的几乎所有配置都可以通过emacs的Customization接口完成。

因为它从其他系统下载消息,所以除了使用emacs内置支持发送电子邮件外,它没有内置的身份验证或协议。

它不使用文件夹本身,但实际上存储的搜索就像阅读邮件一样。它确实在nothuch-hello视图中列出了所有使用过的标签,因此,当您决定如何标记邮件时,列表会自动更新。它不需要存档,因为当您有很多电子邮件时,它不会减慢速度。

轻巧的部分除了快速的全文本以及带标记和范围的搜索之外,还列出了匹配项和对消息的答复。我不知道拖放是如何工作的,因为我通过服务器上的终端和远程外壳使用它。

消息线程中的消息视图

搜索结果的备用树形视图

更多屏幕截图:https//notmuchmail.org/screenshots/

当您在两台不同的计算机上使用不多时,最困难的部分是拥有一个同步标签,但是人们已经解决了这个问题,从我从邮件列表中收集的信息来看,它现在可能已经可以工作了。或浏览https://notmuchmail.org/remoteusage/,了解我刚刚偶然发现的新设置。

大多数Linux发行版都有一些软件包,它是通过邮件列表在集市环境中开发的。如果您是从tarball或git进行自编译的,则它使用C代码,并且依赖于Xapian来存储消息摘录,GMime来解码MIME电子邮件,Talloc来进行内存管理以及zlib(这也是Xapian的依赖项) 。

它将可能与rss2email或将rss提要转换为maildirs的任何解决方案一起正常工作。

它可以通过命令行使用,除了默认的emacs elisp界面之外,其他人也可以将其与mutt(将搜索结果复制/硬链接到磁盘上的maildir文件夹)或vim一起使用。

如果您的邮件量超过我的邮件数量(〜90k邮件,邮件数量不多),则可能需要一些维护才能继续运行。


1
Emacs Notmuch使用起来令人愉悦,功能强大,速度非常快,并且易于学习和配置(比Gnus简单得多)。我对此很满意。我还没有测试Mu4e,猫叫或旅行癖。无论如何,这里有一些不错的文章:lwn.net/Articles/705856 wwwtech.de/articles/2016/jul/my-personal-mail-setup
Jorge,

6

多年来,我一直是mew的快乐用户。

我已经很长时间没有使用emacs来读写邮件了,所以这些信息可能已经过时了。希望更多的新用户可以填写它。现在,将此答案视为存根。(我将其设为社区Wiki,以便其他人可以更自由地对其进行编辑。)

首先,以我的经验,喵喵很快。我使用mew可以轻松处理大量流量的邮件列表。

设置mew有点麻烦,尤其是因为它使用(使用?)stunnel来创建到SMTP和IMAP服务器的加密连接。但基本上,它只涉及编辑文件~/.mew.el和为mew设置目录以保留其数据。除了stunnel(当然还有emacs),它没有依赖性。

该文档似乎足够了,尽管我经常发现自己在错误的部分中查找。不过,维护似乎已步入缓慢状态。有时会修复一些错误,但是一段时间以来我没有发现任何新功能。


我会提供更多详细信息,但是正如我所说,我已经很长时间没有使用emacs了。主要是因为大量的仅使用HTML格式的电子邮件,从长远来看,这成为后方的主要痛苦。所以这些天,我只使用基于GUI的电子邮件客户端。
Harald Hanche-Olsen

感谢您列出它,希望其他一些喵喵用户可以加入并填补空白。关于html格式的电子邮件,也许既然emacs附带了html渲染器,情况通常已经改变了?
T. Verron '16

@ T.Verron可能是。我很确定mew不支持内置的html渲染器。但是,一个大问题是如何处理嵌入式图像?如果它们链接到外部图像,那没问题,但是消息中包含的图像又如何呢?顺便说一句,可以将其配置为使用w3m显示HTML编码的邮件,但我从来没有进行过测试。
Harald Hanche-Olsen

5

WANDERLUSThttps : //github.com/wanderlust/wanderlust

特征:

  • 仅在elisp中实施。
  • 支持IMAP4rev1,NNTP,POP(POP3 / APOP),MH和Maildir。
  • 基于文件夹规范(如Mew)对邮件的集成访问。
  • 像Mew一样的键绑定和标记处理。
  • 线程和未读消息的管理。
  • 文件夹模式,用于选择和编辑订阅的文件夹。
  • 消息缓存,断开连接的操作。
  • 类似于MH的Fcc(Fcc:可以执行%Backup)。
  • 完全支持MIME(由SEMI提供)。
  • 草稿编辑邮件和新闻的界面相同。
  • 文件夹列表的基于图标的界面(XEmacs和> = Emacs 21)。
  • 跳过MIME(IMAP4)的大消息部分的提取。
  • 服务器端搜索(IMAP4),国际化搜索可用。
  • 虚拟文件夹,包括但不限于使用Wanderlust的自定义搜索或诸如mu和的外部实用程序grep
  • 压缩文件夹。
  • 旧邮件自动过期。
  • 自动刷新。
  • 草稿模板。

EMACS维基百科:https//www.emacswiki.org/emacs/WanderLust

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.