jaromail

a commandline tool to easily and privately handle your e-mail
git clone git://parazyd.org/jaromail.git
Log | Files | Refs | Submodules | README

commit 9b65e1da8b6ec775b9f28dfa89ee19252e8a1c97
parent 503da646c04338769ab72ae4cfc04af1c3241d17
Author: Jaromil <jaromil@dyne.org>
Date:   Mon, 24 Aug 2015 20:37:19 +0200

cleanups and removal of the MUTTDIR global variable

Diffstat:
Msrc/jaro | 55++++++++++++++++++++++++++++++++++---------------------
Msrc/zlibs/email | 8++++----
Msrc/zlibs/filters | 124+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Msrc/zlibs/helpers | 2+-
4 files changed, 107 insertions(+), 82 deletions(-)

diff --git a/src/jaro b/src/jaro @@ -50,12 +50,16 @@ MAILDIRS=${JAROMAILDIR:-$MAILDIRS} # check if we are testing from source -if [ -r ../src/jaro ]; then +if [[ -r ../src/jaro ]]; then WORKDIR="../src" # check if we are on OSX -elif [ -r /Applications/JaroMail.app/Contents/Resources/jaro ]; then +elif [[ -r /Applications/JaroMail.app/Contents/Resources/jaro ]]; then WORKDIR="/Applications/JaroMail.app/Contents/Resources/jaro" -else # use GNU/Linux default +elif [[ -r /usr/share/jaromail/bin/jaro ]]; then + # use GNU/Linux default in usr + WORKDIR="/usr/share/jaromail" +else + # use GNU/Linux default in local WORKDIR="/usr/local/share/jaromail" fi @@ -64,6 +68,7 @@ WORKDIR=${JAROWORKDIR:-$WORKDIR} # load our zuper extension zkv=1 +helpers=1 source $WORKDIR/zlibs/zuper @@ -86,7 +91,7 @@ esac # global variables -vars+=(DEBUG QUIET DRYRUN CALLMUTT cur_fun) +vars+=(DEBUG QUIET DRYRUN CALLMUTT MAILDIRS) QUIET=${QUIET:-0} DEBUG=${DEBUG:-0} DRYRUN=${DRYRUN:-0} @@ -282,11 +287,11 @@ check_bin() { # required programs for req in pinentry fetchmail gpg mutt msmtp; do - command -v $req >/dev/null - { test $? != 0 } && { - error "Cannot find $req. Please install it." - exit 1 - } + isfound $req + { test $? != 0 } && { + error "Cannot find $req. Please install it." + exit 1 + } done # make sure a gnupg dir exists @@ -304,9 +309,9 @@ check_bin() { esac # which wipe command to use - if command -v wipe > /dev/null; then + if isfound wipe; then rm="wipe -f -s -q -R /dev/urandom" - elif command -v srm > /dev/null; then + elif isfound srm; then rm="srm -m" else rm="rm -f" @@ -314,12 +319,12 @@ check_bin() { func "Rm binary: $rm" # which mutt binary to use - if command -v mutt > /dev/null; then + if isfound mutt; then # system-wide # TODO: check if this is also the location on Fedora pgpewrap="${WORKDIR}/bin/gpgewrap" dotlock="${WORKDIR}/bin/dotlock" - elif command -v mutt-jaro > /dev/null; then + elif isfound mutt-jaro; then # in-house compiled mutt=mutt-jaro pgpewrap=pgpewrap @@ -645,14 +650,22 @@ main() { ;; update|init) - init_inbox - update_filters - update_mutt - update_sieve - command -v notmuch > /dev/null && { - nm_setup - nm new 2>&1 | grep -v '^Note: Ignoring' -} + [[ "$PARAM" = "" ]] || { + for p in $PARAM; do + [[ "$p" = "." ]] && p=$PWD + [[ -d $p ]] && MAILDIRS=$p + done + } + MAILDIRS=$MAILDIRS init_inbox + MAILDIRS=$MAILDIRS update_filters + MAILDIRS=$MAILDIRS update_mutt + MAILDIRS=$MAILDIRS update_sieve + isfound notmuch && { + MAILDIRS=$MAILDIRS nm_setup + MAILDIRS=$MAILDIRS nm new 2>&1 | grep -v '^Note: Ignoring' + } + notice "Initialization completed in $MAILDIRS" + act "configure accounts in $MAILDIRS/Accounts" ;; help) usage ;; diff --git a/src/zlibs/email b/src/zlibs/email @@ -553,8 +553,8 @@ EOF unset password # when peeking don't mark unread messages as Old # and sort date received with no threading (latest up) - rm -f "$MUTTDIR/muttpass" - sysread -o 1 <<EOF > "$MUTTDIR/muttpass" + rm -f "$MAILDIRS/.mutt/muttpass" + sysread -o 1 <<EOF > "$MAILDIRS/.mutt/muttpass" source '$_pass_tmp' unset mark_old set sort=reverse-date-received @@ -562,8 +562,8 @@ EOF # schedule deletion of pass files after use sched +1 " -rm -f $MUTTDIR/muttpass -touch $MUTTDIR/muttpass +rm -f $MAILDIRS/.mutt/muttpass +touch $MAILDIRS/.mutt/muttpass ${=rm} -f $tmp" # zero the tmp passfile after a second _mutt -f ${iproto}://${ilogin}@${imap}:${imap_port}/${folder} diff --git a/src/zlibs/filters b/src/zlibs/filters @@ -38,6 +38,10 @@ source "$MAILDIRS/cache/filters" } init_inbox() { + fn init_inbox + req=(MAILDIRS) + ckreq + # make sure maildirs where to put mails exist ${=mkdir} "$MAILDIRS" maildirmake "$MAILDIRS/incoming" @@ -79,11 +83,11 @@ init_inbox() { # reads all configurations and creates a cache of what is read # the cache consists of array and maps declarations for zsh update_filters() { - [[ -r "$MAILDIRS/Filters.txt" ]] || { - error "Filters not found in $MAILDIRS/Filters.txt" - return 1 - } - + fn update_filters + req=(MAILDIRS) + freq=($MAILDIRS/Filters.txt) + ckreq + notice "Updating filters..." ff="$MAILDIRS/cache/filters" @@ -170,6 +174,10 @@ EOF filter_maildir() { + fn filter_maildir + req=(MAILDIR) + ckreq + # Makes glob matching case insensitive unsetopt CASE_MATCH @@ -184,7 +192,7 @@ filter_maildir() { func "Returning error to caller." return 1 } - + # loads up the filter cache (zsh compiled arrays) [[ -r "$MAILDIRS/cache/filters" ]] && { source $MAILDIRS/cache/filters @@ -207,7 +215,7 @@ filter_maildir() { error "Nothing to filter inside maildir $mdinput" return 1 } - + notice "Filtering maildir: $mdinput ($numm mails}" c=0 @@ -218,7 +226,7 @@ filter_maildir() { error "User break requested, interrupting operation" break } - + match=0 c=$(($c + 1)) @@ -251,7 +259,7 @@ filter_maildir() { continue } } - + hdr "$m" | awk '/Sender.*mailman-bounce/ { exit 1 }' [[ $? = 0 ]] || { [[ "$mdinput" = "zz.bounces" ]] && { @@ -265,7 +273,7 @@ filter_maildir() { continue } } - + [[ "$ownfilters" = "1" ]] && { func "processing through own filters" @@ -277,7 +285,7 @@ filter_maildir() { [[ $? = 0 ]] && { femail="${(k)e_addr}" # e_parse From hit is always one for exp in ${(k)filter_from}; do - + # fuzzy match on a string (PCRE) if [[ "$femail" =~ "$exp" ]]; then @@ -288,9 +296,9 @@ filter_maildir() { [[ "$_dest" = "$mdinput" ]] && { act "$c\t/ $numm" match=1 - break + break } - + act "$c\t/ $numm\t-> $_dest\t(from $femail)" # tag mailinglists @@ -328,13 +336,13 @@ filter_maildir() { [[ $? = 0 ]] && { for ft in ${(k)e_addr}; do for exp in ${(k)filter_to}; do - + # fuzzy match on a string (PCRE) if [[ "$ft" =~ "$exp" ]]; then - + # retrieve the filter destination maildir _dest="${filter_to[$exp]}" - + # if destination maildir is same as input, skip [[ "$_dest" = "$mdinput" ]] && { act "$c\t/ $numm" @@ -351,7 +359,7 @@ filter_maildir() { printfile "$m" | deliver "$_dest" "+filtered" fi } - + if [[ $? = 0 ]]; then match=1 rm "$m" @@ -435,13 +443,13 @@ filter_maildir() { act "$c\t/ $numm\t-> unsorted.ml" [[ $DRYRUN = 1 ]] || { printfile "$m" | deliver unsorted.ml "+unsorted +mailinglist" - [[ $? = 0 ]] && { + [[ $? = 0 ]] && { rm "$m" continue } } } - + # if here then file to unsorted if [ "$mdinput" = "unsorted" ]; then act "$c\t/ $numm" @@ -462,12 +470,16 @@ filter_maildir() { # MUTT update_mutt() { - act "updating mutt settings" - func "MUTTDIR: $MUTTDIR" + fn update_mutt + req=(MAILDIRS) + ckreq - ${=mkdir} "$MUTTDIR" - ${=mkdir} "$MUTTDIR"/cache - rm -f "$MUTTDIR"/rc + act "updating Mutt settings" + func "Mutt directory: $MAILDIRS/.mutt" + + ${=mkdir} "$MAILDIRS/.mutt" + ${=mkdir} "$MAILDIRS/.mutt"/cache + rm -f "$MAILDIRS/.mutt"/rc gpgkey="" # detect the default gpg key to always encrypt also to self @@ -475,22 +487,22 @@ update_mutt() { gpgkey=`awk '/^default-key/ { print $2 }' $HOME/.gnupg/gpg.conf` act "default GPG key configured: $gpgkey" } - cat<<EOF > "$MUTTDIR"/rc + cat<<EOF > "$MAILDIRS/.mutt"/rc #### Mutt config automatically generated by Jaro Mail ### do not edit: this file is overwritten by jaro update -### put your customizations in \$MAILDIRS/Identity.txt +### put your customizations in \$MAILDIRS/Identity.txt unset use_domain set folder = '$MAILDIRS' set spoolfile = '$MAILDIRS/known/' set record = '$MAILDIRS/sent/' set postponed= '$MAILDIRS/postponed/' -set tmpdir = '$MUTTDIR/cache' +set tmpdir = '$MAILDIRS/.mutt/cache' set sendmail = "$WORKDIR/bin/jaro -q queue" -set header_cache= '$MUTTDIR/cache' +set header_cache= '$MAILDIRS/.mutt/cache' set maildir_header_cache_verify=no set editor = "$WORKDIR/bin/jaro -q edit" -set mailcap_path = "$MUTTDIR/mailcap:$MAILDIRS/mailcap:$HOME/.mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap" +set mailcap_path = "$MAILDIRS/.mutt/mailcap:$MAILDIRS/mailcap:$HOME/.mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap" # Little Brother Database set query_command = "$WORKDIR/bin/jaro -q complete '%s'" @@ -499,7 +511,7 @@ macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q learn all<e macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q learn sender<enter>" "add sender to blacklist" # mailboxes in order of priority -source '$MUTTDIR/mboxes' +source '$MAILDIRS/.mutt/mboxes' # specific configuration files source '$WORKDIR/.mutt/gpg' @@ -509,14 +521,14 @@ source '$WORKDIR/.mutt/formats' source '$WORKDIR/.mutt/keybindings' source '$WORKDIR/.mutt/colors' source '$MAILDIRS/Identity.txt' -source '$MUTTDIR/muttpass' +source '$MAILDIRS/.mutt/muttpass' EOF [[ "$gpgkey" = "" ]] || { # gpg special settings - - sysread -o 1 <<EOF >> "$MUTTDIR"/rc + + sysread -o 1 <<EOF >> "$MAILDIRS/.mutt"/rc ## GnuPG specific settings # create a pgp/mime encrypted attachment set pgp_encrypt_only_command="gpgewrap gpg --batch --quiet --no-verbose --output - --encrypt --textmode --armor --always-trust --encrypt-to $gpgkey -- -r %r -- '%f'" @@ -528,9 +540,9 @@ set pgp_encrypt_sign_command="gpgewrap gpg %?p?--passphrase-fd 0? --batch --quie #################################### EOF } - + # MUTT MAILCAP - sysread -o 1 <<EOF > $MUTTDIR/mailcap + sysread -o 1 <<EOF > $MAILDIRS/.mutt/mailcap text/plain; iconv -f iso-8859-1 -t utf-8; test=charset=%{charset} \ && test x`echo \"$charset\" | tr a-z A-Z` = xISO-8859-1; copiousoutput text/plain; cat %s @@ -538,15 +550,15 @@ EOF wwwtext=w3m if command -v elinks > /dev/null; then - cat <<EOF >> $MUTTDIR/mailcap + cat <<EOF >> $MAILDIRS/.mutt/mailcap text/html; elinks -dump -dump-charset %{charset} %s; nametemplate=%s.html; copiousoutput EOF elif command -v w3m > /dev/null; then - cat <<EOF >> $MUTTDIR/mailcap + cat <<EOF >> $MAILDIRS/.mutt/mailcap text/html; w3m -I %{charset} -T text/html %s; nametemplate=%s.html; copiousoutput EOF elif command -v lynx > /dev/null; then - cat <<EOF >> $MUTTDIR/mailcap + cat <<EOF >> $MAILDIRS/.mutt/mailcap text/html; lynx -dump -assume_charset=%{charset} %s; nametemplate=%s.html; copiousoutput EOF fi @@ -560,41 +572,41 @@ EOF for t in ${(f)apptypes}; do eval `print $t | awk ' { print "_type=" $1 "; _app=" $2 ";" }'` - cat <<EOF >> $MUTTDIR/mailcap + cat <<EOF >> $MAILDIRS/.mutt/mailcap ${_type}; a="${MAILDIRS}/tmp" && f=\`basename %s\` && rm -f "\$a"/"\$f" && cp %s "\$a"/"\$f" && ${_app} "\$a"/"\$f" EOF done - cat <<EOF >> $MUTTDIR/mailcap + cat <<EOF >> $MAILDIRS/.mutt/mailcap application/*; a="${MAILDIRS}/tmp" && f=\`basename %s\` && rm -f "\$a"/"\$f" && cp %s "\$a"/"\$f" && jaro preview "\$a"/"\$f" EOF } # Applications.txt # this one is empty and sources files in temp when necessary - rm -f "$MUTTDIR/muttpass" - touch "$MUTTDIR/muttpass" + rm -f "$MAILDIRS/.mutt/muttpass" + touch "$MAILDIRS/.mutt/muttpass" # just the header, will be completed later - rm -f $MUTTDIR/mboxes - print -n "mailboxes +known +priv" > $MUTTDIR/mboxes + rm -f $MAILDIRS/.mutt/mboxes + print -n "mailboxes +known +priv" > $MAILDIRS/.mutt/mboxes for f in `cat "$MAILDIRS/Filters.txt" | awk ' /^#/ {next} /^./ { print $4 }'`; do # MUTT (generate mailboxes priority this parser) - print " \\" >> $MUTTDIR/mboxes - print -n " +${f} " >> $MUTTDIR/mboxes + print " \\" >> $MAILDIRS/.mutt/mboxes + print -n " +${f} " >> $MAILDIRS/.mutt/mboxes done - print " \\" >> $MUTTDIR/mboxes - print " +unsorted.ml +unsorted" >> $MUTTDIR/mboxes - + print " \\" >> $MAILDIRS/.mutt/mboxes + print " +unsorted.ml +unsorted" >> $MAILDIRS/.mutt/mboxes + ztmp ttmp=$ztmpfile - uniq $MUTTDIR/mboxes > $ttmp - mv $ttmp $MUTTDIR/mboxes + uniq $MAILDIRS/.mutt/mboxes > $ttmp + mv $ttmp $MAILDIRS/.mutt/mboxes } - + # sieve_filter() gets an array of patterns to match and builds a long rule # for which if they match the conditional directive they all go in one folder # $1 = conditional directive @@ -664,20 +676,20 @@ EOF # blacklist [[ -r "$MAILDIRS"/blacklist.abook ]] && { sieve_filter_array=() - + for i in `awk -F'=' ' /^email/ { print $2 } ' "$MAILDIRS"/blacklist.abook`; do sieve_filter_array+=("$i") done - + { test "${#sieve_filter_array}" = "0" } || { sieve_filter \ 'if header :contains "From"' \ zz.blacklist } } - + # bounces cat <<EOF >> "$MAILDIRS/Filters.sieve" # bounces @@ -718,7 +730,7 @@ EOF 'if header :contains "From"' \ INBOX } - + cat <<EOF >> "$MAILDIRS/Filters.sieve" # spam if header :is "X-Spam-Flag" "YES" { diff --git a/src/zlibs/helpers b/src/zlibs/helpers @@ -109,7 +109,7 @@ autostart() { # no argument passed. open first folder with new mail [[ "$1" = "" ]] && { - [[ -r $MUTTDIR/rc ]] || { + [[ -r $MAILDIRS/.mutt/rc ]] || { error "Jaro Mail is not yet configured." error "To configure, edit the files in $MAILDIRS/Accounts" error "Then run 'jaro update' at least once."