diff options
| -rwxr-xr-x | bin/mail/deliver.sh | 79 |
1 files changed, 45 insertions, 34 deletions
diff --git a/bin/mail/deliver.sh b/bin/mail/deliver.sh index 4ed60ff..bd5bd82 100755 --- a/bin/mail/deliver.sh +++ b/bin/mail/deliver.sh | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | #! /bin/bash | 1 | #! /bin/bash |
| 2 | 2 | ||
| 3 | # Process each incoming mail | 3 | # Deliver incoming mail to proper mailbox |
| 4 | # TODO image/audio mail part | 4 | # TODO image/audio mail part |
| 5 | 5 | ||
| 6 | # message for logging delivery | 6 | # log each delivery {{{ |
| 7 | log=$(grep -rlE 'From:\s+<?MDA' ~/Maildir/cur | head -1) | 7 | log=$(grep -rlE 'From:\s+<?MDA' ~/Maildir/cur | head -1) |
| 8 | if [ -z $log ]; then | 8 | if [ -z $log ]; then |
| 9 | log=~/Maildir/cur/deliver.log | 9 | log=~/Maildir/cur/deliver.log |
| @@ -14,7 +14,8 @@ if [ -z $log ]; then | |||
| 14 | 14 | ||
| 15 | HEADER | 15 | HEADER |
| 16 | fi | 16 | fi |
| 17 | 17 | # }}} | |
| 18 | # shell opt/trap {{{ | ||
| 18 | exec 2>>$log | 19 | exec 2>>$log |
| 19 | shopt -s nocasematch extglob | 20 | shopt -s nocasematch extglob |
| 20 | 21 | ||
| @@ -25,8 +26,8 @@ trap 'doveadm force-resync ${mailbox:-/}' EXIT | |||
| 25 | tmp_mailbox=$(mktemp -d); mkdir -p ${tmp_mailbox}/{tmp,new,cur} | 26 | tmp_mailbox=$(mktemp -d); mkdir -p ${tmp_mailbox}/{tmp,new,cur} |
| 26 | cat >${tmp_mailbox}/cur/mail | 27 | cat >${tmp_mailbox}/cur/mail |
| 27 | trap 'rm -rf ${tmp_mailbox}' EXIT | 28 | trap 'rm -rf ${tmp_mailbox}' EXIT |
| 28 | 29 | # }}} | |
| 29 | # Restore mail into vars | 30 | # vars about message {{{ |
| 30 | MAIL="$(decodemail ${tmp_mailbox})" | 31 | MAIL="$(decodemail ${tmp_mailbox})" |
| 31 | # TODO process multi-line header field | 32 | # TODO process multi-line header field |
| 32 | header="$(<<<"$MAIL" sed '/^$/ q; /^[[:blank:]]/ d;')" | 33 | header="$(<<<"$MAIL" sed '/^$/ q; /^[[:blank:]]/ d;')" |
| @@ -36,8 +37,8 @@ body="$(<<<"$MAIL" sed -n '/^$/,$ p' | sed '1d')" | |||
| 36 | date=$(date --iso=seconds) | 37 | date=$(date --iso=seconds) |
| 37 | maildir=${HOME}/Maildir | 38 | maildir=${HOME}/Maildir |
| 38 | mailbox= | 39 | mailbox= |
| 39 | 40 | # }}} | |
| 40 | # Set set_stdout | 41 | # FUNCTION: Set set_stdout {{{ |
| 41 | set_stdout() { | 42 | set_stdout() { |
| 42 | filename=${Subject// /_} | 43 | filename=${Subject// /_} |
| 43 | path=${maildir}/${mailbox}${mailbox:+/}new/${date//:/}.${filename//[^[:alnum:]_]/} | 44 | path=${maildir}/${mailbox}${mailbox:+/}new/${date//:/}.${filename//[^[:alnum:]_]/} |
| @@ -45,12 +46,40 @@ set_stdout() { | |||
| 45 | 46 | ||
| 46 | exec 1>$path | 47 | exec 1>$path |
| 47 | } | 48 | } |
| 48 | 49 | # }}} | |
| 50 | # FUNCTION: print mail {{{ | ||
| 49 | print_mail() { | 51 | print_mail() { |
| 50 | echo "$MAIL" | 52 | if [ "$private" = true ]; then |
| 53 | <<-MAIL cat | ||
| 54 | From: me | ||
| 55 | Date: $(date --rfc-email) | ||
| 56 | Message-ID: ${Message_ID} | ||
| 57 | Self: true | ||
| 58 | Subject: ${heading} | ||
| 59 | |||
| 60 | $(sed 1d <<<"$body") | ||
| 61 | |||
| 62 | else | ||
| 63 | echo "$MAIL" | ||
| 64 | fi | ||
| 51 | } | 65 | } |
| 66 | # }}} | ||
| 67 | # FUNCTION: save as private message {{{ | ||
| 68 | private_message() { | ||
| 69 | heading="$(head -1 <<<"${body}")" | ||
| 70 | |||
| 71 | if [[ "${heading}" =~ ^"." ]]; then | ||
| 72 | mailbox=act | ||
| 73 | heading=${heading#.} | ||
| 74 | else | ||
| 75 | mailbox=box | ||
| 76 | fi | ||
| 52 | 77 | ||
| 53 | # save each field of header into vars | 78 | private=true |
| 79 | } | ||
| 80 | # }}} | ||
| 81 | |||
| 82 | # save each header field into vars {{{ | ||
| 54 | # TODO Use GNU MailUtils to save header | 83 | # TODO Use GNU MailUtils to save header |
| 55 | while read line; do | 84 | while read line; do |
| 56 | [[ "${line}" =~ ^" "|^" " ]] && ${field}+=" ${line##*( )}" && continue | 85 | [[ "${line}" =~ ^" "|^" " ]] && ${field}+=" ${line##*( )}" && continue |
| @@ -60,31 +89,12 @@ while read line; do | |||
| 60 | field="${field//-/_}" | 89 | field="${field//-/_}" |
| 61 | declare ${field}="${value}" | 90 | declare ${field}="${value}" |
| 62 | done <<<"$header" | 91 | done <<<"$header" |
| 63 | 92 | # }}} | |
| 64 | # save to mailbox | 93 | # decide mailbox by vars {{{ |
| 65 | if [[ "$SENDER" = pham@topo.tw && -n $CHAT_VERSION ]]; then | 94 | if [[ "$SENDER" = pham@topo.tw && -n $CHAT_VERSION ]]; then |
| 66 | heading="$(head -1 <<<"${body}")" | 95 | private_message |
| 67 | |||
| 68 | if [[ "${heading}" =~ ^"." ]]; then | ||
| 69 | mailbox=act | ||
| 70 | heading=${heading#.} | ||
| 71 | else | ||
| 72 | mailbox=box | ||
| 73 | fi | ||
| 74 | |||
| 75 | print_mail() { | ||
| 76 | <<-MAIL cat | ||
| 77 | From: me | ||
| 78 | Date: $(date --rfc-email) | ||
| 79 | Message-ID: ${Message_ID} | ||
| 80 | Self: true | ||
| 81 | Subject: ${heading} | ||
| 82 | |||
| 83 | $(sed 1d <<<"$body") | ||
| 84 | |||
| 85 | } | ||
| 86 | elif [[ "${TO}" =~ '+'|'=' ]]; then | 96 | elif [[ "${TO}" =~ '+'|'=' ]]; then |
| 87 | mailbox=${TO#*[+=]} # remove chars before symbol of mailbox | 97 | mailbox=${TO#*[+=]} # remove chars before symbol of mailbox |
| 88 | mailbox=${mailbox%@*} # remove suffix for mail address | 98 | mailbox=${mailbox%@*} # remove suffix for mail address |
| 89 | elif [[ "${FROM}${RETURN_PATH}" =~ notifications@github.com|noreply@github.com ]]; then | 99 | elif [[ "${FROM}${RETURN_PATH}" =~ notifications@github.com|noreply@github.com ]]; then |
| 90 | mailbox=DEV/github | 100 | mailbox=DEV/github |
| @@ -111,7 +121,7 @@ elif [[ "${SUBJECT}" =~ login|verify|sign-in|密碼|安全性警示|登入|存 | |||
| 111 | mailbox=login | 121 | mailbox=login |
| 112 | elif [[ "${TO}" = cloudflare@topo.tw ]]; then | 122 | elif [[ "${TO}" = cloudflare@topo.tw ]]; then |
| 113 | mailbox=SRV/cloudflare | 123 | mailbox=SRV/cloudflare |
| 114 | elif [[ | 124 | elif [[ |
| 115 | "${SUBJECT}" =~ 未讀|更新|核對表|嘟文|unread|summary|introduc || | 125 | "${SUBJECT}" =~ 未讀|更新|核對表|嘟文|unread|summary|introduc || |
| 116 | "${FROM}" =~ no-reply@hackmd.io \ | 126 | "${FROM}" =~ no-reply@hackmd.io \ |
| 117 | ]]; then | 127 | ]]; then |
| @@ -123,6 +133,7 @@ elif [[ | |||
| 123 | ]]; then | 133 | ]]; then |
| 124 | mailbox=MISC/promote | 134 | mailbox=MISC/promote |
| 125 | fi | 135 | fi |
| 136 | # }}} | ||
| 126 | 137 | ||
| 127 | # deliver mail to mailbox | 138 | # deliver mail to mailbox |
| 128 | set_stdout && print_mail | 139 | set_stdout && print_mail |