Gmail 같은 웹 기반 이메일 인터페이스는 효율성이 떨어지고 보안에도 취약한 경우가 많습니다. 항상 인터넷에 연결되어 있어야 하며, 대량 태깅이나 필터링 같은 기능도 제대로 지원하지 않습니다. 하지만 이미 텍스트 편집을 위해 Emacs를 사용하고 있다면, 같은 도구로 이메일까지 관리할 수 있습니다.
현대적인 이메일 클라이언트와 Emacs
Thunderbird나 Evolution처럼 오프라인 이메일 클라이언트도 존재하지만, 이런 프로그램은 대체로 용량이 크고 필요한 기능이 모두 갖춰져 있지 않거나 다른 애플리케이션과 잘 연동되지 않는 경우가 많습니다.
예를 들어 Evolution은 이메일과 캘린더는 처리할 수 있지만 문서 작성, 뉴스그룹, 할 일 목록 관리는 지원하지 않습니다. 이렇게 분절된 사용자 경험은 장기적으로 더 많은 문제를 일으킬 수 있습니다.
반면 Emacs는 상호 운용성이라는 개념 위에서 동작합니다. Emacs 안에서는 모든 것이 동일한 디자인 언어로 접근하고 조작할 수 있으며, 기본 작업을 수행하는 키 바인딩도 모두 같습니다. 더 나아가 각 패키지들은 다른 패키지의 입력으로 활용할 수 있는 텍스트를 생성하고 출력하도록 설계되어 있습니다.
예를 들어 gnus로 뉴스그룹을 읽고 Org Mode로 노트를 관리한다면, 뉴스그룹 게시글을 Org 버퍼로 보내 주석을 달거나 영감을 기록으로 저장할 수 있습니다.
또한 EMMS로 음악을 관리한다면 현재 재생 중인 곡 제목을 텍스트로 출력할 수 있고, 이를 블로그 글에 링크해 글을 쓰면서 듣고 있는 음악을 소개할 수도 있습니다.
이메일 클라이언트로서의 Emacs
Emacs를 사용하면 이메일을 Org 버퍼에 통합해 저장하고, 여기에 주석을 달거나 캘린더의 할 일 항목으로 만들 수 있습니다.
반대로도 가능합니다. Org 버퍼에서 글을 작성한 뒤 Emacs 내에서 그대로 누군가에게 이메일로 전송할 수 있습니다.
이것이 가능한 이유는 두 가지 프로그램 덕분입니다. 바로 Offlineimap과 notmuch입니다.
- Offlineimap은 원격 서버에서 이메일을 가져와 디스크에 저장하는 헬퍼 프로그램입니다. 서버는 직접 호스팅하는 것일 수도 있고, Gmail이나 Protonmail 같은 이메일 서비스일 수도 있습니다.
- notmuch는 매우 단순한 애플리케이션으로, 메일에 태그를 붙이고 화면에 표시하는 역할을 합니다. 받은 모든 메일의 데이터베이스를 유지하며 설정된 규칙에 따라 태그를 붙이고, 그 태그를 기준으로 Emacs 안에서 메일을 표시합니다.
Offlineimap과 notmuch 설치하기
Debian과 Ubuntu에서 두 프로그램을 설치하려면:
sudo apt install offlineimap notmuch
Arch Linux에서는:
sudo pacman -Syu offlineimap notmuch
Fedora에서는:
sudo dnf install offlineimap notmuch
설치 후에는 Emacs용 notmuch 패키지를 추가로 설치해야 합니다. 현재 MELPA 저장소에서 제공되며, 먼저 Emacs 설정에서 MELPA를 활성화해야 할 수도 있습니다.
그러려면 init.el 파일에 다음 lisp 코드를 추가하세요:
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/"))
(package-initialize)
notmuch 패키지를 설치하려면 Alt + X를 누르고 package-install을 입력합니다. Emacs가 설치할 패키지 이름을 물으면 "notmuch"라고 입력하면 됩니다.
설치가 완료되면 이 패키지는 notmuch 태깅 프로그램의 프런트엔드 역할을 하게 됩니다.
Offlineimap 설정하기
여기까지 마쳤다면 이제 Offlineimap을 구성할 차례입니다. 과정은 간단하며 기본적으로 하나의 파일만 다루면 됩니다. 바로 ".offlineimaprc"입니다.
기본적으로 이 설정 파일은 홈 디렉터리에서 읽어옵니다. 다음 명령으로 파일을 생성하세요:
touch /home/$USER/.offlineimaprc
생성했다면 선호하는 텍스트 편집기로 파일을 엽니다.
Offlineimap의 설정은 INI 형식으로 작성됩니다. 예를 들어 IMAP 계정 하나를 위한 .offlineimaprc는 다음과 같은 모습일 수 있습니다:
[general] accounts = imapaccount [Account imapaccount] localrepository = thismachine remoterepository = thatimap [Repository thismachine] type = Maildir localfolders = /home/$USER/mail/youremail@domain.com [Repository thatimap] type = IMAP remotehost = imap.domain.com remoteuser = youremail@domain.com remotepass = your_password_goes_here ssl = yes sslcacertfile = /your/ca/cert/path/here
- general 카테고리는 이 설치에서 계정 하나만 설정한다는 것을 Offlineimap에 알려줍니다.
- Account 카테고리는 해당 계정이 어디서 이메일을 가져오는지, 그리고 Offlineimap이 메일을 가져올 때 실행할 스크립트가 무엇인지 지정합니다.
- Repository 카테고리는 설정하려는 계정의 구성 정보를 Offlineimap에 알려줍니다. 여기의 설정값은 Gmail을 사용하는지 여부에 따라 크게 달라집니다.
이메일 저장소(Repository) 이해하기
Offlineimap은 원격 이메일 디렉터리의 구조를 로컬 컴퓨터에 저장하는 방식으로 동작합니다. 덕분에 이 프로그램은 원격 IMAP 서버를 흉내 낼 수 있고, notmuch 같은 이메일 클라이언트가 온라인 연결 없이도 메일을 읽을 수 있습니다.
Repository 카테고리는 로컬 사서함을 설정하는지 원격 사서함을 설정하는지에 따라 달라집니다. 로컬 사서함을 만들려면 type을 "Maildir"로 지정하기만 하면 됩니다. 이렇게 하면 Offlineimap이 해당 저장소가 로컬 머신의 위치를 가리킨다는 것을 인식합니다.
[Repository thismachine] type = Maildir localfolders = /home/$USER/mail/youremail@domain.com
반면 원격 저장소 설정은 조금 복잡할 수 있습니다. 하지만 설정 파일의 각 값이 무엇을 의미하는지만 이해하면 원격 설정도 아주 간단합니다.
앞서 살펴본 Repository 블록 예제를 다시 보겠습니다:
[Repository thatimap] type = IMAP remotehost = imap.domain.com remoteuser = youremail@domain.com remotepass = your_password_goes_here ssl = yes sslcacertfile = /your/ca/cert/path/here
- type 설정은 Offlineimap이 연결할 서버 종류를 나타냅니다. 선택지는 두 가지뿐입니다. Google Mail용 Gmail과 Google 외 계정용 IMAP입니다.
- remotehost 설정은 Offlineimap이 연결할 IMAP 서버의 주소를 지정합니다.
- remoteuser와 remotepass에는 사용자 인증 정보를 입력합니다.
- ssl을 "yes"로 설정하면 Offlineimap이 IMAP 서버와 암호화된 연결을 맺도록 지시합니다.
- sslcacertfile 옵션은 로컬 SSL 인증서의 경로를 지정합니다. Offlineimap은 이 인증서로 IMAP 서버와의 연결을 검증합니다.
Gmail에 연결하기
앞서 설명했듯이 Offlineimap은 Gmail 계정 연결을 위한 특수한 타입도 제공합니다. Google은 자사 메일 서비스에 연결할 때 추가 정보를 요구하기 때문입니다.
Offlineimap으로 Gmail에 연결하려면 로컬 및 원격 저장소의 타입만 변경하면 됩니다. 로컬 저장소는 "GmailMaildir", 원격 저장소는 "Gmail"로 설정합니다.
예를 들어 Gmail 서비스에 연결하는 .offlineimaprc 파일은 다음과 같습니다:
[general] accounts = gmailaccount [Account gmailaccount] localrepository = localgmail remoterepository = remotegmail [Repository localgmail] type = GmailMaildir localfolders = /home/$USER/mail/youremail@gmail.com [Repository remotegmail] type = Gmail maxconnections=1 remotehost = imap.gmail.com remoteuser = youremail@gmail.com remotepass = your_password_goes_here ssl = yes sslcacertfile = /your/ca/cert/path/here
SSL 연결 설정하기
다음으로는 Offlineimap이 SSL을 통해 연결하도록 구성해야 합니다. 이를 위해 시스템 전역 SSL 인증서의 경로를 지정해야 합니다.
SSL 인증서 위치는 사용 중인 시스템에 따라 다릅니다. Debian과 Ubuntu에서는 다음 경로에 위치합니다:
ls /etc/ssl/certs/ca-certificates.crt
이제 터미널에서 offlineimap을 실행하면 원격 IMAP 서버의 모든 메일을 가져올 수 있습니다.
notmuch 설정하기
이어서 notmuch 설정으로 넘어가겠습니다. 이름처럼 설정할 것이 많지 않습니다.
IMAP 디렉터리가 준비되면 명령줄에서 notmuch를 실행합니다. 그러면 구성 스크립트가 시작되며 사용자의 이메일 환경에 대한 질문을 합니다.
완료되면 notmuch가 홈 디렉터리에 설정 파일을 생성합니다. 다음 명령으로 확인할 수 있습니다:
less /home/$USER/.notmuch-config
새 메일을 어디에서 찾을지 notmuch에 알려주는 몇 가지 옵션을 설정하세요. 또한 notmuch가 데이터베이스를 검색할 때 색인하지 않을 태그도 지정할 수 있습니다.
예를 들어 junk 태그가 붙은 메일은 검색하지 않도록 설정할 수 있습니다:
[search] exclude_tags = junk
notmuch로 이메일 태그 달기
눈치챘겠지만 notmuch 설정 파일에는 이메일 태그를 따로 지정하지 않았습니다. notmuch는 명령줄에서 직접 이메일에 태그를 달기 때문입니다.
덕분에 notmuch를 유연하게 활용할 수 있습니다. 예를 들어 cronjob으로 주기적으로 실행되는 스크립트에 notmuch 태깅 명령을 포함시킬 수 있습니다.
먼저 다음 명령으로 notmuch의 데이터베이스를 초기화해야 합니다:
notmuch new
이 명령은 설정 파일을 읽고 합리적인 기본값을 기준으로 데이터베이스를 생성합니다. 이후부터는 notmuch의 태깅 명령으로 새로 도착하는 메일과 기존 메일 모두에 태그를 붙일 수 있습니다.
notmuch의 태깅 문법
notmuch의 태깅 문법은 매우 직관적이며, 일반적인 형태는 다음과 같습니다:
notmuch tag [+|-]label header:header-property (tag:current-tag)
- tag 명령은 이후의 인수들이 사서함에 태깅 규칙을 만드는 데 사용됨을 notmuch에 알려줍니다.
- label 옵션은 라벨을 추가할지(+) 아니면 기존 라벨을 제거할지(-) 지정합니다. 예를 들어 모든 수신 메일은 기본적으로 "unread" 태그가 붙으므로, -unread로 설정해 읽지 않음 태그를 제거할 수 있습니다.
- header 옵션은 설정한 이메일 헤더를 기준으로만 라벨을 적용하도록 지시합니다. 예를 들어 "From:" 헤더를 사용해 발신인에 따라 메일을 필터링할 수 있습니다.
- tag 옵션은 특정 태그에만 태깅 규칙 적용을 한정하는 선택적 인수입니다. 예를 들어 unread 태그가 있는 메일에만 라벨을 적용하도록 설정할 수 있습니다.
Emacs에서 이메일 확인하기
이제 Emacs 안에서 이메일을 확인할 수 있습니다. Alt + X를 누른 뒤 notmuch를 입력하세요. Emacs용 notmuch 프런트엔드 패키지가 로드됩니다.
첫 화면에는 기본적으로 몇 가지 표준 태그가 표시됩니다. 사용자 정의 태그를 보려면 "All Tags" 옆의 "[show]" 버튼을 클릭하세요. 또한 S를 누르고 명령 버퍼에 "is:tag_name" 형식으로 입력해서도 태그에 접근할 수 있습니다.
표준 Emacs 이동 및 편집 키도 notmuch 안에서 그대로 작동합니다. 더불어 이메일을 더 잘 걸러낼 수 있는 다양한 기능도 제공됩니다.
예를 들어 특정 태그를 보는 중 Shift + Z를 누르면 "트리형" 보기가 실행됩니다. 메일링 리스트를 구독하고 있다면 스레드별로 이메일을 쉽게 따라갈 수 있어 유용합니다.
Emacs에서 이메일 보내기 설정하기
이제 Emacs 안에서 읽을 수 있는 이메일 디렉터리가 준비되었습니다. 하지만 아직 메일을 보낼 방법은 설정하지 않았습니다. 다행히 Emacs에서는 놀랄 만큼 쉽게 설정할 수 있습니다.
이메일 발송 기능을 활성화하려면 init.el 파일에 다음 lisp 코드를 추가하세요:
(setq mail-user-agent 'message-user-agent)
(setq message-send-mail-function 'smtpmail-send-it
smtpmail-stream-type 'starttls
smtpmail-smtp-server "mail.domain.com"
smtpmail-smtp-service 587)
- mail-user-agent는 user-agent 변수를 Emacs의 message-user-agent로 설정합니다. 발송 이메일이 Emacs에서 왔다는 것을 식별하게 해 주며, 다른 메일 서버와 통신할 수 있도록 합니다.
- message-send-mail-function은 내장
smtpmail패키지를 사용해 이메일을 올바르게 전송하도록 Emacs에 지시합니다. - smtpmail-stream-type은 원격 메일 서버에 연결할 때 Emacs가 사용할 연결 방식을 나타냅니다. 현재 대부분의 메일 서버는 SSL/TLS 또는 STARTTLS를 사용합니다.
- smtpmail-smtp-server는 연결하려는 SMTP 서버의 주소를 설정합니다.
- smtpmail-smtp-service는 SMTP 패킷을 보낼 때 Emacs가 사용할 포트를 설정합니다. SSL/TLS를 사용한다면 465를, STARTTLS를 사용한다면 587을 입력하세요.
.authinfo로 이메일 인증 설정하기
Emacs가 메일 계정을 통해 이메일을 보낼 수 있도록 허용해야 합니다. .authinfo 파일에 이메일 인증 정보를 추가하면 됩니다.
.authinfo 파일은 원격 서비스에 로그인할 때 사용자 인증 정보를 저장하는 숨김 파일입니다. 대부분 리눅스 설치 시 기본으로 존재하지 않지만, 다음 명령으로 생성할 수 있습니다:
touch /home/$USER/.authinfo
중요한 점은 이 파일에 사용자 이름과 비밀번호 같은 민감한 정보가 담긴다는 것입니다. 따라서 본인만 읽고 쓸 수 있도록 접근 권한을 반드시 제한해야 합니다. 다음 명령으로 설정하세요:
chmod 600 /home/$USER/.authinfo
이제 .authinfo 파일을 열어 메일 계정 인증 정보를 입력합니다. .authinfo 파일의 일반적인 문법은 다음과 같습니다:
machine mail.domain.com login username@domain.com port 587 password mypasswordis123
- machine 변수는 다른 머신이나 서버에 연결한다는 것을 Emacs에 알려줍니다.
- 도메인 이름은 연결하려는 머신의 주소임을 나타냅니다.
- login 필드에는 이메일 주소를 입력합니다.
- port 옵션은 Emacs가 연결할 포트를 지정합니다. init.el 파일에 설정한 포트 번호와 일치해야 합니다.
- password 변수에는 이메일 계정의 비밀번호를 입력합니다.
새 설정을 적용하려면 Emacs를 다시 시작하세요.
Emacs에서 첫 이메일 보내기
설정을 마쳤다면 Emacs에서 이메일을 보내는 일은 매우 간단합니다. Ctrl + X, M을 누르거나 notmuch 버퍼 안에서 M을 누르면 됩니다.
이 키 바인딩은 composemail 명령을 실행하여 빈 제목란이 있는 메시지 버퍼를 만들고, 거기에 이메일 내용을 작성할 수 있습니다.
작성을 마쳤다면 Ctrl + C, Ctrl + C를 눌러 Emacs에서 첫 이메일을 보내세요.
축하합니다! Emacs를 이메일 클라이언트로 성공적으로 설정했습니다. 더 나아가 IMAP과 SMTP 서버가 어떻게 동작하는지, 이메일 태깅 시스템 구축의 기본까지 익히셨습니다.
이 내용이 Emacs로 더 많은 일을 할 수 있다는 생각을 불러일었다면, 확장 가능한 이 텍스트 편집기를 위한 유용한 패키지 다섯 가지도 확인해 보세요.
자주 묻는 질문
1. offlineimap 실행 후 이메일에 자동으로 태그를 달 수 있나요?
네, Offlineimap에 notmuch post-sync 훅을 만들면 됩니다. Account 카테고리 아래에 "postsynchook" 변수를 삽입하세요:
... [Account imapaccount] localrepository = thismachine remoterepository = thatimap postsynchook = /path/to/your/script.sh ...
이 변수에는 notmuch 명령으로 태그를 지정하는 실행 가능한 스크립트의 파일 경로를 넣습니다.
예를 들어 다음은 수신되는 메일링 리스트 메일에서 unread 태그를 제거하고 적절한 태그를 붙이는 간단한 post-sync 스크립트입니다:
#!/bin/sh notmuch new notmuch tag -inbox -unread +mailing-list from:mailing-list or to:mailing-list@domain.com tag:inbox notmuch tag -inbox -unread +mailinglist-cmd from:mailing-list-cmd@domain.com tag:inbox
2. 이메일을 작성했지만 보내지 않기로 했습니다. Emacs에서 이메일을 어떻게 폐기하나요?
메시지 버퍼 안에서 Ctrl + C, Ctrl + D를 누르면 됩니다. 그러면 해당 이메일은 폐기된 초안으로 표시되고, Emacs가 일정 시간 후 삭제합니다.
3. Emacs의 notmuch 안에서 이메일 태그를 수정할 수 있나요?
네, 가능합니다! notmuch 버퍼 안에서 Shift + =를 누르세요. 작은 명령 버퍼가 열리고, 특정 이메일에 추가하거나 제거할 태그를 지정할 수 있습니다.