Move mail configs

This commit is contained in:
2022-12-18 12:07:29 +01:00
parent 2fd7dbb851
commit 819a23b52e
5 changed files with 264 additions and 0 deletions

401
home/mail/aerc/aerc.conf Normal file
View File

@ -0,0 +1,401 @@
#
# aerc main configuration
[general]
#
# Used as a default path for save operations if no other path is specified.
# ~ is expanded to the current user home dir.
#
# Default: ""
#default-save-path=~/tmp
#
# If set to "gpg", aerc will use system gpg binary and keystore for all crypto
# operations. Otherwise, the internal openpgp implementation will be used.
#
# Default: internal
pgp-provider=gpg
# By default, the file permissions of accounts.conf must be restrictive and
# only allow reading by the file owner (0600). Set this option to true to
# ignore this permission check. Use this with care as it may expose your
# credentials.
#
# Default: false
unsafe-accounts-conf=true
[ui]
#
# Describes the format for each row in a mailbox view. This field is compatible
# with mutt's printf-like syntax.
#
# Default: %-20.20D %-17.17n %Z %s
index-format=%-20.20D %-17.17n %Z %s
#
# See time.Time#Format at https://godoc.org/time#Time.Format
#
# Default: 2006-01-02 03:04 PM (ISO 8601 + 12 hour time)
timestamp-format=2006-01-02 03:04 PM
#
# Index-only time format for messages that were received/sent today.
# If this is not specified, timestamp-format is used instead.
#
# Default: ""
#this-day-time-format=03:04 PM
#
# Index-only time format for messages that were received/sent within the last
# 7 days. If this is not specified, timestamp-format is used instead.
#
# Default: ""
#this-week-time-format=Monday 03:04 PM
#
# Index-only time format for messages that were received/sent this year.
# If this is not specified, timestamp-format is used instead.
#
# Default: ""
#this-year-time-format=January 02
#
# Width of the sidebar, including the border.
#
# Default: 20
sidebar-width=20
#
# Message to display when viewing an empty folder.
#
# Default: (no messages)
empty-message=(no messages)
# Message to display when no folders exists or are all filtered
#
# Default: (no folders)
empty-dirlist=(no folders)
# Enable mouse events in the ui, e.g. clicking and scrolling with the mousewheel
#
# Default: false
mouse-enabled=false
#
# Ring the bell when new messages are received
#
# Default: true
new-message-bell=true
# Marker to show before a pinned tab's name.
#
# Default: `
pinned-tab-marker='`'
# Describes the format string to use for the directory list
#
# Default: %n %>r
dirlist-format=%n %>r
# Delay after which the messages are actually listed when entering a directory.
# This avoids loading messages when skipping over folders and makes the UI more
# responsive. If you do not want that, set it to 0s.
#
# Default: 200ms
dirlist-delay=200ms
# Display the directory list as a foldable tree that allows to collapse and
# expand the folders.
#
# Default: false
dirlist-tree=false
# If dirlist-tree is enabled, set level at which folders are collapsed by
# default. Set to 0 to disable.
#
# Default: 0
dirlist-collapse=0
# List of space-separated criteria to sort the messages by, see *sort*
# command in *aerc*(1) for reference. Prefixing a criterion with "-r "
# reverses that criterion.
#
# Example: "from -r date"
#
# Default: ""
sort=
# Moves to next message when the current message is deleted
#
# Default: true
next-message-on-delete=true
# Automatically set the "seen" flag when a message is opened in the message
# viewer.
#
# Default: true
auto-mark-read=true
# The directories where the stylesets are stored. It takes a colon-separated
# list of directories. If this is unset or if a styleset cannot be found, the
# following paths will be used as a fallback in that order:
#
# ${XDG_CONFIG_HOME:-~/.config}/aerc/stylesets
# ${XDG_DATA_HOME:-~/.local/share}/aerc/stylesets
# /nix/store/gjg6gkw6fgxr97ld54wlz017njdkl7x1-aerc-0.13.0/share/aerc/stylesets
#
# default: ""
stylesets-dirs=
# Uncomment to use box-drawing characters for vertical and horizontal borders.
#
# Default: spaces
# border-char-vertical=│
# border-char-horizontal=─
# Sets the styleset to use for the aerc ui elements.
#
# Default: default
styleset-name=default
# Activates fuzzy search in commands and their arguments: the typed string is
# searched in the command or option in any position, and need not be
# consecutive characters in the command or option.
#fuzzy-complete=false
# How long to wait after the last input before auto-completion is triggered.
#
# Default: 250ms
completion-delay=250ms
#
# Global switch for completion popovers
#
# Default: true
completion-popovers=true
# Uncomment to use UTF-8 symbols to indicate PGP status of messages
#
# Default: ASCII
#icon-unencrypted=
#icon-encrypted=✔
#icon-signed=✔
#icon-signed-encrypted=✔
#icon-unknown=✘
#icon-invalid=⚠
#[ui:account=foo]
#
# Enable a threaded view of messages. If this is not supported by the backend
# (IMAP server or notmuch), threads will be built by the client.
#
# Default: false
#threading-enabled=false
# Force client-side thread building
#
# Default: false
#force-client-threads=false
# Debounce client-side thread building
#
# Default: 50ms
#client-threads-delay=50ms
[statusline]
# Describes the format string for the statusline.
#
# Default: [%a] %S %>%T
render-format=[%a] %S %>%T
# Specifies the separator between grouped statusline elements.
#
# Default: " | "
# separator=
# Defines the mode for displaying the status elements.
# Options: text, icon
#
# Default: text
# display-mode=
[viewer]
#
# Specifies the pager to use when displaying emails. Note that some filters
# may add ANSI codes to add color to rendered emails, so you may want to use a
# pager which supports ANSI codes.
#
# Default: less -R
pager=less -R
#
# If an email offers several versions (multipart), you can configure which
# mimetype to prefer. For example, this can be used to prefer plaintext over
# html emails.
#
# Default: text/plain,text/html
alternatives=text/plain,text/html
#
# Default setting to determine whether to show full headers or only parsed
# ones in message viewer.
#
# Default: false
show-headers=false
#
# Layout of headers when viewing a message. To display multiple headers in the
# same row, separate them with a pipe, e.g. "From|To". Rows will be hidden if
# none of their specified headers are present in the message.
#
# Default: From|To,Cc|Bcc,Date,Subject
header-layout=From|To,Cc|Bcc,Date,Subject
# Whether to always show the mimetype of an email, even when it is just a single part
#
# Default: false
always-show-mime=false
# Parses and extracts http links when viewing a message. Links can then be
# accessed with the open-link command.
#
# Default: true
parse-http-links=true
[compose]
#
# Specifies the command to run the editor with. It will be shown in an embedded
# terminal, though it may also launch a graphical window if the environment
# supports it. Defaults to $EDITOR, or vi.
editor=
#
# Default header fields to display when composing a message. To display
# multiple headers in the same row, separate them with a pipe, e.g. "To|From".
#
# Default: To|From,Subject
header-layout=To|From,Subject
#
# Specifies the command to be used to tab-complete email addresses. Any
# occurrence of "%s" in the address-book-cmd will be replaced with what the
# user has typed so far.
#
# The command must output the completions to standard output, one completion
# per line. Each line must be tab-delimited, with an email address occurring as
# the first field. Only the email address field is required. The second field,
# if present, will be treated as the contact name. Additional fields are
# ignored.
#
# This parameter can also be set per account in accounts.conf.
address-book-cmd=
#
# Allow to address yourself when replying
#
# Default: true
reply-to-self=true
#
# Warn before sending an email that matches the specified regexp but does not
# have any attachments. Leave empty to disable this feature.
#
# Uses Go's regexp syntax, documented at https://golang.org/s/re2syntax. The
# "(?im)" flags are set by default (case-insensitive and multi-line).
#
# Example:
# no-attachment-warning=^[^>]*attach(ed|ment)
#
no-attachment-warning=
[filters]
#
# Filters allow you to pipe an email body through a shell command to render
# certain emails differently, e.g. highlighting them with ANSI escape codes.
#
# The commands are invoked with sh -c. The following folders are appended to
# the system $PATH to allow referencing filters from their name only:
#
# ${XDG_CONFIG_HOME:-~/.config}/aerc/filters
# ${XDG_DATA_HOME:-~/.local/share}/aerc/filters
# $PREFIX/share/aerc/filters
# /usr/share/aerc/filters
#
# The following variables are defined in the filter command environment:
#
# AERC_MIME_TYPE the part MIME type/subtype
# AERC_FILENAME the attachment filename (if any)
#
# The first filter which matches the email's mimetype will be used, so order
# them from most to least specific.
#
# You can also match on non-mimetypes, by prefixing with the header to match
# against (non-case-sensitive) and a comma, e.g. subject,text will match a
# subject which contains "text". Use header,~regex to match against a regex.
#
text/plain=colorize
text/calendar=calendar
message/delivery-status=colorize
message/rfc822=colorize
#text/html=pandoc -f html -t plain | colorize
#text/html=html | colorize
#text/*=bat -fP --file-name="$AERC_FILENAME"
#application/x-sh=bat -fP -l sh
#image/*=catimg -w $(tput cols) -
#subject,~Git(hub|lab)=lolcat -f
#from,thatguywhodoesnothardwraphismessages=fmt -w 72 | colorize
[openers]
#
# Openers allow you to specify the command to use for the :open action on a
# per-MIME-type basis.
#
# {} is expanded as the temporary filename to be opened. If it is not
# encountered in the command, the temporary filename will be appened to the end
# of the command.
#
# Examples:
# text/html=surf -dfgms
# text/plain=gvim {} +125
# message/rfc822=thunderbird
[triggers]
#
# Triggers specify commands to execute when certain events occur.
#
# Example:
# new-email=exec notify-send "New email from %n" "%s"
#
# Executed when a new email arrives in the selected folder
new-email=
[templates]
# Templates are used to populate email bodies automatically.
#
# The directories where the templates are stored. It takes a colon-separated
# list of directories. If this is unset or if a template cannot be found, the
# following paths will be used as a fallback in that order:
#
# ${XDG_CONFIG_HOME:-~/.config}/aerc/templates
# ${XDG_DATA_HOME:-~/.local/share}/aerc/templates
# /nix/store/gjg6gkw6fgxr97ld54wlz017njdkl7x1-aerc-0.13.0/share/aerc/templates
#
# default: ""
template-dirs=
# The default template to be used for new messages.
#
# default: new_message
new-message=new_message
# The default template to be used for quoted replies.
#
# default: quoted_reply
quoted-reply=quoted_reply
# The default template to be used for forward as body.
#
# default: forward_as_body
forwards=forward_as_body

