當前位置:
首頁 > 知識 > 我的個人電子郵件系統設置:notmuch、mbsync、Postfix和 dovecot

我的個人電子郵件系統設置:notmuch、mbsync、Postfix和 dovecot

我的個人電子郵件系統設置:notmuch、mbsync、Postfix和 dovecot


編譯自: https://copyninja.info/blog/email_setup.html

作者: Copyninja

譯者: lixinyuxx

我使用個人電子郵件系統已經相當長的時間了,但是一直沒有記錄過文檔。最近我換了我的筆記本電腦(職業變更導致的變動),我在試圖重新創建本地郵件系統時迷茫了。所以這篇文章是一個給自己看的文檔,這樣我不用費勁就能再次搭建出來。

伺服器端

我運行自己的郵件伺服器,並使用 Postfix 作為 SMTP 伺服器,用 Dovecot 實現 IMAP。我不打算詳細介紹如何配置這些設置,因為我的設置主要是通過使用 Jonas 為 Redpill 基礎架構創建的腳本完成的。什麼是 Redpill?(用 Jonas 自己的話說):


<jonas> Redpill 是一個概念:一種設置 Debian hosts 去跨組織協作的方式

<jonas> 我發展了這個概念,並將其首次用於 Redpill 網中網:redpill.dk,其中涉及到了我自己的網路(jones.dk),我的主要客戶的網路(homebase.dk),一個包括 Skolelinux Germany(free-owl.de)的在德國的網路,和 Vasudev 的網路(copyninja.info)

除此之外, 我還有一個 dovecot sieve 過濾,根據郵件的來源,對郵件進行高級分類,將其放到各種文件夾中。所有的規則都存在於每個有郵件地址的賬戶下的 ~/dovecot.sieve 文件中。

再次,我不會詳細介紹如何設置這些東西,因為這不是我這個帖子的目標。


在我的筆記本電腦上

在我的筆記本電腦上,我已經按照 4 個部分設置

  1. 郵件同步:使用 mbsync 命令完成
  2. 分類:使用 notmuch 完成
  3. 閱讀:使用 notmuch-emacs 完成
  4. 郵件發送:使用作為中繼伺服器和 SMTP 客戶端運行的 Postfix 完成。

郵件同步

郵件同步是使用 mbsync 工具完成的, 我以前是 OfflineIMAP 的用戶,最近切換到 mbsync,因為我覺得它比 OfflineIMAP 的配置更輕量、更簡單。該命令是由 isync 包提供的。

配置文件是 ~/.mbsyncrc。下面是我的例子與一些個人設置。


IMAPAccount copyninja

Host imap.copyninja.info

User vasudev

PassCmd "gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ~/path/to/passphrase.txt -d ~/path/to/mailpass.gpg"

SSLType IMAPS

SSLVersion TLSv1.2

CertificateFile /etc/ssl/certs/ca-certificates.crt

IMAPAccount gmail-kamathvasudev

Host imap.gmail.com

User kamathvasudev@gmail.com

PassCmd "gpg -q --for-your-eyes-only --no-tty --exit-on-status-write-error --batch --passphrase-file ~/path/to/passphrase.txt -d ~/path/to/mailpass.gpg"

SSLType IMAPS

SSLVersion TLSv1.2

CertificateFile /etc/ssl/certs/ca-certificates.crt

IMAPStore copyninja-remote

Account copyninja

IMAPStore gmail-kamathvasudev-remote

Account gmail-kamathvasudev

MaildirStore copyninja-local

Path ~/Mail/vasudev-copyninja.info/

Inbox ~/Mail/vasudev-copyninja.info/INBOX

MaildirStore gmail-kamathvasudev-local

Path ~/Mail/Gmail-1/

Inbox ~/Mail/Gmail-1/INBOX

Channel copyninja

Master :copyninja-remote:

Slave :copyninja-local:

Patterns *

Create Both

SyncState *

Sync All

Channel gmail-kamathvasudev

Master :gmail-kamathvasudev-remote:

Slave :gmail-kamathvasudev-local:

# Exclude everything under the internal [Gmail] folder, except the interesting folders

Patterns * ![Gmail]*

Create Both

SyncState *

Sync All

