Hi Peter!
On Mi, 12 Feb 2014, Peter Davis wrote:
> I'm thinking of implementing a feature which allows a given keystroke
> to pipe a message to a perl script which, after a couple of prompts,
> adds a rule to my procmailrc or blacklist file to remove all future
> occurrences of such messages. The script would probably just ask me
> what part of the message to filter on (sender, subject keywords, etc.)
> and then add the rule(s).
>
> Has anyone already done this?
>
> I use mutt on my local MH store, but also on an IMAP server. Any ideas
> how to do this for IMAP?
Years ago I've written a simple shell script, that uses the score
functionality of mutt to ignore or filter unwanted messages from
different mailinglist. I added a macro, that will pipe the current
message to that shell script and generated a score statement that could
be read back by mutt. It can easily be improved by filtering for
subjects or whatever you like.
I don't use it anymore, but I still have it laying around. Here is the
relevant config:
,----[ ~/.mutt/macros.conf ]-
| # This macros calls an external shell script that will generate a
| # scoring value for the author of a message which in turn can be fed to
| # mutt
| # Depending on the Options given to the script, mutt will set mails
| # from that author read, or delete them or reset it
|
| macro index,pager <ESC>s "<enter-command>set wait_key=no<enter>\
| <pipe-message>~/bin/mutt_score.sh a <enter>\
| <enter-command>source ~/.mutt/score<enter>\
| <enter-command>set wait_key=yes<enter>" "Score author of message
interactively"
|
| macro index,pager <ESC>i "<enter-command>set wait_key=no<enter>\
| <pipe-message>~/bin/mutt_score.sh i <enter>\
| <enter-command>source ~/.mutt/score<enter>\
| <enter-command>set wait_key=yes<enter>" "Ignore future messages of author"
|
| macro index,pager <ESC>d "<enter-command>set wait_key=no<enter>\
| <pipe-message>~/bin/mutt_score.sh d <enter>\
| <enter-command>source ~/.mutt/score<enter>\
| <enter-command>set wait_key=yes<enter>" "Delete future messages of author"
|
| macro index,pager <ESC>r "<enter-command>set wait_key=no<enter>\
| <pipe-message>~/bin/mutt_score.sh r <enter>\
| <enter-command>source ~/.mutt/score<enter>\
| <enter-command>set wait_key=yes<enter>" "Reset scoring for author"
`----
,----[ ~/bin/mutt_score.sh ]-
| #!/bin/bash --
|
| # in which file to store the score_config
| CFG="/home/chrisbra/.mutt/score_gen"
|
| # contains the message in a variable
| STDIN="`cat`"
|
| #FROM=`echo ${STDIN}|formail -zx "From" |~/mimedecode |sed -e 's/,.*$//'
|tail -1`
| #FROM=`echo $STDIN`|formail -zx "To:"
| #while read line; do
| # echo $line|formail -zx"To:" |~/mimedecode|sed -e 's/,.*$//'
| #done
|
| # The sed statement will cut out only the relevant part from
| # the e-mail address between (e.g. for "Foo" <[email protected]> it
| # will only print foo\.bar@foobar\.xyz) and will also translate
| # allowed characters like "." or "+" by escaping them
| FROM=`echo "${STDIN}"|formail -tzx "From:" | sed
's/.*<//;s/>//;s/\./\\\\&/g;s/+/\\\\&/g'`
|
| # Record the date
| DATE=`date +%d.%m.%Y`
|
| function ignore(){
| MODE="score '~f \""$FROM"\"'\t=1\t # mark msg as read (score set on ${DATE})"
| echo -e "$MODE" >>"$CFG"
| }
| function delete(){
| MODE="score '~f \""$FROM"\"'\t=0\t # mark msg as deleted (score set on
${DATE})"
| echo -e "$MODE" >>"$CFG"
| }
|
| function interactive(){
| clear
| echo "What would you like to do with the author of the provided message?"
| echo "i)gnore messages from author"
| echo "d)elete messages from author"
| echo "u)ndo scoring messages from author"
| echo "q)quit"
| read input </dev/tty
| case "$input" in
| i) ignore; ;;
| d) delete; ;;
| u) undo; ;;
| q) exit 1; ;;
| esac
| }
|
| function help(){
| clear
| cat <<EOF
| NAME
|
| This script takes a message on stdin, determines the author
| and depending on the given parameter it will either set a score
| for ignoring/deleting messages from that author or reset the
| score for that author.
|
| SYNOPSIS
| `basename $0` [i|d|r|a|h]
|
| The following Options are supported
| i\tset score to ignore message from the author
| d\tset score to delete message from the author
| r\treset score for author
| a\tinteractive guide
| h\tdisplays this help screen
|
| The output will be a command so this script can be used from within mutt.
|
| EOF
| }
|
| function undo() {
| FROM=${FROM//\\/\\\\}
| sed -i -e "/"$FROM"/d" "$CFG"
| }
|
|
| case "$1" in
| i) SCORE=Y
| ignore;
| ;; # Author will be ignored (msg marked read)
| d) SCORE=Y
| delete;
| ;; # msgs from Author will be deleted
| r) SCORE=N
| undo;
| ;; # Author score will be reseted
| a) SCORE=Y
| interactive;
| ;; # interactive (ask what to do)
| *) SCORE=N
| help;
| ;; # display Help screen
| esac
`----
regards,
Christian
--
A man always remembers his first love with special tenderness, but after
that begins to bunch them.
-- Mencken