127
home/mail/aerc/binds.conf Normal file
View File

@ -0,0 +1,127 @@
# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>
? = :help keys<Enter>
[messages]
q = :quit<Enter>
j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next 100%<Enter>
k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev 100%<Enter>
<PgUp> = :prev 100%<Enter>
g = :select 0<Enter>
G = :select -1<Enter>
J = :next-folder<Enter>
K = :prev-folder<Enter>
H = :collapse-folder<Enter>
L = :expand-folder<Enter>
v = :mark -t<Enter>
V = :mark -v<Enter>
T = :toggle-threads<Enter>
<Enter> = :view<Enter>
d = :prompt 'Really delete this message?' 'delete-message'<Enter>
D = :delete<Enter>
A = :archive flat<Enter>
C = :compose<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>
/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>
<Esc> = :clear<Enter>
[messages:folder=Drafts]
<Enter> = :recall<Enter>
[view]
/ = :toggle-key-passthrough<Enter>/
q = :close<Enter>
O = :open<Enter>
S = :save<space>
| = :pipe<space>
D = :delete<Enter>
A = :archive flat<Enter>
<C-l> = :open-link <space>
f = :forward<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
H = :toggle-headers<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>
[view::passthrough]
$noinherit = true
$ex = <C-x>
<Esc> = :toggle-key-passthrough<Enter>
[compose]
# Keybindings used when the embedded terminal is not selected in the compose
# view
$noinherit = true
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<A-p> = :switch-account -p<Enter>
<A-n> = :switch-account -n<Enter>
<tab> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
p = :postpone<Enter>
q = :choose -o d discard abort -o p postpone postpone<Enter>
e = :edit<Enter>
a = :attach<space>
d = :detach<space>
[terminal]
$noinherit = true
$ex = <C-x>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>