對上述配置中的一些有趣部分進行一下說明。一個是 PassCmd,它允許你提供 shell 命令來獲取帳戶的密碼。這樣可以避免在配置文件中填寫密碼。我使用 gpg 的對稱加密,並在我的磁碟上存儲密碼。這當然是由 Unix ACL 保護安全的。

實際上,我想使用我的公鑰來加密文件,但當腳本在後台或通過 systemd 運行時,解鎖文件看起來很困難 (或者說幾乎不可能)。如果你有更好的建議,我洗耳恭聽:-)。

下一個指令部分是 Patterns。這使你可以有選擇地同步來自郵件伺服器的郵件。這對我來說真的很有幫助,可以排除所有的 「[Gmail]/ folders」 垃圾目錄。

郵件分類

一旦郵件到達你的本地設備,我們需要一種方法來輕鬆地在郵件讀取器中讀取郵件。我最初的設置使用本地 dovecot 實例提供同步的 Maildir,並在 Gnus 中閱讀。這種設置相比於設置所有的伺服器軟體是有點大題小作,但 Gnus 無法很好地應付 Maildir 格式,這是最好的方法。這個設置也有一個缺點,那就是在你快速搜索郵件時,要搜索大量郵件。而這就是 notmuch 的用武之地。

notmuch 允許我輕鬆索引上千兆位元組的郵件檔案而找到我需要的東西。我已經創建了一個小腳本,它結合了執行 mbsync 和 notmuch。我使用 dovecot sieve 來基於實際上創建在伺服器端的 Maildirs 標記郵件。下面是我的完整 shell 腳本,它執行同步分類和刪除垃圾郵件的任務。


#!/bin/sh

MBSYNC=$(pgrep mbsync)

NOTMUCH=$(pgrep notmuch)

if [ -n "$MBSYNC" -o -n "$NOTMUCH" ]; then

echo "Already running one instance of mail-sync. Exiting..."

exit 0

fi

echo "Deleting messages tagged as *deleted*"

notmuch search --format=text0 --output=files tag:deleted |xargs -0 --no-run-if-empty rm -v

echo "Moving spam to Spam folder"

notmuch search --format=text0 --output=files tag:Spam and

to:vasudev@copyninja.info |

xargs -0 -I {} --no-run-if-empty mv -v {} ~/Mail/vasudev-copyninja.info/Spam/cur

notmuch search --format=text0 --output=files tag:Spam and

to:vasudev-debian@copyninja.info |

xargs -0 -I {} --no-run-if-empty mv -v {} ~/Mail/vasudev-copyninja.info/Spam/cur

MDIR="vasudev-copyninja.info vasudev-debian Gmail-1"

mbsync -Va

notmuch new

for mdir in $MDIR; do

echo "Processing $mdir"

