fdm

出自 ArchWiki

fdm (fetch and deliver mail),是一个用于投递和过滤邮件的简单程序。与其他同类用途的应用程序相比,它与 Mutt 非常注重设计原则的设计理念有相似之处。

安装

安装 fdm 软件包或 fdm-gitAUR 软件包。

配置

fdm 可以通过配置文件进行配置。默认配置文件是 ~/.fdm.conf,如果该文件不存在,则使用 /etc/fdm.conf

完整详细信息请参阅手册页 fdm(1)fdm.conf(5)/usr/share/doc/fdm-git/MANUAL

mbox

Alpine 使用 mbox 格式,因此我们需要设置一些我们将要编辑的文件

$ cd
$ mkdir mail
$ touch mail/INBOX .fdm.conf 
$ chmod 600 .fdm.conf mail/INBOX

maildir

Mutt 偏好使用大写的邮件目录,并且能够使用 maildir 格式。如果您计划使用 Mutt,请进行以下设置

$ cd
$ touch .fdm.conf; chmod 600 .fdm.conf
$ mkdir -p Mail/INBOX/{new,cur,tmp}

配置示例

编辑 .fdm.conf,并添加您的电子邮件帐户和基本过滤规则。使用 mbox 或 maildir,但不要同时使用两者。

.fdm.conf
## Accounts and rules for:
#> foo@example.com
#> bar@gmail.com
## Last edit 21-Dec-09
 
# Catch-all action (mbox):
action "inbox" mbox "%h/mail/INBOX"
# Catch-all action (maildir):
# action "inbox" maildir "%h/Mail/INBOX"
 
account "foo" imaps server "imap.example.com"
	user "foo@example.com" pass "supersecret"
 
account "bar" imaps server "imap.gmail.com"
	user "bar@gmail.com" pass "evenmoresecret"
 
# Match all mail and deliver using the 'inbox' action.
match all action "inbox"

这将从列出的帐户收集邮件,并将其投递到我们创建的 INBOX 文件夹中。有关如何连接到其他类型的邮件服务器(例如 POP3)的具体信息,请参阅 fdm(1) 手册页。

提示: 您还可以在 .netrc 文件中指定您的登录名和/或密码。

密码管理

电子邮件帐户的密码可以以纯文本形式存储在配置文件中,也可以通过 shell 命令从密码管理器或密钥环请求,格式为 $(cmd ...)

使用密码管理器

这是一个使用 pass 的示例

account "foo" imaps server "imap.example.com"
    user "foo@example.com" pass $(pass foo-email-entry | head -1)

OAuth2 认证,Gmail

fdm 可以使用 GMail 所需的 OAuth2 访问令牌,但它缺乏续订和/或授权 OAuth2 凭据的能力。一个全面的解决方案是使用 oama 实用程序,该实用程序为 IMAP/SMTP 客户端提供续订和授权 OAuth2 凭据的功能。初始设置完成后,访问令牌续订将在后台自动进行,对用户透明。

安装 oama-binAUR 软件包并配置 fdm

account "foo" imaps server "imap.gmail.com"
    user "foo@gmail.com"
    pass $(oama access foo@gmail.com)
    oauthbearer

从 cron 运行

虽然上面的示例在交互式使用中效果很好,但从 cron 作业中使用它们会稍微复杂一些,因为调用的一些程序可能需要特定的环境。可以通过使用包装脚本并导出需要的环境变量来解决这个问题。

以下是一些针对此类脚本的技巧

...
# for pass
export PASSWORD_STORE_DIR=~/.local/var/password-store
...
# when using gnome's keyring
# secret-tool can't live without these two envvars
# so we fake them for the case this script runs in a cron job
export DISPLAY=${DISPLAY:-:0}
export DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS:-unix:path=/run/user/$UID/bus}
...

测试

一旦您对这个设置感到满意,请尝试手动运行 fdm 来收集您的邮件。

$ fdm -kv fetch

这将使您的邮件在服务器上保持不变,以防出现错误。检查输出以确保一切按计划进行。打开您最喜欢的邮件阅读器 (MUA) 并确保您可以阅读刚刚投递的邮件。

扩展用法

额外过滤

如果您希望来自特定帐户的邮件进入特定的邮箱,您可以将以下行添加到您的 fdm.conf 文件中。从上面的配置文件中,如果您想将来自 bar@gmail.com 的邮件过滤到其自己的文件夹 bar-mail 中,您需要将此添加到现有的 “action” 行下方

action bar-deliver mbox "%h/mail/bar-mail"

如果需要,将 mbox 更改为 maildir,并确保路径正确。

要激活新的 action,请将其添加到现有的 “match” 行之前

match account bar action bar-deliver

然后,所有发送到 bar@gmail.com 的邮件都将放入 bar-mail 邮件文件夹中。

自动化

由于 fdm 不作为守护进程运行,因此定时邮件获取留给作业调度器,如 cronsystemd 计时器。本节将展示两者的实现。

Cron

每 15 分钟从所有帐户获取和分类邮件,并将所有匹配项的日志附加到本地文件

$ crontab -e
...
*/15 * * * * fdm fetch >> $HOME/[Mm]ail/fdm.log

systemd 计时器

为本地用户设置 fdm 服务,以从所有帐户获取和分类邮件

${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/fdm.service
[Unit]

Description=Fetch mail using fdm
After=network.target network-online.target dbus.socket
Documentation=man:fdm(1)

[Service]
Type=oneshot
ExecStart=/usr/bin/fdm fetch

然后设置计时器,每 15 分钟运行一次该服务

${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user/fdm.timer
[Unit]
Description=Fetch mail using fdm

[Timer]
# Uncomment to run the service two minutes after booting
# OnBootSec=2m
OnUnitActiveSec=15m
Persistent=true

[Install]
WantedBy=timers.target

最后 启动/启用 用户单元 fdm.timer