264
home/mail/default.nix Normal file
View File

@ -0,0 +1,264 @@
{ pkgs, ... }:
let
mailBaseConfig = {
configName,
address,
userName ? address,
host,
displayName,
extraMailboxes ? [],
enableDefaultMailboxes ? true,
neomuttExtraConfig ? "",
} : let
defaultMailboxes = if enableDefaultMailboxes then
/* `tree ~/Maildir/vbrandl/ -l -d -I "Archive|cur|new|tmp|certs|.notmuch" -afin --noreport | awk '{if(NR>1)print}' | tr '\n' ' '` */
[ "Drafts" "Junk" "Sent" "Trash" ]
else
[];
mailboxes = defaultMailboxes ++ extraMailboxes;
in {
address = address;
userName = userName;
realName = displayName;
imap.host = host;
smtp.host = host;
passwordCommand = "${pkgs.libsecret}/bin/secret-tool lookup email ${address}";
signature = {
text = displayName;
showSignature = "append";
};
aerc = {
enable = true;
extraAccounts = {
pgp-opportunistic-encrypt = true;
pgp-autosign = true;
};
};
imapnotify = {
enable = true;
/* TODO: which boxes? */
boxes = [ "Inbox" ];
onNotify = "${pkgs.isync}/bin/mbsync ${configName} && ${pkgs.libnotify}/bin/notify-send -a mail '${configName}: new in %s'";
/* onNotifyPost = { */
/* mail = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: new in %s'"; */
/* /1* update = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: update %s'"; *1/ */
/* /1* expunge = "${pkgs.libnotify}/bin/notify-send -a mail '${configName}: expunge %s'"; *1/ */
/* }; */
};
mbsync = {
enable = true;
/* sync changes to maildir in both directions */
create = "both";
expunge = "both";
remove = "both";
};
msmtp.enable = true;
neomutt = {
enable = true;
extraMailboxes = mailboxes;
extraConfig = ''
# use encrypted headers
set crypt_protected_headers_write = yes
'' + neomuttExtraConfig;
};
notmuch.enable = true;
};
in {
home.packages = with pkgs; [
libsecret
libnotify
urlview
];
home.file.mailcap = {
target = ".mailcap";
source = ./mailcap;
};
programs.password-store.enable = true;
programs.aerc = {
enable = true;
extraConfig = builtins.readFile ./aerc/aerc.conf;
/* { */
/* general = { */
/* unsafe-accounts-conf = true; */
/* }; */
/* }; */
extraBinds = builtins.readFile ./aerc/binds.conf;
};
services.mbsync.enable = true;
programs.mbsync.enable = true;
services.imapnotify.enable = true;
programs.notmuch = {
enable = true;
hooks.preNew = "mbsync --all";
};
programs.neomutt = {
enable = true;
sidebar.enable = true;
extraConfig = builtins.readFile ./neomutt/neomuttrc;
/* vimKeys = true; */
macros = [
{ map = [ "pager" "index" ];
key = "B";
action = "|urlview\\n";
}
];
binds = [
/* sidebar */
{ map = [ "attach" "browser" "index" ];
key = "J";
action = "sidebar-next";
}
{ map = [ "attach" "browser" "index" ];
key = "K";
action = "sidebar-prev";
}
{ map = [ "attach" "browser" "index" ];
key = "O";
action = "sidebar-open";
}
/* moving around */
{ map = [ "attach" "browser" "index" ];
key = "j";
action = "next-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "k";
action = "previous-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "g";
action = "noop";
}
{ map = [ "attach" "browser" "index" ];
key = "gg";
action = "first-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "G";
action = "last-entry";
}
{ map = [ "attach" "browser" "index" ];
key = "n";
action = "next-unread";
}
{ map = [ "pager" ];
key = "g";
action = "noop";
}
{ map = [ "pager" ];
key = "gg";
action = "top";
}
{ map = [ "pager" ];
key = "G";
action = "bottom";
}
{ map = [ "pager" ];
key = "k";
action = "previous-line";
}
{ map = [ "pager" ];
key = "j";
action = "next-line";
}
/* deletion */
{ map = [ "pager" "index" ];
key = "d";
action = "noop";
}
{ map = [ "pager" "index" ];
key = "dd";
action = "delete-message";
}
/* TODO: mark as new? */
{ map = [ "browser" "pager" "index" ];
key = "U";
action = "toggle-new";
}
{ map = [ "browser" "pager" "index" ];
key = "n";
action = "search-next";
}
{ map = [ "browser" "pager" "index" ];
key = "N";
action = "search-opposite";
}
/* threads */
{ map = [ "pager" "index" ];
key = "dT";
action = "delete-thread";
}
{ map = [ "pager" "index" ];
key = "dt";
action = "delete-subthread";
}
{ map = [ "pager" "index" ];
key = "gt";
action = "next-thread";
}
{ map = [ "pager" "index" ];
key = "gT";
action = "previous-thread";
}
{ map = [ "index" ];
key = "za";
action = "collapse-thread";
}
{ map = [ "index" ];
key = "zA";
action = "collapse-all";
}
];
};
programs.msmtp.enable = true;
accounts.email.accounts = let
aliases = "mail(\\+.*)?@vbrandl.net";
in {
vbrandl = (
mailBaseConfig {
configName = "vbrandl";
address = "mail@vbrandl.net";
host = "mail.vbrandl.net";
displayName = "Valentin Brandl";
extraMailboxes = [ "Archive" ];
/* #set use_from = yes */
/* #set envelope_from = true */
neomuttExtraConfig = ''
# TODO: reply with tagged mail
set reverse_name = yes
alternates '${aliases}'
'';
}) // {
primary = true;
aliases = [ aliases ];
gpg = {
encryptByDefault = true;
signByDefault = true;
key = "1FFE431282F4B8CC0A7579167FB009175885FC76";
};
};
riseup = (
mailBaseConfig {
configName = "riseup";
address = "vbrandl@riseup.net";
host = "mail.riseup.net";
displayName = "Valentin Brandl";
extraMailboxes = [ "SKS-devel" ];
}) // {
userName = "vbrandl";
gpg = {
encryptByDefault = true;
signByDefault = true;
key = "1FFE431282F4B8CC0A7579167FB009175885FC76";
};
};
};
}

