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 3acb6ce9fbc3d99d1bd14e8d6a9da44cc1bb6cd2
parent cb0252d20b2377632b80bd75a1965cb163757196
Author: Jaromil <jaromil@dyne.org>
Date:   Sun,  3 Jun 2012 16:09:56 +0200

added support for blacklisting, path to list of addresses changed

Diffstat:
Msrc/jaro | 60++++++++++++++++++++++++++++++++++++++++++------------------
Msrc/lbdb/lbdb-fetchaddr.sh.in | 5+++--
Msrc/lbdb/lbdb-munge.sh.in | 7++++---
Msrc/lbdb/m_inmail.sh.in | 2+-
Msrc/mutt/keybindings | 33++++++++++++++++++---------------
5 files changed, 68 insertions(+), 39 deletions(-)

diff --git a/src/jaro b/src/jaro @@ -49,6 +49,8 @@ typeset -A opts # global variable for account selection typeset -h account account=default +typeset -h listaddr +listaddr=Whitelist.txt # global variables for accounts typeset -h name login host protocol port password auth folders accountopt @@ -690,7 +692,7 @@ EOF else act "Mail sent succesfully" # whitelist those to whom we send mails - cat ${mail} | $WORKDIR/bin/jaro -q learn + cat ${mail} | $WORKDIR/bin/jaro -l Whitelist.txt -q learn ${=rm} ${mail} & locked_unlink ${smtp} & fi @@ -781,8 +783,10 @@ set mailcap_path = "$WORKDIR/mailcap" # Little Brother Database set query_command = "$WORKDIR/bin/jaro -q query '%s'" -macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -q learn" "add sender to whitelist" -macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -q forget" "remove sender from whitelist +macro index,pager a "<pipe-message>$WORKDIR/bin/jaro -l Whitelist.txt -q learn<enter>" "add sender to whitelist" +macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l Whitelist.txt -q forget<enter>" "remove sender from whitelist +macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l Blacklist.txt -q learn<enter>" "add sender to blacklist" +macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -l Blacklist.txt -q forget<enter>" "remove sender from blacklist EOF @@ -843,6 +847,13 @@ PF_DEST = "" # clear these vars PF_FROM = "" # don't save multiple copies PF_RECURSE = yes + +# blacklist filters using lbdb +:0 w: +* ? formail -x"From:" | head -n1 | tr 'A-Z' 'a-z' | sed 's/.*\W\([0-9a-z_.-]\+@[0-9a-z_.-]\+\).*/\1/' | xargs \$JARO -l Blacklist.txt -q query +zz.blacklist/ + +# filters generated from Filters.txt :0 * ? test \$PMSRC/pf-chkto.rc { @@ -884,7 +895,7 @@ EOF # whitelisting filters using lbdb :0 w: -* ? formail -x"From:" | head -n1 | tr 'A-Z' 'a-z' | sed 's/.*\W\([0-9a-z_.-]\+@[0-9a-z_.-]\+\).*/\1/' | xargs \$JARO -q query +* ? formail -x"From:" | head -n1 | tr 'A-Z' 'a-z' | sed 's/.*\W\([0-9a-z_.-]\+@[0-9a-z_.-]\+\).*/\1/' | xargs \$JARO -l Whitelist.txt -q query known/ EOF @@ -939,16 +950,23 @@ EOF ################### # Little Brother DB query() { + export jarodir=$WORKDIR + export jarolist=$listaddr if [ $QUIET = 1 ]; then ${WORKDIR}/.lbdb/lbdbq ${@} exitcode=$? else - act -n "Query known address <${@}> in " + act "Query address <${@}> in $listaddr" ${WORKDIR}/.lbdb/lbdbq ${@} exitcode=$? fi + unset jarodir + unset jarolist } + learn() { + export jarodir=$WORKDIR + export jarolist=$listaddr if [ $QUIET = 1 ]; then ${WORKDIR}/.lbdb/lbdb-fetchaddr -a > /dev/null exitcode=$? @@ -957,9 +975,18 @@ learn() { ${WORKDIR}/.lbdb/lbdb-fetchaddr -a exitcode=$? fi + unset jarodir + unset jarolist } + forget() { - { test $QUIET != 1 } && { act "Forgetting address from mail pipe in stdin" } + { test ! -r ${WORKDIR}/$listaddr } && { + error "$listaddr not created yet, first pipe something into jaro -l $listaddr learn" + return 1 + } + { test $QUIET != 1 } && { + act "Removing address from $listaddr (expecting mail from stdin pipe)" + } addr=`cat | formail -x"From:" \ | head -n1 \ | tr 'A-Z' 'a-z' \ @@ -967,9 +994,9 @@ forget() { func "forgetting address: $addr" newlock $WORKDIR/tmp/forget-addr awk "/$addr/"' { next; } -{ print $0 }' ${WORKDIR}/.lbdb/m_inmail.list \ +{ print $0 }' ${WORKDIR}/$listaddr \ >> $WORKDIR/tmp/forget-addr - cp $WORKDIR/tmp/forget-addr ${WORKDIR}/.lbdb/m_inmail.list + cp $WORKDIR/tmp/forget-addr ${WORKDIR}/$listaddr unlock $WORKDIR/tmp/forget-addr } ################### @@ -1095,18 +1122,18 @@ Jaro Mail $VERSION - your humble and faithful electronic postman This is free software: you are free to change and redistribute it The latest Jaro Mail sourcecode is on <http://jaromail.dyne.org> -Syntact: jaro command [options] [account] +Synopsis: jaro [options] [command] [command-options] Main commands: - peek look into the [account] mailbox without downloading fetch download unread emails from [account] - read open mutt to read all local mailfolders send send all mails queued in the outbox + peek look into the [account] mailbox without downloading Options: -a use a particular account instead of default (keyword) + -l address list database to use with learn/query/forget -h print this help -v version information for this tool -q run quietly without printing informations @@ -1119,8 +1146,8 @@ Maintenance commands: queue add a mail into outbox query query a name from addressbook - learn learn addresses found in mails piped in stdin - forget forget sender addresses found in mails piped in stdin + learn learn addresses from mails piped in stdin + forget remove addresses found in mails piped in stdin backup move all mails older than N days from a maildir to another rmdupes remove all duplicate mails into a maildir @@ -1146,13 +1173,11 @@ main() # I. usability; user expect that "-s" is "size # II. Option parsing WILL EXPLODE if you do this kind of bad things # (it will say "option defined more than once, and he's right) - main_opts=(a: -account=a q -quiet=q D -debug=D h -help=h v -version=v n -dry-run=n) + main_opts=(a: -account=a l: -listaddr=l q -quiet=q D -debug=D h -help=h v -version=v n -dry-run=n) subcommands_opts[__default]="" subcommands_opts[queue]="" subcommands_opts[fetch]="" subcommands_opts[send]="" -# subcommands_opts[read]="" -# subcommands_opts[compose]="" subcommands_opts[peek]="" subcommands_opts[update]="" @@ -1242,6 +1267,7 @@ main() echo fi if option_is_set -a; then account=`option_value -a`; fi + if option_is_set -l; then listaddr=`option_value -l`; fi if option_is_set -h; then usage; fi if option_is_set -q; then QUIET=1; fi if option_is_set -D; then func "Debug messages ON"; DEBUG=1; fi @@ -1252,8 +1278,6 @@ main() fetch) fetch ${PARAM} ;; send) send ${PARAM} ;; peek) peek ${PARAM} ;; -# read) mutt -F $MUTTDIR/rc ;; -# compose) mutt -F $MUTTDIR/rc ${PARAM} ;; update) update ;; diff --git a/src/lbdb/lbdb-fetchaddr.sh.in b/src/lbdb/lbdb-fetchaddr.sh.in @@ -28,7 +28,8 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ dotlock=@DOTLOCK@ fetchaddr=@libdir@/fetchaddr -db=@LBDB_FILE@ +db=${jarodir}/${jarolist} +dirty=${jarodir}/.${jarolist} datefmt='%Y-%m-%d %H:%M' additional_param=() @@ -121,7 +122,7 @@ else fi if $fetchaddr ${=additional_param} -d "$datefmt" $hdrlist $charset >> $db ; then - touch $db.dirty + touch $dirty fi $dotlock -u $db diff --git a/src/lbdb/lbdb-munge.sh.in b/src/lbdb/lbdb-munge.sh.in @@ -28,7 +28,8 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ dotlock=@DOTLOCK@ fetchaddr=@libdir@/fetchaddr -db=@LBDB_FILE@ +db=${jarodir}/${jarolist} +dirty=${jarodir}/.${jarolist} if [ "$SORT_OUTPUT" = "false" -o "$SORT_OUTPUT" = "no" ] then @@ -37,7 +38,7 @@ else munge=@libdir@/munge fi -if [ ! -f $db.dirty ]; then +if [ ! -f $dirty ]; then # Nothing to do exit 0 fi @@ -54,7 +55,7 @@ if $munge < $db > $db.$$.tmp 2>/dev/null then # only move, if munge successful: mv -f $db.$$.tmp $db - rm -f $db.dirty + rm -f $dirty else rm -f $db.$$.tmp # maybe write a debug log here... diff --git a/src/lbdb/m_inmail.sh.in b/src/lbdb/m_inmail.sh.in @@ -23,7 +23,7 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ -m_inmail_db=@libdir@/m_inmail.list +m_inmail_db=$jarodir/$jarolist m_inmail_query() { diff --git a/src/mutt/keybindings b/src/mutt/keybindings @@ -1,12 +1,13 @@ # Postino's keybindings for mutt # originally used by Jaromil -bind index t create-alias bind index w search bind index x sync-mailbox macro index $ '<enter-command>set mark_old=yes<enter>' -bind index a tag-prefix bind index \; tag-entry +bind index \, tag-entry +bind index T tag-pattern +bind index t untag-pattern bind index <pagedown> next-page bind index <pageup> previous-page @@ -31,24 +32,26 @@ bind editor <tab> complete-query macro index,pager "=" "<sync-mailbox><change-folder>?<toggle-mailboxes>" # folder list macro pager \ef "|view-x-face<enter>" "display the X-Face included in the mail" -macro pager "\e1" "<enter-command>set pager_index_lines=1<enter>" # Change PIL size -macro pager "\e2" "<enter-command>set pager_index_lines=2<enter>" # Change PIL size -macro pager "\e3" "<enter-command>set pager_index_lines=3<enter>" # Change PIL size -macro pager "\e4" "<enter-command>set pager_index_lines=4<enter>" # Change PIL size -macro pager "\e5" "<enter-command>set pager_index_lines=5<enter>" # Change PIL size -macro pager "\e6" "<enter-command>set pager_index_lines=6<enter>" # Change PIL size -macro pager "\e7" "<enter-command>set pager_index_lines=7<enter>" # Change PIL size -macro pager "\e8" "<enter-command>set pager_index_lines=8<enter>" # Change PIL size -macro pager "\e9" "<enter-command>set pager_index_lines=9<enter>" # Change PIL size -macro pager "\e0" "<enter-command>set pager_index_lines=0<enter>" # Change PIL size +# Change PIL size +macro pager "\e1" "<enter-command>set pager_index_lines=1<enter>" +macro pager "\e2" "<enter-command>set pager_index_lines=2<enter>" +macro pager "\e3" "<enter-command>set pager_index_lines=3<enter>" +macro pager "\e4" "<enter-command>set pager_index_lines=4<enter>" +macro pager "\e5" "<enter-command>set pager_index_lines=5<enter>" +macro pager "\e6" "<enter-command>set pager_index_lines=6<enter>" +macro pager "\e7" "<enter-command>set pager_index_lines=7<enter>" +macro pager "\e8" "<enter-command>set pager_index_lines=8<enter>" +macro pager "\e9" "<enter-command>set pager_index_lines=9<enter>" +macro pager "\e0" "<enter-command>set pager_index_lines=0<enter>" bind index - collapse-thread bind index _ collapse-all # mutt sidebar -# bind index,pager \CP sidebar-prev -# bind index,pager \CN sidebar-next -# bind index,pager \CO sidebar-open +# bind index,pager \C<up> sidebar-prev +# bind index,pager \C<down> sidebar-next +# bind index,pager \C<right> sidebar-open +# bind index,pager \C<left> sidebar-open # macro index,pager B '<enter-command>toggle sidebar_visible<enter>' # color sidebar_new yellow default