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 9b7844b0b465cdc4e724de4d11cfc4c743f99126
parent 6bf54bacd74e851ea9cc3e6792a531684180bcf5
Author: Jaromil <jaromil@dyne.org>
Date:   Mon, 27 Aug 2012 22:11:01 +0200

fixes and speedups to the new addressbook mechanism

Diffstat:
Mbuild/build-gnu.sh | 4++--
Msrc/jaro | 2+-
Msrc/zlibs/addressbook | 60+++++++++++++++++++++++++++++++++++++++---------------------
Msrc/zlibs/email | 2+-
Msrc/zlibs/filters | 9+++++----
5 files changed, 48 insertions(+), 29 deletions(-)

diff --git a/build/build-gnu.sh b/build/build-gnu.sh @@ -39,7 +39,7 @@ case $distro in echo "fetchaddr" gcc $cflags -c fetchaddr.c helpers.c rfc2047.c rfc822.c; \ - gcc $cflags -o fetchaddr fetchaddr.o helpers.o rfc2047.o rfc822.o + gcc $cflags -o fetchaddr fetchaddr.o helpers.o rfc2047.o rfc822.o -lbz2 cd - > /dev/null echo "Compiling the search engine..." @@ -60,7 +60,7 @@ case $distro in mairix/writer.o mairix/dates.o mairix/dirscan.o \ mairix/dumper.o mairix/fromcheck.o mairix/hash.o mairix/mbox.o \ mairix/nvp.o mairix/reader.o mairix/search.o mairix/tok.o \ - -lz + -lz -lbz2 echo "fetchdate" cd - > /dev/null diff --git a/src/jaro b/src/jaro @@ -470,7 +470,7 @@ main() list) CLEANEXIT=0; list_addresses ${PARAM} ;; import) import_vcard ${PARAM} ;; "export") export_vcard ${PARAM} ;; - abook) export_abook ${PARAM} ;; + abook) edit_abook ${PARAM} ;; edit) CLEANEXIT=0; editor ${PARAM} ;; open) CLEANEXIT=0; open_file ${PARAM} ;; diff --git a/src/zlibs/addressbook b/src/zlibs/addressbook @@ -25,6 +25,7 @@ ################### # Jaro Brother DB create_addressbook() { + func "create addressbook" { test -r $WORKDIR/addressbook } && { error "Addressbook already exists: $WORKDIR/addressbook" return 1 @@ -33,12 +34,12 @@ create_addressbook() { CREATE TABLE whitelist ( email text collate nocase unique, - name text collate nocase, + name text collate nocase ); CREATE TABLE blacklist ( email text collate nocase unique, - name text collate nocase, + name text collate nocase ); EOF { test $? != 0 } && { @@ -80,6 +81,7 @@ EOF func "address not found or error occurred" } } search_name() { + func "search_name from $list like $1" cat <<EOF | ${SQL} -column -batch $WORKDIR/addressbook .width 64 128 SELECT * FROM $list @@ -87,6 +89,7 @@ WHERE name LIKE "%${1}%"; EOF } search_email() { + func "search email from $list is $1" cat <<EOF | ${SQL} -column -batch $WORKDIR/addressbook SELECT rowid FROM $list WHERE email IS "${1}"; @@ -94,6 +97,7 @@ EOF return $? } complete() { + func "complete from $list: ${PARAM[1]}" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } act "Searching for \"${PARAM[1]}\" in $list" @@ -114,6 +118,7 @@ complete() { printf "\n" }' } isknown() { + func "is known in $list: (string from stdin)" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } head="`${WORKDIR}/bin/fetchaddr -x From: -a`" @@ -131,6 +136,7 @@ isknown() { } learn() { + func "learn ${PARAM[1]} from mail in stdin" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } what=sender @@ -165,6 +171,7 @@ learn() { } forget() { + func "forget sender from mail in stdin" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } act "Expecting mail from stdin pipe" @@ -174,6 +181,7 @@ forget() { remove_address "${head[(ws:,:)1]}" } list_addresses() { + func "list addresses in ${PARAM[1]}" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } { test ${PARAM[1]} } && { list=${PARAM[1]} } @@ -188,6 +196,7 @@ EOF # import addresbook email from VCard import_vcard() { + func "import VCard from file ${PARAM[1]}" { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } { test -r ${PARAM[1]} } || { @@ -292,15 +301,15 @@ EOF } -export_abook() { +edit_abook() { { test ! -r ${WORKDIR}/addressbook } && { create_addressbook } - if [ -z ${PARAM[1]} ]; then list=whitelist - else list=${PARAM[1]}; fi + # take argument even without option -l + { test -z ${PARAM[1]} } || { list=${PARAM[1]} } act "Editing addressbook $list" tmp=$TMPDIR/abook.$datestamp.$RANDOM - + newlock $tmp cat <<EOF | ${SQL} -column -header -batch $WORKDIR/addressbook \ | grep -v '^email' > $tmp @@ -312,9 +321,10 @@ EOF addresses=`cat $tmp` ${=rm} $tmp + touch $tmp + - rm -f $WORKDIR/addressbook.abook - cat <<EOF > $WORKDIR/addressbook.abook + cat <<EOF > $tmp # abook addressbook file [format] @@ -329,7 +339,7 @@ EOF # crop (trim) all beginning and ending whitespaces from name _name=`echo $a | cut -d'|' -f2 | sed 's/<.*>//;s/^[ \t]*//;s/[ \t]*$//'` { test "${_email}" != "" } && { - cat <<EOF >> $WORKDIR/addressbook.abook + cat <<EOF >> $tmp [${c}] name=${_name} email=${_email} @@ -340,14 +350,15 @@ EOF done which abook > /dev/null { test $? != 0 } && { - error "ABook not found, $list exported in $WORKDIR/addressbook.abook" + error "ABook not found" return 1 } - abook --datafile $WORKDIR/addressbook.abook + abook --datafile $tmp - tmp=$TMPDIR/abook.$datestamp.$RANDOM - - abook --convert --infile $WORKDIR/addressbook.abook \ + tmpspruce=$TMPDIR/abook.spruce.$datestamp.$RANDOM + newlock $tmpspruce + + abook --convert --infile $tmp \ --outformat spruce | awk ' BEGIN { c=0; name=""; email=""; } /^#/ { if(email != "") { @@ -361,18 +372,21 @@ BEGIN { c=0; name=""; email=""; } } /^Name:/ { name=$0 } /^Email:/ { email=$0 } -' > $tmp - addresses=`cat $tmp` +' > $tmpspruce + addresses=`cat $tmpspruce` + unlink $tmpspruce + ${=rm} $tmp + touch $tmp # move addressbook to old act "Updating the addressbook database" - cat <<EOF > $tmp + cat <<EOF >> $tmp DROP TABLE $list; CREATE TABLE $list ( email text collate nocase unique, - name text collate nocase, + name text collate nocase ); EOF @@ -391,9 +405,13 @@ EOF done func "Inserting the updated addressbook" - cat $tmp | ${SQL} -batch $WORKDIR/addressbook 2> /dev/null - ${=rm} $tmp + tmpwrite=$TMPDIR/abook.write.$datestamp.$RANDOM + newlock $tmpwrite + cp $WORKDIR/addressbook $tmpwrite + cat $tmp | ${SQL} -batch $tmpwrite 2> /dev/null + unlink $tmp + cp $tmpwrite $WORKDIR/addressbook + unlink $tmpwrite notice "Addressbook updated" } - ################### diff --git a/src/zlibs/email b/src/zlibs/email @@ -258,7 +258,7 @@ EOF else act "Mail sent succesfully" # whitelist those to whom we send mails - cat ${mail} | $WORKDIR/bin/jaro -l whitelist -q learn to: + cat ${mail} | $WORKDIR/bin/jaro -l whitelist -q receiver to: ${=rm} ${mail} & unlink ${smtp} & fi diff --git a/src/zlibs/filters b/src/zlibs/filters @@ -65,10 +65,10 @@ set mailcap_path = "$WORKDIR/.mutt/mailcap:$WORKDIR/mailcap:$HOME/.mailcap:/etc/ # Little Brother Database set query_command = "$WORKDIR/bin/jaro -q complete '%s'" -macro index,pager a "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q learn from:<enter>" "add to whitelist everyone in the message" -macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q forget from:<enter>" "remove sender from whitelist -macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q learn from:<enter>" "add sender to blacklist" -macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q forget from:<enter>" "remove sender from blacklist +macro index,pager a "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q learn sender<enter>" "add to whitelist everyone in the message" +macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q forget sender<enter>" "remove sender from whitelist +macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q learn sender<enter>" "add sender to blacklist" +macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q forget sender<enter>" "remove sender from blacklist # mailboxes in order of priority source $MUTTDIR/mboxes @@ -285,6 +285,7 @@ EOF #### SIEVE +func "generating whitelist for sieve filters" cat <<EOF >> $sieve # whitelist if header :contains "From" [