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 a050494bb9637b9d19a88ce47bddfffaee0f9d72
parent 2b28d8a823bd71b097958bef3991511cd6765962
Author: Jaromil <jaromil@dyne.org>
Date:   Wed, 21 Mar 2012 00:00:13 +0100

fetchmail mechanism implemented

Diffstat:
Minstall.sh | 65++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/postino | 60++++++++++++++++++++++++++++++++++++++++--------------------
2 files changed, 90 insertions(+), 35 deletions(-)

diff --git a/install.sh b/install.sh @@ -1,4 +1,4 @@ -#!/bin/zsh +#!/usr/bin/env zsh # Postino install script @@ -9,6 +9,8 @@ fi WORKDIR=$HOME/.postino +MAILDIR=$HOME/Mail + if [ $1 ]; then WORKDIR=$1; fi # make sure the directory is private mkdir -p $WORKDIR @@ -28,8 +30,8 @@ fi mkdir -p $WORKDIR/tmp $WORKDIR/cache chmod 700 $WORKDIR/tmp $WORKDIR/cache -if ! [ -r $WORKDIR/main.conf ]; then - cat <<EOF > $WORKDIR/main.conf +if ! [ -r $MAILDIR/Configuration.txt ]; then + cat <<EOF > $MAILDIR/Configuration.txt # MAIL USER (the left and right parts of an email) NAME=user # @ @@ -37,14 +39,14 @@ DOMAIN=gmail.com # SMTP (SEND) SMTP_ADDRESS=smtp.gmail.com -SMTP_LOGIN=${NAME}@${DOMAIN} +SMTP_LOGIN=\${NAME}@\${DOMAIN} SMTP_PASSWORD=my_secret_pass SMTP_PORT=25 # SMTP_CERTIFICATE=gmail.pem # IMAP (RECEIVE) IMAP_ADDRESS=imap.gmail.com -IMAP_LOGIN=${NAME}@${DOMAIN} +IMAP_LOGIN=\${NAME}@\${DOMAIN} IMAP_PASSWORD=my_secret_pass IMAP_PORT=443 @@ -62,12 +64,16 @@ CERTIFICATES=$HOME/.ssl/certs # directory of the sieve filter # REMOTE_FILTER=/var/mail/... EOF + act "Default configuration created" else - error "Existing configuration main.conf skipped" + error "Existing $MAILDIR/Configuration.txt skipped" fi -if ! [ -r $WORKDIR/filters.conf ]; then - cat <<EOF > $WORKDIR/filters.conf +# source the default configuration +source $MAILDIR/Configuration.txt + +if ! [ -r $MAILDIR/Filters.txt ]; then + cat <<EOF > $MAILDIR/Filters.txt # Example filter configuration for Postino # accepted email addresses @@ -99,11 +105,12 @@ from FriendFeed save web.friendfeed from academia.edu save web.academia EOF + act "Default filters created" else - error "Existing configuration filters.conf skipped" + error "Existing configuration $MAILDIR/Filters.txt skipped" fi -source $WORKDIR/main.conf +source $MAILDIR/Configuration.txt # make sure maildirs where to put mails exist mkdir -p $MAILDIRS @@ -118,7 +125,7 @@ if ! [ -r $MUTTDIR ]; then mkdir -p $MUTTDIR cat<<EOF > $MUTTDIR/rc # mutt config generated by postino -# don't edit, change main.conf instead +# don't edit, change Mail/Configuration.txt instead unset use_domain set hostname = $DOMAIN set realname = $NAME @@ -149,12 +156,40 @@ EOF error "Error setting Postino to handle Mutt's default configuration" error "Set symlink manually: $HOME/.muttrc -> $MUTTDIR/rc" fi + act "Default mutt configuration created" else error "Existing configuration for Mutt skipped" fi -if ! [ -r $PROCMAILDIR ]; then mkdir -p $PROCMAILDIR; fi - +# procmail is entirely generated +# so overwriting it won't hurt +act "Installing procmail scripts" +mkdir -p $PROCMAILDIR +cp -a share/procmail/* $PROCMAILDIR + +case `uname -s` in + Darwin) + mkdir -p $WORKDIR/bin + if [ -r build/osx ]; then + cp -a build/osx/* $WORKDIR/bin + fi + touch $HOME/.profile + cat $HOME/.profile | grep '^# Postino' > /dev/null + if [ $? != 0 ]; then + cat <<EOF >> $HOME/.profile +# Postino Installer addition on `date` +export PATH=$WORKDIR/bin:\$PATH +# Finished adapting your PATH +EOF + fi + ;; + Linux) + # TODO + ;; +esac + notice "Installation completed, now edit your personal settings:" -act "$WORKDIR/main.conf" - +act "$MAILDIR/Configuration.conf" +if [ `uname -s` = Darwin ]; then + open /Applications/TextEdit.app $MAILDIR/Configuration.txt +fi diff --git a/src/postino b/src/postino @@ -21,7 +21,7 @@ # Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. VERSION=0.6 -DATE=March/2011 +DATE=March/2012 POSTINOEXEC=$0 typeset -a OLDARGS for arg in ${argv}; do OLDARGS+=($arg); done @@ -32,7 +32,9 @@ for arg in ${argv}; do OLDARGS+=($arg); done QUIET=0 DEBUG=1 -# default config dir +source $HOME/Mail/Configuration.txt + +# default working dir if [ -z $POSTINO_DIR ]; then WORKDIR=$HOME/.postino else @@ -94,8 +96,8 @@ ask_password() { cat <<EOF | GTK2_RC_FILES=${GTK2_RC} pinentry 2>/dev/null | awk '/^D / { sub(/^D /, ""); print }' OPTION ttyname=$TTY OPTION lc-ctype=$LANG -SETTITLE Insert tomb password -SETDESC Open tomb: $1 +SETTITLE Type your password +SETDESC Open mail: $1 SETPROMPT Password: GETPIN EOF @@ -148,16 +150,16 @@ queue() { local msmtpfile; # add mails to the sendout queue - mkdir -p $MAILDIRS/queue + mkdir -p $MAILDIRS/outbox umask 077 - cd $MAILDIRS/queue || return 1 + cd $MAILDIRS/outbox || return 1 # Create new unique filenames of the form # MAILFILE: ccyy-mm-dd-hh.mm.ss[-x].mail # MSMTPFILE: ccyy-mm-dd-hh.mm.ss[-x].msmtp # where x is a consecutive number only appended if you send more than one # mail per second. base="`date +%Y-%m-%d-%H.%M.%S`" - echo "[$base] queue called with params: ${PARAM[@]}" > $WORKDIR/queue.log + func "[$base] queue called with params: ${PARAM[@]}" if [ -f "$base.mail" -o -f "$base.msmtp" ]; then tmp="$base" @@ -177,6 +179,30 @@ queue() { } +########### +# FETCHMAIL +fetch() { + # this function generates a fetchmail configuration and downloads emails + local -aU imap_set # behave like a set + imap_set="${IMAP_LOGIN};${IMAP_ADDRESS}" + for i in ${(f)imap_set}; do + ilogin="${i[(ws:;:)1]}" + ihost="${i[(ws:;:)2]}" + func "IMAP: $ilogin $ihost" + done + pass=`ask_password` + cat <<EOF > /tmp/fetch +poll $ihost with proto IMAP user "$ilogin" there with password "$pass" +fetchall and keep +ssl warnings 3600 and wants mda "procmail -m $PROCMAILDIR/rc" +antispam 571 550 501 554 +EOF + chmod 700 /tmp/fetch + fetchmail -f /tmp/fetch + srm -m /tmp/fetch + return 0 +} + ###### # SMTP send() { @@ -199,19 +225,14 @@ send() { peek() { # this function will open the MTA to the imap server without fetching mails locally local -aU imap_set #behave like a set; that is, an array with unique elements - imap_set="${IMAP_LOGIN};${IMAP_ADDRESS};${IMAP_PORT}" + imap_set="${IMAP_LOGIN};${IMAP_ADDRESS}" for i in ${(f)imap_set}; do ilogin="${i[(ws:;:)1]}" ihost="${i[(ws:;:)2]}" - iport="${i[(ws:;:)3]}" - func "IMAP: $ilogin $ihost:$iport" - # if there is a selection, check if its the one - if [ $1 ] && [ "$1" == "$iname" ]; then break; - elif ! [ $1 ]; then break; fi # no selection: take first as default + func "IMAP: $ilogin $ihost" done # escape at sign in login mutt -f imaps://`echo $ilogin | sed 's/@/\\@/'`@${ihost} - return 0 } sync() { @@ -234,6 +255,7 @@ sync() { maildirmake $MAILDIRS/priv maildirmake $MAILDIRS/postponed maildirmake $MAILDIRS/unsorted + mkdir -p $MAILDIRS/outbox ###### # MUTT @@ -271,7 +293,7 @@ EOF # just the header, will be completed later in procmail loop rm -f $WORKDIR/mutt/mboxes - echo -n "mailboxes +priv" > $WORKDIR/mutt/mboxes + echo -n "mailboxes +priv" > $MUTTDIR/mboxes fi ########## @@ -289,7 +311,7 @@ SHELL = /bin/sh # VERY IMPORTANT UMASK = 007 # James Bond :-) LINEBUF = 8192 # avoid procmail choke # Using Procmail Module Library http://sf.net/projects/pm-lib -PMSRC = /usr/share/procmail-lib +PMSRC = $PROCMAILDIR # Load the central initial startup code. INCLUDERC = $PMSRC/pm-javar.rc PF_DEST = "" # clear these vars @@ -330,7 +352,7 @@ EOF mv $WORKDIR/tmp/mboxes $MUTTDIR/mboxes rm -f $WORKDIR/tmp/mboxes - cat <<EOF >> $WORKDIR/procmail/rc + cat <<EOF >> $PROCMAILDIR/rc } # save the mails @@ -378,7 +400,6 @@ main() subcommands_opts[send]="" subcommands_opts[peek]="" subcommands_opts[sync]="" - subcommands_opts[conf]="" subcommands_opts[list]="" subcommands_opts[source]="" # subcommands_opts[mount]=${subcommands_opts[open]} @@ -444,11 +465,10 @@ main() case "$subcommand" in queue) queue ${PARAM} ;; - fetch) ;; + fetch) fetch ;; send) ;; peek) peek ;; sync) sync ;; - conf) ;; 'source') return 0 ;; __default) ;; *) error "command \"$subcommand\" not recognized"