[Linux] Mutt 사용법

문연수·2024년 12월 29일
0

Linux (Fedora)

목록 보기
24/24
post-thumbnail

 미루고 미뤄왔던 리눅스 메일 클라이언트, mutt 의 사용법을 정리해보려 한다.

1. Mutt 란?

`"All mail clients suck. This one just sucks less." - me, circa 1995

(필자가 잠깐 써본 결과 위 소개 문구와 같이 썩 만족스럽다.)

MuttUnix (Linux 도 가능) 에서 사용 가능한 텍스트 기반 메일 클라이언트이다. 혹시 WindowsOutlook 을 써 보았는가? 그렇다면 쉽게 이해가 가능할 수 있을텐데 그런 프로그램의 한 종류이다. 다만 이건 터미널에서 쓸 수 있다 는 것이다.

 대부분의 리눅스 배포판에는 mutt 패키지가 등록되어 있을 것이므로, 패키지 매니저를 통해 설치하면 된다:

sudo dnf install mutt
sudo dnf install w3m	# 이건 text/html 렌더링에 필요한 패키지이다.
						# `w3m` 을 설명하려면 또 한세월이 걸리므로
                        # 자세한 설명은 생략하겠다.

2. Mutt 설정 파일 구성

 필자는 Mutt 의 단축키 설정을 완전히 입맛에 맞게 싹 뜯어 고쳤기 때문에 이를 기준으로 소개하려 한다. 단축키는 vim 과 최대한 비슷하게 구성했기 이미 vim 사용에 익숙하다면 쉽게 쓸 수 있을 것이다. 이메일 서버는 gmail 을 쓸 것이다.

- muttrc

################### IMAP ###################
set imap_user = "<email address>"
set imap_pass = "<password>"

set imap_check_subscribed

set spoolfile = "imaps://imap.gmail.com/INBOX"
set folder = "imaps://imap.gmail.com/"
set mbox = "imaps://imap.gmail.com/All Mail"
set record = "imaps://imap.gmail.com/Sent"
set postponed = "imaps://imap.gmail.com/Drafts"
set trash = "imaps://imap.gmail.com/[Gmail]/Trash"

set header_cache = "~/.mutt/cache/headers"
set message_cachedir = "~/.mutt/cache/bodies"
set certificate_file = "~/.mutt/certificates"

################### SMTP ###################
set smtp_url = "smtp://<username>@smtp.gmail.com:587/"
set smtp_pass = $imap_pass
set ssl_force_tls

################### OTHR ###################
set editor = "lvim"
set edit_headers = yes
set charset = UTF-8

set realname = "<user-name>"
set from = $imap_user
set use_from = yes

set sort = threads
set sort_browser = date
set sort_aux = reverse-date-received

set move = no
set help = no

set mailcap_path = ~/.mutt/mailcap

source ~/.mutt/solarized-dark-16.muttrc
source ~/.mutt/patch-highlighting.muttrc
# from https://github.com/jessfraz/dockerfiles/tree/master/mutt/.mutt

################### REND ###################
alternative_order text/plain text/hmtl

auto_view text/html
auto_view text/x-patch
auto_view text/x-diff

################### KEYS ###################
bind index                              g               first-entry
bind index                              G               last-entry
bind index                              \Cd             next-page
bind index                              \Cu             previous-page

bind index,pager                E               sidebar-toggle-visible
bind index                              J               sidebar-next
bind index                              K               sidebar-prev
bind index                              O               sidebar-open

bind pager                              g               top
bind pager                              G               bottom
bind pager                              j               next-line
bind pager                              k               previous-line
bind pager                              \Cd             next-page
bind pager                              \Cu             previous-page

macro index                             ,s              "| git am -s\n" "git am single patch"

홈 디렉토리에 .muttrc 라는 파일을 생성한 뒤, 위 내용을 복사 & 붙여넣기 하면 된다. 여기에서 필자가 <>(꺽쇠 괄호) 친 항목은 직접 입력해야 한다.

* 로그인에 실패한다면?

 여기에서 imap_pass 는 일반적으로 구글 로그인 비밀번호인데, 만약 Two-Factor authentication 을 사용하고 있다면 앱 비밀번호 를 만들어서 그걸 사용해야 한다:

https://myaccount.google.com/apppasswords

 해당 링크로 들어가서 앱 이름을 입력하면 비밀번호 코드를 발급해주는데 이를 imap_pass 로 사용하면 된다.

- mailcap

mailcapauto_view 의 렌더링 방식을 결정하는데, 전술한 text/html 렌더링 방식을 의미한다. 이메일 컨텐츠 내에 html 이 포함되어 있다면 w3m 이 간략하게 요약해서 렌더링해준다.

text/html; w3m -I %{charset} -T text/html; copiousoutput;

~/.mutt/mailcap 에 파일을 생성하고 위 내용을 붙여넣으면 된다.

- theme

 마지막은 Mutt 테마인데 기본 테마색이 마음에 안 들어서 마음에 드는 걸로 하나 물어왔다:

* solarized-dark-16.muttrc

# vim: filetype=muttrc

# highlight my name and other personally relevant strings
color body          yellow          default         "(mythos|Moon Yeounsu|Cruzer-S|yyyynoom)"
# custom index highlights ----------------------------------------------
# messages which mention my name in the body
color index         yellow          default         "~b \"mythos|Moon Yeounsu|Cruzer-S|yyyynoom\" !~N !~T !~F !~p !~P"
## messages which are in reference to my mails
color index         brightmagenta        default         "~x \"yyyynoom@gmail\.com\" !~N !~T !~F !~p !~P"

# for background in 16 color terminal, valid background colors include:
# base03, bg, black, any of the non brights

# basic colors ---------------------------------------------------------
color normal        brightyellow    default
color error         red             default
color tilde         black           default
color message       cyan            default
color markers       red             white
color attachment    white           default
color search        brightmagenta   default
color status        brightyellow    black
color indicator     brightblack     yellow
color tree          yellow          default                                     # arrow in threads

# basic monocolor screen
mono  bold          bold
mono  underline     underline
mono  indicator     reverse
mono  error         bold

# index ----------------------------------------------------------------
color index         red             default         "~A"                        # all messages
color index         brightred       default         "~E"                        # expired messages
color index         blue            default         "~N"                        # new messages
color index         blue            default         "~O"                        # old messages
color index         brightmagenta   default         "~Q"                        # messages that have been replied to
color index         brightgreen     default         "~R"                        # read messages
color index         blue            default         "~U"                        # unread messages
color index         blue            default         "~U~$"                      # unread, unreferenced messages
color index         brightyellow    default         "~v"                        # messages part of a collapsed thread
color index         brightyellow    default         "~P"                        # messages from me
color index         cyan            default         "~p!~F"                     # messages to me
color index         cyan            default         "~N~p!~F"                   # new messages to me
color index         cyan            default         "~U~p!~F"                   # unread messages to me
color index         brightgreen     default         "~R~p!~F"                   # messages to me
color index         red             default         "~F"                        # flagged messages
color index         red             default         "~F~p"                      # flagged messages to me
color index         red             default         "~N~F"                      # new flagged messages
color index         red             default         "~N~F~p"                    # new flagged messages to me
color index         red             default         "~U~F~p"                    # new flagged messages to me
color index         black           red             "~D"                        # deleted messages
color index         brightcyan      default         "~v~(!~N)"                  # collapsed thread with no unread
color index         yellow          default         "~v~(~N)"                   # collapsed thread with some unread
color index         green           default         "~N~v~(~N)"                 # collapsed thread with unread parent

# statusbg used to indicated flagged when foreground color shows other status
# for collapsed thread
color index         red             black           "~v~(~F)!~N"                # collapsed thread with flagged, no unread
color index         yellow          black           "~v~(~F~N)"                 # collapsed thread with some unread & flagged
color index         green           black           "~N~v~(~F~N)"               # collapsed thread with unread parent & flagged
color index         green           black           "~N~v~(~F)"                 # collapsed thread with unread parent, no unread inside, but some flagged
color index         cyan            black           "~v~(~p)"                   # collapsed thread with unread parent, no unread inside, some to me directly
color index         yellow          red             "~v~(~D)"                   # thread with deleted (doesn't differentiate between all or partial)

# message headers ------------------------------------------------------
color hdrdefault    brightgreen     default
color header        brightyellow    default         "^(From)"
color header        blue            default         "^(Subject)"

# body -----------------------------------------------------------------
color quoted        blue            default
color quoted1       cyan            default
color quoted2       yellow          default
color quoted3       red             default
color quoted4       brightred       default

color signature     brightgreen     default
color bold          black           default
color underline     black           default
color normal        default         default
#
color body          brightcyan      default         "[;:][-o][)/(|]"    # emoticons
color body          brightcyan      default         "[;:][)(|]"         # emoticons
color body          brightcyan      default         "[*]?((N)?ACK|CU|LOL|SCNR|BRB|BTW|CWYL|\
                                                     |FWIW|vbg|GD&R|HTH|HTHBE|IMHO|IMNSHO|\
                                                     |IRL|RTFM|ROTFL|ROFL|YMMV)[*]?"
color body          brightcyan      default         "[ ][*][^*]*[*][ ]?" # more emoticon?
color body          brightcyan      default         "[ ]?[*][^*]*[*][ ]" # more emoticon?

## pgp
color body          red             default         "(BAD signature)"
color body          cyan            default         "(Good signature)"
color body          brightblack     default         "^gpg: Good signature .*"
color body          brightyellow    default         "^gpg: "
color body          brightyellow    red             "^gpg: BAD signature from.*"
mono  body          bold                            "^gpg: Good signature"
mono  body          bold                            "^gpg: BAD signature from.*"

# yes, an insance URL regex
mono  body          underline                       "([a-z][a-z0-9+-]*://(((([a-z0-9_.!~*'();:&=+$,-]|%[0-9a-f][0-9a-f])*@)?((([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?|[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)(:[0-9]+)?)|([a-z0-9_.!~*'()$,;:@&=+-]|%[0-9a-f][0-9a-f])+)(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*(/([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*(;([a-z0-9_.!~*'():@&=+$,-]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?(#([a-z0-9_.!~*'();/?:@&=+$,-]|%[0-9a-f][0-9a-f])*)?|(www|ftp)\\.(([a-z0-9]([a-z0-9-]*[a-z0-9])?)\\.)*([a-z]([a-z0-9-]*[a-z0-9])?)\\.?(:[0-9]+)?(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*(/([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*(;([-a-z0-9_.!~*'():@&=+$,]|%[0-9a-f][0-9a-f])*)*)*)?(\\?([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?(#([-a-z0-9_.!~*'();/?:@&=+$,]|%[0-9a-f][0-9a-f])*)?)[^].,:;!)? \t\r\n<>\"]"
# and a heavy handed email regex
color body          brightmagenta   default         "((@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]),)*@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\.[0-9]?[0-9]?[0-9]\\]):)?[0-9a-z_.+%$-]+@(([0-9a-z-]+\\.)*[0-9a-z-]+\\.?|#[0-9]+|\\[[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\.[0-2]?[0-9]?[0-9]\\])"

# Various smilies and the like
color body          brightwhite     default         "<[Gg]>"                            # <g>
color body          brightwhite     default         "<[Bb][Gg]>"                        # <bg>
color body          yellow          default         " [;:]-*[})>{(<|]"                  # :-) etc...
# *bold*
color body          blue            default         "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)"
mono  body          bold                            "(^|[[:space:][:punct:]])\\*[^*]+\\*([[:space:][:punct:]]|$)"
# _underline_
color body          blue            default         "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)"
mono  body          underline                       "(^|[[:space:][:punct:]])_[^_]+_([[:space:][:punct:]]|$)"
# /italic/  (Sometimes gets directory names)
color body         blue            default         "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)"
mono body          underline                       "(^|[[:space:][:punct:]])/[^/]+/([[:space:][:punct:]]|$)"

이 파일은 jessfraz 라는 분이 만든 파일을 긁어서 가져온 것이다. 필요에 맞게 일부 수정했는데 맨 위에 줄만 본인의 이름으로 바꿔서 쓰면 된다. 안 바꾸고 그냥 써도 문제는 없다. (출처는 아래에 적어 두었다.)

* patch-highlighting.muttrc

# Patch syntax highlighting
color   body    brightwhite     default         ^[[:space:]].*
color   body    yellow          default         ^(diff).*
color   body    brightwhite     default         ^(\s).*
color   body    cyan            default         ^(Signed-off-by).*
color   body    cyan            default         ^(Docker-DCO-1.1-Signed-off-by).*
color   body    brightwhite     default         ^(Cc)
color   body    yellow          default         "^diff \-.*"
color   body    brightwhite     default         "^index [a-f0-9].*"
color   body    brightblue      default         "^---$"
color   body    white           default         "^\-\-\- .*"
color   body    white           default         "^[\+]{3} .*"
color   body    green           default         "^[\+][^\+]+.*"
color   body    red             default         "^\-[^\-]+.*"
color   body    brightblue      default         "^@@ .*"
color   body    green           default         "LGTM"
color   body    brightmagenta   default         "-- Commit Summary --"
color   body    brightmagenta   default         "-- File Changes --"
color   body    brightmagenta   default         "-- Patch Links --"
color   body    green           default         "^Merged #.*"
color   body    red             default         "^Closed #.*"
color   body    brightblue      default         "^Reply to this email.*"

 이건 패치 메일에 대한 하이라이팅인데 리눅스 커널 등의 패치 메일을 작성할 일이 없다면 이 파일은 추가할 필요가 없다. 사용하지 않는다면 .muttrcsource 구문도 같이 지워주면 된다.

3. Mutt 단축키

mutt 명령을 입력해서 이렇게 나왔다면 정상이다. 현재 전달받은 메일이 없다면 이렇게 텅텅 비어서 나온다. 일단 나가는 방법부터 말하자면 q (quit) 이다.

- mailbox 열기

mailbox 와 관련된 모든 명령은 Shift 를 누른 상태로 이뤄진다. (쉽게 말해서 다 대문자다) 우선 mailbox 를 탐색(Explore) 하는 명령은 Shift + e, 그러니까 대문자 E 를 입력하면 된다. 한번 더 입력하면 닫힌다. (현재 선택된 mailboxINBOX 이다.)

mailbox 를 변경하는 방법은 vim 과 마찬가지로 jk 이다. (위, 아래 방향키) 다만 Shift 를 눌러야 된다. 결국 대문자 J 와 대문자 Kmailbox 를 선택하는 키이다. 현재 열려있는 mailboxINBOX 이고 선택된 (밑줄이 그어진) mailboxnetdev/archive 이다.

선택한 mailbox 를 여는 것(open)은 Shift + o 이다. (대문자 O) 이 정도면 어렵지 않게 쓸 수 있으리라 생각된다.

- mail 탐색하기

mailbox 안의 mail 을 둘러보는 명령은 vim 과 완전히 동일하다. jk 를 입력해 다음과 이전 메일을 선택할 수 있고, Ctrl + d, u 로 스크롤 하며, gG 로 처음과 끝 메일로 이동할 수 있다.

 선택한 메일을 읽는 방법은 그냥 enter 를 입력하면 된다.

- page 둘러보기

page 를 넘겨 보는 방법은 동일하게 jk (한 줄 넘기기), Ctrl + d, u (스크롤 하기), gG (컨텐츠의 맨 위와 아래로 이동하기) 이다. 페이지에서 나가는 방법은 q 이다.

 현재 보고 있는 메일의 다음 혹은 이전 메일 (쓰레드 혹은 답장일 수 있다) 로 넘어가는 방법은 Shift + j, k 이다. 다른 말로 하면 page 를 보고 있는 중에는 mailbox 조작이 불가능하다. 하지만 page 를 보는 중에 mailbox 탐색은 할 일이 드물기 때문에 이렇게 두었다.

- 메일 보내기

 메일을 보내는 방법은 m 이다. m 을 입력하면 맨 아래에 To: 가 생기면서 답장할 대상을 입력할 수 있게 된다. 여기에선 예시로 본인한테 메일을 보내보려 한다. 보낼 대상을 입력하고 나면 Subject: 를 입력할 수 있게 되는데 이게 메일의 제목이 된다.

필자는 간단하게 이렇게 보내보려 한다. 작성을 완료했다면 :wq 로 나가면 된다.

 여기서 작성한 메일에 대한 최종 결과를 간략하게 볼 수 있다. 이대로 보내길 원한다면 y (yes) 를 입력하면 되고, 수정을 원한다면 e (edit), 보내길 취소하고 싶다면 q (quit).

 메일이 성공적으로 INBOX 에 들어온 것을 볼 수 있다.

 그 외 메일 삭제 (delete) 는 d , 삭제한 결과를 실제 메일 서버에 동기화(sync)하는 단축키는 $ (S 같이 생기지 않았는가?), 선택한 메일에 답장(reply) 은 r 이다. 그 밖에 여러가지 단축키가 있지만 주로 쓰는 것들만 얘기했고 필요하다면 ? 를 입력해서 확인하길 바란다.

4. 패치 메일 적용하기

 마지막으로 리눅스 메일링 리스트의 패치를 적용하는 방법인데 이는 유형곤 님의 블로그에서 자료를 찾았다:

 적용하고자 하는 patch mail 로 커서를 가져간 뒤 ,s 를 입력하는 것으로, 현재 작업 디렉토리의 git 에 패치를 등록할 수 있다.

이렇게 Applying ... 이 나오면 성공이다.

이렇게 패치가 적용된 것을 확인할 수 있다.

출처

[사이트] http://www.mutt.org/
[사이트] https://hyeyoo.com/106
[사이트] https://github.com/jessfraz/dockerfiles/tree/master/mutt/.mutt
[사이트] https://mritunjaysharma394.medium.com/how-to-set-up-mutt-text-based-mail-client-with-gmail-993ae40b0003
[사이트] https://wiki.archlinux.org/title/Mutt

profile
2000.11.30

0개의 댓글