commit 2a68b1f50794d9623bc26edae88111898ccb9154
parent 11d836a569d5cec94bfa72b10cf3076c7d00706e
Author: Jaromil <jaromil@dyne.org>
Date: Thu, 17 May 2012 15:28:22 +0200
fixes to read_account and install of accounts
also stats are printed after fetchmail
Diffstat:
M | install.sh | | | 3 | ++- |
M | src/jaro | | | 121 | +++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------- |
2 files changed, 84 insertions(+), 40 deletions(-)
diff --git a/install.sh b/install.sh
@@ -125,6 +125,8 @@ Or a file named smtp.gmail.txt should contain:
----8<----8<----8<----8<----8<----8<----8<----8<----8<----
# Name and values are separated by spaces or tabs
+name USERNAME gmail
+
host smtp.gmail.com
login USERNAME@gmail.com
@@ -198,7 +200,6 @@ case $OS in
echo "METHODS=(m_inmail m_osx_addressbook)" > ${WORKDIR}/.lbdb/lbdb.rc
;;
esac
-ln -sf $WORKDIR/.lbdb $HOME/
####
diff --git a/src/jaro b/src/jaro
@@ -36,7 +36,8 @@ DEBUG=1
# which command to use when creating dirs
mkdir="`which mkdir` -m 700 -p"
-
+# date stamp
+datestamp=`date '+%d%b%y'`
##########################
@@ -165,7 +166,11 @@ ask_password() {
;;
GNU)
password=`pin_entry $login $host`
- return 0
+ if [ "$password" != "" ]; then
+ return 0
+ else
+ return 1
+ fi
;;
*)
error "Unknown system, can't figure out how to handle passwords"
@@ -174,13 +179,18 @@ ask_password() {
}
switch_identity() {
- act "switch to identity: $name <$login>"
- rm -f $MUTTDIR/identity
- cat <<EOF > $MUTTDIR/identity
+ if [ "$name" != "" ]; then
+ act "switch to identity: $name <$login>"
+ rm -f $MUTTDIR/identity
+ cat <<EOF > $MUTTDIR/identity
set hostname = $host
set realname = "$name"
set from = "$name <$login>"
EOF
+ else
+ error "No identity found, left blank."
+ touch $MUTTDIR/identity
+ fi
}
@@ -240,28 +250,25 @@ read_account() {
imap|smtp)
ttmp=`cat $acct | awk '
/^#/ { next }
- /^name/ { for(i=2;i<=NF;i++) printf "%s ", $i; printf ";" }
- /^host/ { printf "%s;", $2 }
- /^login/ { printf "%s;", $2 }
- /^transport/ { printf "%s;", $2 }
- /^port/ { printf "%s;", $2 }
- /^password/ {printf "%s;", $2 }
- /^auth/ { printf "%s;", $2 }
- /^cert/ { printf "%s;", $2 }
+ /^name/ { printf "name=\""; for(i=2;i<=NF;i++) printf "%s ", $i; printf "\";" }
+ /^host/ { printf "host=\"%s\";", $2 }
+ /^login/ { printf "login=\"%s\";", $2 }
+ /^transport/ { printf "transport=\"%s\";", $2 }
+ /^port/ { printf "port=\"%s\";", $2 }
+ /^password/ {printf "password=\"%s\";", $2 }
+ /^auth/ { printf "auth=\"%s\";", $2 }
+ /^cert/ { printf "cert=\"%s\";", $2 }
'`
- name=${ttmp[(ws:;:)1]}
- host=${ttmp[(ws:;:)2]}
- login=${ttmp[(ws:;:)3]}
- transport=${ttmp[(ws:;:)4]}
- port=${ttmp[(ws:;:)5]}
- password=${ttmp[(ws:;:)6]}
- auth=${ttmp[(ws:;:)7]}
- cert=${ttmp[(ws:;:)8]}
-
- # if not present the field is equal to the preceeding one
- [ "$cert" = "$auth" ] && unset cert
- [ "$auth" = "$password" ] && unset auth
- [ "$password" = "$port" ] && unset password
+ eval "$ttmp"
+ # check required fields
+ { test -z $name } && { error "Field missing in account $acct: name"; return 1 }
+ { test -z $host } && { error "Field missing in account $acct: host"; return 1 }
+ { test -z $login } && { error "Field missing in account $acct: login"; return 1 }
+ # fill in defaults
+ { test -z $transport } && { transport=ssl }
+ { test -z $port } && { port=993 }
+ { test -z $auth } && { auth=plain }
+ # cert and password can be missing
func "name: $name"
func "host: $host"
@@ -292,22 +299,30 @@ read_default_account() {
"in")
if [ -r $adir/imap.default ]; then
read_account imap.default
+ return $?
else
for a in `find $adir -name "imap*"`; do all+=($a); done
for a in `find $adir -name "pop*"`; do all+=($a); done
- read_account `basename ${all[1]}` # take the first found
+ if [ ${#all} != 0 ]; then
+ read_account `basename ${all[1]}` # take the first found
+ return $?
+ else
+ error "No accounts configured, look in $WORKDIR/Accounts"
+ fi
fi
;;
"out")
if [ -r $adir/smtp.default ]; then
read_account smtp.default
+ return $?
else
for a in `find $adir -name "smtp*"`; do all+=($a); done
read_account `basename ${all[1]}` # take the first found
+ return $?
fi
;;
esac
- return 0
+ return 1
}
queue() {
@@ -366,6 +381,10 @@ fetch() {
fi
for a in ${all}; do
read_account `basename $a`
+ if [ $? != 0 ]; then
+ error "Account configuration not found, or broken. Aborting operation."
+ return 1
+ fi
notice "Fetching mails from $name"
touch $WORKDIR/tmp/$host.fetch
chmod 600 $WORKDIR/tmp/$host.fetch
@@ -378,15 +397,34 @@ fetch() {
cat <<EOF > $WORKDIR/tmp/$host.fetch
poll $host with proto IMAP user "$login" there with password "$password"
-keep and ssl warnings 3600 and wants mda "procmail -m $PROCMAILDIR/rc"
+keep fetchall and ssl warnings 3600 and wants mda "procmail -m $PROCMAILDIR/rc"
antispam 571 550 501 554
EOF
unset password
# this function generates a fetchmail configuration and downloads emails
- act "launching fetchmail"
- ( sleep 2; act "deleting temporary files"
- ${=rm} $WORKDIR/tmp/$host.fetch ) &
- fetchmail -f $WORKDIR/tmp/$host.fetch
+ fetchmail -c -f $WORKDIR/tmp/$host.fetch
+ # no mails found
+ if [ $? = 1 ]; then
+ notice "No mails for $name"
+ ${=rm} $WORKDIR/tmp/$host.fetch
+ return 1
+ fi
+ # archive old procmail log
+ if [ -r $WORKDIR/log/procmail.log ]; then
+ touch $WORKDIR/log/procmail-${datestamp}.log
+ cat $WORKDIR/log/procmail.log \
+ >> $WORKDIR/log/procmail-${datestamp}.log
+ rm -f $WORKDIR/log/procmail.log
+ fi
+ act "please wait while downloading mails..."
+
+ ( sleep 2; ${=rm} $WORKDIR/tmp/$host.fetch ) &
+ fetchmail -s -f $WORKDIR/tmp/$host.fetch
+
+ total=`mailstat -k $WORKDIR/log/procmail.log | tail -n1 | awk '{print $2}'`
+ briefing=`mailstat -kt $WORKDIR/log/procmail.log |awk '!/procmail/ { print " . " $2 "\t" $3 }'|sort -nr`
+ notice "$total emails fetched"
+ echo "${briefing}"
done
return 0
}
@@ -566,6 +604,7 @@ EOF
cat<<EOF >> $PROCMAILDIR/rc
# procmail configuration file generated by Jaro Mail
MAILDIR=$MAILDIRS
+JARO=$WORKDIR/bin/jaro
DEFAULT=unsorted/
VERBOSE=off
LOGFILE=$WORKDIR/log/procmail.log
@@ -636,7 +675,7 @@ EOF
# if the sender is known (ldbd recognizes it) then put mail in high priority 'known'
:0 w:
-* ? formail -x"From:" | head -n1 | tr 'A-Z' 'a-z' | sed 's/.*\W\([0-9a-z_.-]\+@[0-9a-z_.-]\+\).*/\1/' | xargs jaro query
+* ? formail -x"From:" | head -n1 | tr 'A-Z' 'a-z' | sed 's/.*\W\([0-9a-z_.-]\+@[0-9a-z_.-]\+\).*/\1/' | xargs \$JARO query
known/
# if got here, go to unsorted
@@ -663,11 +702,10 @@ Syntact: jaro command [options] [account]
Commands:
- queue
- send
- peek
- fetch
- sync
+ 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
Options:
@@ -676,6 +714,11 @@ Options:
-q run quietly without printing informations
-D print debugging information at runtime
+Internal commands:
+
+ update refresh configurations
+ queue add into outbox
+ query query a name from addressbook
For more informations on Jaro Mail read the manual: man jaro
Please report bugs on <http://bugs.dyne.org>.