for fdir in $(ls -d /home/vasudev/Mail/$mdir/*); do

if [ $(basename $fdir) != "INBOX" ]; then

echo "Tagging for $(basename $fdir)"

notmuch tag +$(basename $fdir) -inbox -- folder:$mdir/$(basename $fdir)

fi

done

done

因此,在運行 mbsync 之前,我搜索所有標記為「deleted」的郵件,並將其從系統中刪除。接下來,我在我的帳戶上查找標記為「Spam」的郵件,並將其移動到「Spam」文件夾。你沒看錯,這些郵件逃脫了垃圾郵件過濾器進入到我的收件箱,並被我親自標記為垃圾郵件。

運行 mbsync 後,我基於它們的文件夾標記郵件(搜索字元串 folder:)。這讓我可以很容易地得到一個郵件列表的內容,而不需要記住列表地址。


閱讀郵件

現在,我們已經實現同步和分類郵件,是時候來設置閱讀部分。我使用 notmuch-emacs 界面來閱讀郵件。我使用 emacs 的 Spacemacs 風格,所以我花了一些時間寫了一個私有層,它將我所有的快捷鍵和分類集中在一個地方,而不會擾亂我的整個 .spacemacs 文件。你可以在 notmuch-emacs-layer 倉庫 找到我的私有層的代碼。


發送郵件

能閱讀郵件這還不夠,我們也需要能夠回復郵件。而這是最近是我感到迷茫的一個略顯棘手的部分,以至於不得不寫這篇文章,這樣我就不會再忘記了。(當然也不必在網路上參考一些過時的帖子。)

我的系統發送郵件使用 Postfix 作為 SMTP 客戶端,使用我自己的 SMTP 伺服器作為它的中繼主機。中繼的問題是,它不能是具有動態 IP 的主機。有兩種方法可以允許具有動態 IP 的主機使用中繼伺服器, 一種是將郵件來源的 IP 地址放入 my_network 或第二個使用 SASL 身份驗證。

我的首選方法是使用 SASL 身份驗證。為此,我首先要為每台機器創建一個單獨的賬戶,它將把郵件中繼到我的主伺服器上。想法是不使用我的主帳戶 SASL 進行身份驗證。(最初我使用的是主賬戶,但 Jonas 給出了可行的按賬戶的想法)


adduser <hostname>_relay

這裡替換 <hostname> 為你的筆記本電腦的名稱或任何你正在使用的設備。現在我們需要調整 Postfix 作為中繼伺服器。因此,在 Postfix 配置中添加以下行:


# SASL authentication

smtp_sasl_auth_enable = yes

smtp_tls_security_level = encrypt

smtp_sasl_tls_security_options = noanonymous

relayhost = [smtp.copyninja.info]:submission

smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

因此, 這裡的 relayhost 是用於將郵件轉發到互聯網的 Postfix 實例的伺服器名稱。submission 的部分 Postfix 將郵件轉發到埠 587(安全埠)。smtp_sasl_tls_security_options 設置為不允許匿名連接。這是必須的,以便中繼伺服器信任你的移動主機,並同意為你轉發郵件。

/etc/postfix/sasl_passwd 是你需要存儲用於伺服器 SASL 身份驗證的帳戶密碼的文件。將以下內容放入其中。


[smtp.example.com]:submission user:password

用你已放入 relayhost 配置的 SMTP 伺服器名稱替換 smtp.example.com。用你創建的 <hostname>_relay 用戶及其密碼替換 user 和 passwd。

若要保護 sasl_passwd 文件,並為 Postfix 創建它的哈希文件,使用以下命令。


chown root:root /etc/postfix/sasl_passwd

chmod 0600 /etc/postfix/sasl_passwd

postmap /etc/postfix/sasl_passwd

最後一條命令將創建 /etc/postfix/sasl_passwd.db 文件,它是你的文件的 /etc/postfix/sasl_passwd 的哈希文件,具有相同的所有者和許可權。現在重新載入 Postfix,並使用 mail 命令檢查郵件是否從你的系統中發出。


Bonus 的部分

好吧,因為我有一個腳本創建以上結合了郵件的同步和分類。我繼續創建了一個 systemd 計時器,以定期同步後台的郵件。就我而言,每 10 分鐘一次。下面是 mailsync.timer 文件。


[Unit]

Description=Check Mail Every 10 minutes

RefuseManualStart=no

RefuseManualStop=no

[Timer]

Persistent=false

OnBootSec=5min

OnUnitActiveSec=10min

Unit=mailsync.service

[Install]

WantedBy=default.target

下面是 mailsync.service 服務,這是 mailsync.timer 執行我們的腳本所需要的。


[Unit]

Description=Check Mail

RefuseManualStart=no

RefuseManualStop=yes

[Service]

Type=oneshot

ExecStart=/usr/local/bin/mail-sync

StandardOutput=syslog

StandardError=syslog

將這些文件置於 /etc/systemd/user 目錄下並運行以下代碼去開啟它們:


systemctl enable --user mailsync.timer

systemctl enable --user mailsync.service

systemctl start --user mailsync.timer

這就是我從系統同步和發送郵件的方式。我從 Jonas Smedegaard 那裡了解到了 afew,他審閱了這篇帖子。因此, 下一步, 我將嘗試使用 afew 改進我的 notmuch 配置,當然還會有一個後續的帖子:-)。



via: https://copyninja.info/blog/email_setup.html

作者: copyninja 譯者: lixinyuxx 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

如何在 Linux 中為每個屏幕設置不同的壁紙
使用 GNOME Web 「安裝」獨立 Web 應用

TAG:Linux技術 |