| @@ -10,6 +10,7 @@ accdir="${XDG_CONFIG_HOME:-$HOME/.config}/mutt/accounts" | |||||
| msmtprc="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/config" | msmtprc="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/config" | ||||
| msmtplog="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/msmtp.log" | msmtplog="${XDG_CONFIG_HOME:-$HOME/.config}/msmtp/msmtp.log" | ||||
| mbsyncrc="${MBSYNCRC:-$HOME/.mbsyncrc}" | mbsyncrc="${MBSYNCRC:-$HOME/.mbsyncrc}" | ||||
| mpoprc="${XDG_CONFIG_HOME:-$HOME/.config}/mpop/config" | |||||
| alias mbsync='mbsync -c "$mbsyncrc"' | alias mbsync='mbsync -c "$mbsyncrc"' | ||||
| for x in "/etc/ssl/certs/ca-certificates.crt" "/etc/pki/tls/certs/ca-bundle.crt" "/etc/ssl/ca-bundle.pem" "/etc/pki/tls/cacert.pem" "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem" "/etc/ssl/cert.pem" "/usr/local/share/ca-certificates/"; do | for x in "/etc/ssl/certs/ca-certificates.crt" "/etc/pki/tls/certs/ca-bundle.crt" "/etc/ssl/ca-bundle.pem" "/etc/pki/tls/cacert.pem" "/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem" "/etc/ssl/cert.pem" "/usr/local/share/ca-certificates/"; do | ||||
| @@ -28,27 +29,23 @@ getaccounts() { accounts="$(find -L "$accdir" -type f 2>/dev/null | grep -o "[0- | |||||
| list() { getaccounts && [ -n "$accounts" ] && echo "$accounts" ;} | list() { getaccounts && [ -n "$accounts" ] && echo "$accounts" ;} | ||||
| getprofiles() { \ | |||||
| unset msmtp_header msmtp_profile mutt_profile mbsync_profile | |||||
| case "$iport" in | |||||
| 1143) imapssl=None ;; | |||||
| 143) imapssl=STARTTLS ;; | |||||
| esac | |||||
| msmtp_header="defaults | |||||
| auth on | |||||
| tls on | |||||
| tls_trust_file $sslcert | |||||
| logfile $msmtplog | |||||
| " | |||||
| msmtp_profile="account $fulladdr | |||||
| prepmsmtp() { echo "account $fulladdr | |||||
| host $smtp | host $smtp | ||||
| port ${sport:-587} | port ${sport:-587} | ||||
| from $fulladdr | from $fulladdr | ||||
| user $login | user $login | ||||
| passwordeval \"pass $fulladdr\" | passwordeval \"pass $fulladdr\" | ||||
| $tlsline | |||||
| " | |||||
| mbsync_profile=" | |||||
| auth on | |||||
| ${tlsline:-tls on} | |||||
| tls_trust_file $sslcert | |||||
| logfile $msmtplog | |||||
| " >> "$msmtprc" | |||||
| # On Ubuntu/Debian, a link is needed since they use an older version. | |||||
| command -V apt-get >/dev/null 2>&1 && ln -s "$msmtprc" "$HOME/.msmtprc" 2>/dev/null | |||||
| } | |||||
| prepmbsync() { mkdir -p "${mbsyncrc%/*}" | |||||
| echo " | |||||
| IMAPStore $fulladdr-remote | IMAPStore $fulladdr-remote | ||||
| Host $imap | Host $imap | ||||
| Port ${iport:-993} | Port ${iport:-993} | ||||
| @@ -73,56 +70,71 @@ SyncState * | |||||
| MaxMessages ${maxmes:-0} | MaxMessages ${maxmes:-0} | ||||
| ExpireUnread no | ExpireUnread no | ||||
| # End profile | # End profile | ||||
| " | |||||
| " >> "$mbsyncrc" ;} | |||||
| prepmpop() { echo " | |||||
| account $fulladdr | |||||
| tls on | |||||
| user $login | |||||
| host $imap | |||||
| delivery maildir ${XDG_DATA_HOME:-$HOME/.local/share}/mail/$fulladdr/${inbox:-INBOX} | |||||
| passwordeval pass $fulladdr | |||||
| " >> "$mpoprc" ;} | |||||
| if [ -z "${online+x}" ]; then | |||||
| mutt_profile="# vim: filetype=neomuttrc | |||||
| prepmutt() { echo "# vim: filetype=neomuttrc | |||||
| # muttrc file for account $fulladdr | # muttrc file for account $fulladdr | ||||
| set realname = \"$realname\" | set realname = \"$realname\" | ||||
| set from = \"$fulladdr\" | set from = \"$fulladdr\" | ||||
| set sendmail = \"msmtp -a $fulladdr\" | set sendmail = \"msmtp -a $fulladdr\" | ||||
| alias me $realname <$fulladdr> | alias me $realname <$fulladdr> | ||||
| set folder = \"$maildir/$fulladdr\" | |||||
| set folder = \"$folder\" | |||||
| set header_cache = $cachedir/$fulladdr/headers | set header_cache = $cachedir/$fulladdr/headers | ||||
| set message_cachedir = $cachedir/$fulladdr/bodies | set message_cachedir = $cachedir/$fulladdr/bodies | ||||
| set mbox_type = Maildir | set mbox_type = Maildir | ||||
| $extra | |||||
| bind index,pager gg noop | bind index,pager gg noop | ||||
| bind index,pager g noop | bind index,pager g noop | ||||
| bind index,pager M noop | bind index,pager M noop | ||||
| bind index,pager C noop | bind index,pager C noop | ||||
| bind index gg first-entry | bind index gg first-entry | ||||
| macro index o \"<shell-escape>mw -y $fulladdr<enter>\" \"run mbsync to sync $fulladdr\" | |||||
| unmailboxes * | unmailboxes * | ||||
| unalternates * | unalternates * | ||||
| " | |||||
| else | |||||
| mutt_profile="# vim: filetype=neomuttrc | |||||
| # muttrc file for account $fulladdr | |||||
| set realname = \"$realname\" | |||||
| set from = \"$fulladdr\" | |||||
| set sendmail = \"msmtp -a $fulladdr\" | |||||
| alias me $realname <$fulladdr> | |||||
| set folder = \"imaps://$login@$imap:${iport:-993}\" | |||||
| set imap_user = \"$login\" | |||||
| set header_cache = $cachedir/$fulladdr/headers | |||||
| set message_cachedir = $cachedir/$fulladdr/bodies | |||||
| set imap_pass = \"\`pass $fulladdr\`\" | |||||
| unset signature | |||||
| unmacro index o | |||||
| $synccmd | |||||
| " > "$accdir/$idnum-$fulladdr.muttrc" | |||||
| set mbox_type = Maildir | |||||
| [ ! -f "$muttrc" ] && echo "# vim: filetype=neomuttrc" > "$muttrc" | |||||
| ! grep -q "^source.*mutt-wizard.muttrc" "$muttrc" && echo "source $mwconfig" >> "$muttrc" | |||||
| ! grep "^source.*.muttrc" "$muttrc" | grep -qv "$mwconfig" && echo "source $accdir/$idnum-$fulladdr.muttrc" >> "$muttrc" | |||||
| echo "macro index,pager i$idnum '<sync-mailbox><enter-command>source $accdir/$idnum-$fulladdr.muttrc<enter><change-folder>!<enter>;<check-stats>' \"switch to $fulladdr\"" >> "$muttrc" | |||||
| } | |||||
| getprofiles() { \ | |||||
| mkdir -p "${muttrc%/*}" "$accdir" "$cachedir/$fulladdr/bodies" "${XDG_CONFIG_HOME:-$HOME/.config}/msmtp" | |||||
| unset msmtp_header msmtp_profile mutt_profile mbsync_profile | |||||
| case "$iport" in | |||||
| 1143) imapssl=None ;; | |||||
| 143) imapssl=STARTTLS ;; | |||||
| esac | |||||
| case "$type" in | |||||
| online) folder="imaps://$login@$imap:${iport:-993}" | |||||
| extra="set imap_user = \"$login\" | |||||
| set imap_pass = \"\`pass $fulladdr\`\" | |||||
| set ssl_starttls = yes | set ssl_starttls = yes | ||||
| set ssl_force_tls = yes | |||||
| set ssl_force_tls = yes" | |||||
| ;; | |||||
| pop) synccmd="macro index o \"<shell-escape>mpop $fulladdr<enter>\" \"run mpop to get $fulladdr's mail\"" | |||||
| prepmpop ;; | |||||
| *) synccmd="macro index o \"<shell-escape>mw -y $fulladdr<enter>\" \"run mbsync to sync $fulladdr\"" | |||||
| folder="$maildir/$fulladdr" | |||||
| prepmbsync ;; | |||||
| esac | |||||
| prepmsmtp | |||||
| prepmutt | |||||
| bind index,pager gg noop | |||||
| bind index,pager g noop | |||||
| bind index,pager M noop | |||||
| bind index,pager C noop | |||||
| bind index gg first-entry | |||||
| unset signature | |||||
| unmacro index o | |||||
| unmailboxes * | |||||
| " | |||||
| fi | |||||
| prepnotmuch # Create a notmuch config file if not present already. | |||||
| } | } | ||||
| parsedomains(){ serverinfo="$(grep "^${fulladdr#*@}" "$muttshare/domains.csv" 2>/dev/null)" | parsedomains(){ serverinfo="$(grep "^${fulladdr#*@}" "$muttshare/domains.csv" 2>/dev/null)" | ||||
| @@ -172,7 +184,7 @@ askinfo() { \ | |||||
| echo "\`$fulladdr\` is not a valid email address. Please retype the address:" | echo "\`$fulladdr\` is not a valid email address. Please retype the address:" | ||||
| read -r fulladdr | read -r fulladdr | ||||
| done | done | ||||
| grep -q "Channel\s*$fulladdr$" "$mbsyncrc" 2>/dev/null && | |||||
| getaccounts; echo "$accounts" | grep -q "\s$fulladdr$" 2>/dev/null && | |||||
| { echo "$fulladdr has already been added" && exit 1 ;} | { echo "$fulladdr has already been added" && exit 1 ;} | ||||
| { [ -z "$imap" ] || [ -z "$smtp" ] ;} && parsedomains | { [ -z "$imap" ] || [ -z "$smtp" ] ;} && parsedomains | ||||
| [ -z "$imap" ] && echo "Give your email server's IMAP address (excluding the port number):" && | [ -z "$imap" ] && echo "Give your email server's IMAP address (excluding the port number):" && | ||||
| @@ -193,27 +205,6 @@ createpass() { echo "$password" > "$PASSWORD_STORE_DIR/$fulladdr" | |||||
| "$GPG" -qer "$(cat "$PASSWORD_STORE_DIR/.gpg-id")" "$PASSWORD_STORE_DIR/$fulladdr" | "$GPG" -qer "$(cat "$PASSWORD_STORE_DIR/.gpg-id")" "$PASSWORD_STORE_DIR/$fulladdr" | ||||
| rm -f "$PASSWORD_STORE_DIR/$fulladdr" ;} | rm -f "$PASSWORD_STORE_DIR/$fulladdr" ;} | ||||
| writeinfo() { mkdir -p "${muttrc%/*}" "$accdir" "$cachedir/$fulladdr/bodies" "${XDG_CONFIG_HOME:-$HOME/.config}/msmtp" "$maildir/$fulladdr" | |||||
| # Configure msmtprc for sending mail. | |||||
| [ ! -f "$msmtprc" ] && echo "$msmtp_header" > "$msmtprc" | |||||
| echo "$msmtp_profile" >> "$msmtprc" | |||||
| # On Ubuntu/Debian, a link is needed since they use an older version. | |||||
| command -V apt-get >/dev/null 2>&1 && ln -s "$msmtprc" "$HOME/.msmtprc" 2>/dev/null | |||||
| # Create the mbsync config file if local account. | |||||
| [ -z "${online+x}" ] && mkdir -p "${mbsyncrc%/*}" && echo "$mbsync_profile" >> "$mbsyncrc" | |||||
| # Create a muttrc for viewing mail. | |||||
| echo "$mutt_profile" > "$accdir/$idnum-$fulladdr.muttrc" | |||||
| [ ! -f "$muttrc" ] && echo "# vim: filetype=neomuttrc" > "$muttrc" | |||||
| ! grep -q "^source.*mutt-wizard.muttrc" "$muttrc" && echo "source $mwconfig" >> "$muttrc" | |||||
| ! grep "^source.*.muttrc" "$muttrc" | grep -qv "$mwconfig" && echo "source $accdir/$idnum-$fulladdr.muttrc" >> "$muttrc" | |||||
| echo "macro index,pager i$idnum '<sync-mailbox><enter-command>source $accdir/$idnum-$fulladdr.muttrc<enter><change-folder>!<enter>;<check-stats>' \"switch to $fulladdr\"" >> "$muttrc" | |||||
| notmuchauto # Create a notmuch config file if not present already. | |||||
| } | |||||
| getpass() { while : ; do pass rm -f "$fulladdr" >/dev/null 2>&1 | getpass() { while : ; do pass rm -f "$fulladdr" >/dev/null 2>&1 | ||||
| pass insert "$fulladdr" && break; done ;} | pass insert "$fulladdr" && break; done ;} | ||||
| @@ -247,13 +238,13 @@ getboxes() { if [ -n "${force+x}" ]; then | |||||
| done | done | ||||
| } | } | ||||
| finalize() { echo "$mailboxes" | xargs -I {} mkdir -p "$maildir/$fulladdr/{}/cur" "$maildir/$fulladdr/{}/tmp" "$maildir/$fulladdr/{}/new" | |||||
| echo "$toappend" >> "$accdir/$idnum-$fulladdr.muttrc" | |||||
| [ -z "${online+x}" ] && echo "$fulladdr (account #$idnum) added successfully." | |||||
| finalize() { echo "$toappend" >> "$accdir/$idnum-$fulladdr.muttrc" | |||||
| [ "$type" != "online" ] && echo "$mailboxes" | xargs -I {} mkdir -p "$maildir/$fulladdr/{}/cur" "$maildir/$fulladdr/{}/tmp" "$maildir/$fulladdr/{}/new" | |||||
| echo "$fulladdr (account #$idnum) added successfully." | |||||
| command -V urlview >/dev/null 2>&1 && [ ! -f "$HOME/.urlview" ] && echo "COMMAND \$BROWSER" > "$HOME/.urlview" | command -V urlview >/dev/null 2>&1 && [ ! -f "$HOME/.urlview" ] && echo "COMMAND \$BROWSER" > "$HOME/.urlview" | ||||
| return 0 ;} | return 0 ;} | ||||
| notmuchauto() { \ | |||||
| prepnotmuch() { \ | |||||
| [ -z "$NOTMUCH_CONFIG" ] && NOTMUCH_CONFIG="$HOME/.notmuch-config" | [ -z "$NOTMUCH_CONFIG" ] && NOTMUCH_CONFIG="$HOME/.notmuch-config" | ||||
| [ -f "$NOTMUCH_CONFIG" ] && return 0 | [ -f "$NOTMUCH_CONFIG" ] && return 0 | ||||
| nmbasic="[database] | nmbasic="[database] | ||||
| @@ -308,12 +299,13 @@ Main actions: | |||||
| Options allowed with -a: | Options allowed with -a: | ||||
| -u Account login name if not full address | -u Account login name if not full address | ||||
| -n "Real name" to be on the email account | -n "Real name" to be on the email account | ||||
| -i IMAP server address | |||||
| -I IMAP server port | |||||
| -i IMAP/POP server address | |||||
| -I IMAP/POP server port | |||||
| -s SMTP server address | -s SMTP server address | ||||
| -S SMTP server port | -S SMTP server port | ||||
| -x Password for account (recommended to be in double quotes) | -x Password for account (recommended to be in double quotes) | ||||
| -p Install for a Protonmail account. | -p Install for a Protonmail account. | ||||
| -P Add for a POP server instead of IMAP | |||||
| -o Configure address, but keep mail online. | -o Configure address, but keep mail online. | ||||
| -f Assume typical English mailboxes without attempting log-on. | -f Assume typical English mailboxes without attempting log-on. | ||||
| @@ -324,7 +316,7 @@ To change an account's password, run \`pass edit your@email.com\`. | |||||
| EOF | EOF | ||||
| } | } | ||||
| while getopts "fplhodTYD:y:i:I:s:S:u:a:n:x:m:t:" o; do case "${o}" in | |||||
| while getopts "fpPlhodTYD:y:i:I:s:S:u:a:n:x:m:t:" o; do case "${o}" in | |||||
| l) setact list || exit 1 ;; | l) setact list || exit 1 ;; | ||||
| d) setact delete || exit 1 ;; | d) setact delete || exit 1 ;; | ||||
| D) setact delete || exit 1 ; fulladdr="$OPTARG" ;; | D) setact delete || exit 1 ; fulladdr="$OPTARG" ;; | ||||
| @@ -338,7 +330,8 @@ while getopts "fplhodTYD:y:i:I:s:S:u:a:n:x:m:t:" o; do case "${o}" in | |||||
| u) setact add || exit 1 ; login="$OPTARG" ;; | u) setact add || exit 1 ; login="$OPTARG" ;; | ||||
| n) setact add || exit 1 ; realname="$OPTARG" ;; | n) setact add || exit 1 ; realname="$OPTARG" ;; | ||||
| m) setact add || exit 1 ; maxmes="$OPTARG" ;; | m) setact add || exit 1 ; maxmes="$OPTARG" ;; | ||||
| o) setact add || exit 1 ; online=True ;; | |||||
| o) setact add || exit 1 ; type="online" ;; | |||||
| P) setact add || exit 1 ; type="pop" ;; | |||||
| f) setact add || exit 1 ; force=True ;; | f) setact add || exit 1 ; force=True ;; | ||||
| x) setact add || exit 1 ; password="$OPTARG" ;; | x) setact add || exit 1 ; password="$OPTARG" ;; | ||||
| t) setact toggle || exit 1 ; cronmin="$OPTARG" ;; | t) setact toggle || exit 1 ; cronmin="$OPTARG" ;; | ||||
| @@ -357,7 +350,7 @@ esac done | |||||
| case "$action" in | case "$action" in | ||||
| list) list ;; | list) list ;; | ||||
| add) checkbasics && askinfo && getboxes && getprofiles && writeinfo && finalize || { delete ; exit 1 ;} ;; | |||||
| add) checkbasics && askinfo && getboxes && getprofiles && finalize || { delete ; exit 1 ;} ;; | |||||
| delete) delete ;; | delete) delete ;; | ||||
| sync) mailsync $fulladdr ;; | sync) mailsync $fulladdr ;; | ||||
| toggle) togglecron ;; | toggle) togglecron ;; | ||||