3
home/mail/mailcap Normal file
View File

@ -0,0 +1,3 @@
text/html; w3m -I %{charset} -T text/html; copiousoutput;
image/*; feh %s;
application/pdf; zathura %s;

View File

@ -0,0 +1,59 @@
# edit mail headers when composing
set edit_headers
# check mailbox stats periodically
set mail_check_stats = yes
# don't indicate line wraps
set markers = no
# reply with tagged email
# unset envelope_from_address
# set use_envelope_from
# prefer plaintext over html
alternative_order text/enriched text/plain text/html text
# colors
###############################################################################
# Dracula Theme for Mutt: https://draculatheme.com/
#
# @author Paul Townsend <paul@caprica.org>
# general ------------ foreground ---- background -----------------------------
color error color231 color212
color indicator color231 color241
color markers color210 default
color message default default
color normal default default
color prompt default default
color search color84 default
color status color141 color236
color tilde color231 default
color tree color141 default
# message index ------ foreground ---- background -----------------------------
color index color84 default ~F # flagged messages
color index color117 default ~N|~O # new messages
color index color210 default ~D # deleted messages
color index color212 default ~Q # messages which have been replied to
color index color215 default ~T # tagged messages
color index color141 default ~v # messages part of a collapsed thread
# message headers ---- foreground ---- background -----------------------------
color hdrdefault color117 default
color header color231 default ^Subject:.*
# message body ------- foreground ---- background -----------------------------
color attachment color228 default
color body color231 default [\-\.+_a-zA-Z0-9]+@[\-\.a-zA-Z0-9]+ # email addresses
color body color228 default (https?|ftp)://[\-\.,/%~_:?&=\#a-zA-Z0-9]+ # URLs
color body color231 default (^|[[:space:]])\\*[^[:space:]]+\\*([[:space:]]|$) # *bold* text
color body color231 default (^|[[:space:]])_[^[:space:]]+_([[:space:]]|$) # _underlined_ text
color body color231 default (^|[[:space:]])/[^[:space:]]+/([[:space:]]|$) # /italic/ text
color quoted color61 default
color quoted1 color117 default
color quoted2 color84 default
color quoted3 color215 default
color quoted4 color212 default
color signature color212 default